delphi - 如何在不打开数据集的情况下添加所有字段?
问题描述
我正在使用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;
推荐阅读
- angular - 具有 ControlValueAccessor 的递归 Angular 表单运行速度极慢
- c# - 使用 NTwain 从进纸器扫描文档
- python - 时间复杂度——无法确定是 logn 还是 sqrt n
- spring-boot - 如何使用Springboot在mysql中将1映射到M函数
- java - 当我尝试从 admob 显示奖励视频广告时应用程序崩溃
- python-3.x - 如何使用 selenium 从内部 li 中提取文本
- python - Python如何使用tensorflow-cpu
- java - 使用短信验证时无法更改文档签名
- django - 如何在 Django 中向另一个用户发送通知
- c# - 如何在 .net/c# 中最好地找到写入调试输出的内容