代码之家  ›  专栏  ›  技术社区  ›  Fabrizio RAHUL S R

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

  •  0
  • Fabrizio RAHUL S R  · 技术社区  · 6 年前

    我在用 TFIBDataSet

    以下是我的测试代码:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Fabrizio RAHUL S R    6 年前

    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;