Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Object Model İle SQL İşlemleri Yaptırma
#1
Herkese merhaba,

Bayadır bişiler yapmıyordum Delphi ile ilgili. Bu aralar eski denemelerime bakarken paylaşmak istediğim ama sonrasında unuttuğum küçük bir test projem vardı. Object,RTTI ve SQLBuild ile ORM nin çok temel düzeydeki bir örneğini denemiştim. Denememi bugün tekrar gözden geçirdim ve test ettim buradan da paylaşayım dedim.

Olayı anlatmak gerekirse. Paylaştığım projemde yapmaya çalıştığım şey çoğu kişinin artık aşina olduğu veritabanı tablosunun bir benzerini object olarak Delphide oluşturup. Bu obje üzerinden veritabanı işlemlerini yaptırmak. Benim yaptığım projede veritabanı işlemleri yapılmıyor. Ben projemde bu işlemleri yaptıran SQL kodlarını oluşturmaya çalıştım. Yani Objem var ve bu objemin özelliklerini doldurup veritabanı işlemini yaptıracak SQL'i oluşturtuyorum.

Bunun için Attribute,RTTI ve ClassHelper kullandım.

Attributeler:
  DCTableAttribute = class(TCustomAttribute)
   private
     FTableName : string;
   public
     constructor Create(const TableName: string);
     property TableName: string read FTableName write FTableName;
 end;

 DCFieldAttribute = class(TCustomAttribute)
   private
     FFieldName: string;
     FDescription: string;
     FDataType: TFieldDataType;
     FMandatory: Boolean;
     FSize: Integer;
     FPK: Boolean;
   public
     constructor Create(const FieldName: string='';const Description :string ='';
           const DataType:TFieldDataType=fdString;const Size:integer=6;
           const PK : Boolean = False; const Mandatory:Boolean=False);
     property PK : Boolean read FPK write FPK;
     property FieldName: string read FFieldName write FFieldName;
     property Description: string read FDescription write FDescription;
     property DataType: TFieldDataType read FDataType write FDataType;
     property Size: Integer read FSize write FSize;
     property Mandatory: Boolean read FMandatory write FMandatory;
 end;


2 temel attribute tanımladım. Table ve Field verilerini almak için objeden.

SQL Oluşturucu:
  TDCSQLState = (smInsert,smUpdate,smDelete,smSelect);

 TDelphicanMsSQLText = class
   private
     FSQLText : string;
     FValuesDictionary : TDictionary<String, Variant>;
     FWheresDictionary : TDictionary<String, Variant>;
     FColumnList : TList<string>;
     FSQLState: TDCSQLState;
     FSelect : string;
     function AddValues(const Col: string;
     const Val: Variant): TDelphicanMsSQLText;
     function GetSQLText: string;
     function AddWhere(const Col: string;
     const Val: Variant): TDelphicanMsSQLText;
     function AddColumns(const Col: string): TDelphicanMsSQLText;
   public
     constructor Create;
     destructor Destroy();

     function Table(s:string):TDelphicanMsSQLText;
     function Insert:TDelphicanMsSQLText;
     function Update:TDelphicanMsSQLText;
     function Delete:TDelphicanMsSQLText;
     function Select:TDelphicanMsSQLText;overload;

     function Select(s:string):TDelphicanMsSQLText;overload;

     property Values[const Col: string;const Val : Variant]:TDelphicanMsSQLText read AddValues;default;
     property Where[const Col: string;const Val : Variant]:TDelphicanMsSQLText read AddWhere;
     property Column[const Col: string]:TDelphicanMsSQLText read AddColumns;
   published
     property AsString:string read GetSQLText;
     property State : TDCSQLState read FSQLState write FSQLState;
 end;


SQLleri oluşturmak için bir class tanımladım. Bu class çok vasat oldu. Sadece hızlıca oluşturabilmek için yoksa piyasada çok güzel SQLBuilderlar mevcut.

Base Model Class:
  TBaseModel = class
   private
   public
     function Insert():string;
     function Update():string;
     function Delete():string;

     function Select(Entry:Integer):string;
     procedure Assign(Model:TBaseModel);
 end;


Veritabanı SQL leri için temel bir class oluşturdum. Bunların dışında string, variant ve attribute için class helperlar oluşturdum.

Olayın özü şu BaseModel den türettiğim veritabanı tablosu modeline Table ve Field attributelerimi veriyorum. Daha sonrada Bu attributer ve Model içindeki verilerle SQL imi oluşturuyorum. Bunuda ilgili bağlantıya execute ediyorum. ADO,UDAC,FDAC hangisi olursa. SQL örneği olarak sadece MsSQL için SQL oluşturucu yazdım fakat siz diğer veritabanları için de türetebilirsiniz. 

Örnek Görünüm:
EDEPOg.gif

İndirme: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. : Yandex Disk


Belki sonra GitHub da koyarım. Örnek projede yakın zamanda koymayı düşünüyorum.
WWW
Cevapla
#2
Paylaşımın için teşekkürler +puan
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#3
Teşekkürler.
Cevapla
#4
Fikir olarak paylaşayım.Belki özellik olarak eklersiniz.Yine attribute'ler yardımı ile model'in alanlarını kontrol ettirebilirsiniz.
Örneğin;
  
.
.   
[TMaxLength(11)]
[TRequired()]
property Phone: Integer read FPhone write FPhone;

Model'i veritabanına kayıt etmeden önce, alanların üzerlerindeki attribute'lere göre kontrol ettirip bir sonuç döndürebilirsiniz. Sözde  kod;
unit Controller;

interface

uses
 Attributes,
 BaseModel,
 Rtti;

type
 TValidationResult = class
  // to do
 end;


 TController = class
 protected
   function Validate(AModel: TBaseModel): TValidationResult;
 end;


implementation


{ TController }
function TController.Validate(AModel: TBaseModel): TValidationResult;
begin
 // to do
end;

end.



unit UserController;

interface

uses
 Attributes,
 BaseModel,
 Controller,
 Rtti,
 Users;

type

 TUserController = class(TController)
 public
   procedure Insert(AUser: TUsers);
 end;

implementation

{ TUserController }
procedure TUserController.Insert(AUser: TUsers);
begin
 Validate(AUser);
end;

end.
WWW
Cevapla
#5
Github projesine dönüştürürsem dediğiniz eklemeleri de yapmaya çalışıcam. Teşekkür ederim bilgi için.
WWW
Cevapla
#6
(31-05-2018, Saat: 10:38)witalihakko Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Github projesine dönüştürürsem dediğiniz eklemeleri de yapmaya çalışıcam. Teşekkür ederim bilgi için.

Selam, Git deki proje derlerken hem XE7 de hem de XE10 da asagidaki hatayi veriyor bir önerin olabilir mi?

getimage.ashx?img=10077483
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Küçük Hızlandırma İşlemleri narkotik 14 1.887 13-12-2018, Saat: 18:56
Son Yorum: narkotik
  FireMonkey Resimlerde Pan ve Zoom İşlemleri Fesih ARSLAN 11 2.774 16-04-2018, Saat: 12:04
Son Yorum: pro_imaj
  SGK Evrak Doküman İşlemleri, Belge Gönderme csunguray 3 1.087 21-02-2018, Saat: 14:06
Son Yorum: csunguray



Konuyu Okuyanlar: 1 Ziyaretçi