Ric*_*tor 3 database delphi design-patterns firedac
Firedac库集中了数据库行为,并且有许多方法可以正常工作而无需关心数据库类型.实际上,对于大多数常见数据库使用本机驱动程序,Firedac隐藏了语法上的细微差别,允许非常灵活地更改数据库平台.
例如,生成器和autoinc字段很容易检测,CAST和参数工作正常,允许在数据库之间轻松迁移.
如何使用Firedac power来创建新表而无需实例化运行SQL脚本的FDQuery CREATE TABLE?
我希望创建任何Object,并为每个Object Field调用特定的FieldByName,将其记录在数据库中,但首先我需要证明:
到目前为止,这是我的代码:
TRecCustomer = record
Id:integer;
Name:String;
Birthday:TDate;
end;
ICustomer = interface
procedure setCustomerId(Value: Integer);
procedure setCustomerName(Value: String);
procedure SetBirthday(Value: TDate);
procedure Post;
end;
TCustomer = class(TInterfacedObjet, ICustomer)
CustomerObject=TRecCustomer;
procedure setCustomerId(Value: Integer);
procedure setCustomerName(Value: String);
procedure SetBirthday(Value: TDate);
procedure Post;
end;
procedure TCustomer.Post;
begin
if not TableExists('Customer') then CreateTable('Customer');
if not FieldExists('Name') then CreateField('Customer','name',ftString,[],40);
if not FieldExists('Id') then CreateField('Customer','Id',ftInteger,[cAutoInc,cNotNull]);
if not FieldExists('Birthday') then CreateField('Customer','birthday',ftDate);
end;
Run Code Online (Sandbox Code Playgroud)
想象一下程序
CreateTable(Tablename: String)
CreateField(FieldName: String; FieldType: TDataType; Constraints: TConstraints; Length: Integer = 0);
Run Code Online (Sandbox Code Playgroud)
哪里
TConstraints = set of (cAutoInc, cNotNull, cUnique, cEtc);
Run Code Online (Sandbox Code Playgroud)
我可以为特定的数据库执行此操作,例如Sqlite或Firebird,但我不知道要使用Firedac资源为任何数据库做什么.
我发现FireDAC.Comp.Client.TFDTable.CreateTable(ARecreate: Boolean = True; AParts: TFDPhysCreateTableParts = [tpTable .. tpIndexes]),@ Ondrej Kelle建议,但我不明白AParts用法.有人有一个例子吗?http://docwiki.embarcadero.com/Libraries/Berlin/en/FireDAC.Comp.Client.TFDTable.CreateTable
非常感谢.
您可以创建TFDTable对象,至少通过指定TableName并在FieldDefs集合中添加字段定义来描述您的表.在实践中,您通常还会为某个字段创建主键索引(这可以通过AddIndex方法完成).描述表后,调用CreateTable方法.最小的例子可以是:
var
Table: TFDTable;
begin
Table := TFDTable.Create(nil);
try
Table.Connection := FDConnection1;
{ specify table name }
Table.TableName := 'MyTable';
{ add some fields }
Table.FieldDefs.Add('ID', ftInteger, 0, False);
Table.FieldDefs.Add('Name', ftString, 50, False);
{ define primary key index }
Table.AddIndex('pkMyTableID', 'ID', '', [soPrimary]);
{ and create it; when the first parameter is True, an existing one is dropped }
Table.CreateTable(False);
finally
Table.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2071 次 |
| 最近记录: |