如何在不打开数据集的情况下添加所有字段?

How to add all fields without opening dataset?

我正在使用 TFIBDataSet(Firebird 数据集组件)并且我正在尝试在运行时自动创建所有字段,而不是将任何记录加载到数据集中。

这是我的测试代码:

uses
  FIBDatabase, FIBDataSet, Dialogs;

...

var
  Db : TFIBDataBase;
  Tr : TFIBTransaction;
  Dst : TFIBDataSet;
begin
  //connection
  Db := TFIBDatabase.Create(Self);
  Db.ConnectParams.UserName := 'SYSDBA';
  Db.ConnectParams.Password := 'masterkey';
  Db.DatabaseName := 'localhost:mydatabase.fdb';
  Db.SQLDialect := 3;
  Db.Connected := True;

  //transaction
  Tr := TFIBTransaction.Create(Self);
  Tr.DefaultDatabase := Db;
  Tr.Active := True;

  //dataset
  Dst := TFIBDataSet.Create(Self);
  Dst.Database := Db;
  Dst.Transaction := Tr;
  Dst.SelectSQL.Text := 'SELECT * FROM rdb$database';

  //...

  ShowMessage(IntToStr(Dst.FieldCount));
end;

前面的代码产生 '0' 作为输出..

我试过使用 Dst.Open() 并生成 '5',但它也执行 SQL 查询。

我通过调用 FieldDefs.Update 并从 FieldDefs 列表中创建字段来做到这一点。

uses
  FIBDatabase, FIBDataSet, Dialogs;

...

var
  Db : TFIBDataBase;
  Tr : TFIBTransaction;
  Dst : TFIBDataSet;
  I : integer;
begin
  //connection
  Db := TFIBDatabase.Create(Self);
  Db.ConnectParams.UserName := 'SYSDBA';
  Db.ConnectParams.Password := 'masterkey';
  Db.DatabaseName := 'localhost:mydatabase.fdb';
  Db.SQLDialect := 3;
  Db.Connected := True;

  //transaction
  Tr := TFIBTransaction.Create(Self);
  Tr.DefaultDatabase := Db;
  Tr.Active := True;

  //dataset
  Dst := TFIBDataSet.Create(Self);
  Dst.Database := Db;
  Dst.Transaction := Tr;
  Dst.SelectSQL.Text := 'SELECT * FROM rdb$database';

  //create fields
  Dst.FieldDefs.Update();
  for I := 0 to Dst.FieldDefs.Count - 1 do
    Dst.FieldDefs[I].CreateField(Dst);

  ShowMessage(IntToStr(Dst.FieldCount));
end;