Как добавить все поля без открытия набора данных? - PullRequest
0 голосов
/ 30 августа 2018

Я использую 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.

1 Ответ

0 голосов
/ 30 августа 2018

Я сделал это, вызвав 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;
...