首页 > 解决方案 > 如何在不打开数据集的情况下添加所有字段?

问题描述

我正在使用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 查询。

标签: delphidatasetfibplus

解决方案


我通过调用并从列表中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;

推荐阅读