31-05-2018, Saat: 00:34
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:
2 temel attribute tanımladım. Table ve Field verilerini almak için objeden.
SQL Oluşturucu:
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:
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:
İndirme: Buradan : Yandex Disk
Belki sonra GitHub da koyarım. Örnek projede yakın zamanda koymayı düşünüyorum.
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:
İndirme: Buradan : Yandex Disk
Belki sonra GitHub da koyarım. Örnek projede yakın zamanda koymayı düşünüyorum.