使用没有SQL脚本的firedac创建表

Ric*_*tor 3 database delphi design-patterns firedac

Firedac库集中了数据库行为,并且有许多方法可以正常工作而无需关心数据库类型.实际上,对于大多数常见数据库使用本机驱动程序,Firedac隐藏了语法上的细微差别,允许非常灵活地更改数据库平台.
例如,生成器和autoinc字段很容易检测,CAST和参数工作正常,允许在数据库之间轻松迁移.

如何使用Firedac power来创建新表而无需实例化运行SQL脚本的FDQuery CREATE TABLE

我希望创建任何Object,并为每个Object Field调用特定的FieldByName,将其记录在数据库中,但首先我需要证明:

  1. 如果已创建表
  2. 如果已创建字段
  3. 如果已创建记录

到目前为止,这是我的代码:

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

非常感谢.

Vic*_*ria 6

您可以创建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)