Как добавить все поля без открытия набора данных?
Я использую 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 ответ
Я сделал это по телефону 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;