来自 TFDScript 的结果集?
Result Set from a TFDScript?
我发现了一些在 FlameRobin 中工作的代码 return 数据库中所有表的记录数,但我只能在 TFDScript 中 运行 它工作正常但没有结果集可以访问。
我在 TFDQuery 和 TFDCommand 中尝试了各种方法并查看了 TFDConnection,但它们都出现“无法解析对象 'set term'”错误,因为它们不期望脚本。
在搜索了 ages 之后,我无论如何都找不到从 TFDScript 访问结果的方法,尽管有一个提示它可以,因为它有一个 FetchOptions 属性。
我有下面的脚本,非常感谢任何指导。
set term !! ;
EXECUTE BLOCK
returns ( stm varchar(60), cnt integer )
as
BEGIN
for select cast('select count(*) from "'||trim(r.RDB$RELATION_NAME)||'"' as varchar(60))
from RDB$RELATIONS r
where (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null
order by 1
into :stm
DO
BEGIN
execute statement :stm into :cnt;
suspend;
END
END
我无法立即找到从 FDScript 获取结果集的方法。但是,使用配置为访问 Firebird 数据库的 FDQuery 获取结果集很简单,
最好通过 FDConnection。
将 TFDConnection 和 TFDQuery 放在新的 VCL 项目的窗体上。
向窗体添加 TDataSource 和 TDBGrid,并设置 TDataSource 的数据集
将 FDQuery1 和 DBGrid1 的 DataSource 设置为 DataSource1。将 DBGrid1 的宽度设置为 500
或更多。
将 FDQuery1 的 Sql.Text 设置为
EXECUTE BLOCK
returns ( stm varchar(60), cnt integer )
as
BEGIN
for select cast('select count(*) from "'||trim(r.RDB$RELATION_NAME)||'"' as varchar(60))
from RDB$RELATIONS r
where (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null
order by 1
into :stm
DO
BEGIN
execute statement :stm into :cnt;
suspend;
END
END
当然,这只是您引用的脚本内容,减去不需要的 Set Term ...
语句。
- 将 FDQuery1 的 Active 设置为 True,查询内容应出现在 DBGrid 中。
更新 我不确定你为什么会收到评论中提到的错误,因为上面的代码在 Delphi 西雅图对演示来说对我来说工作正常
Employee.FDB 数据库。如果该问题仍然存在,您可以使用下面的代码
自己生成必要的 Sql 并执行它。
procedure TForm2.btnGenSqlClick(Sender: TObject);
var
Sql : String;
TableName : String;
const
sGetTableNames = 'select r.RDB$RELATION_NAME from RDB$RELATIONS r where '#13#10 +
' (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null';
begin
FDQuery1.Open(sGetTableNames);
Sql := '';
while not FDQuery1.Eof do begin
TableName := FDQuery1.Fields[0].AsString;
if Sql <> '' then
Sql := Sql + #13#10' union ';
Sql := Sql + Format('select ''%0:s'', count(*) from %0:s', [TableName]);
FDQuery1.Next;
end;
FDQuery1.Open(Sql);
end;
注意:如果您不熟悉它,结构 %0:s
的意思是“替代
const 数组中第一个值的值传递给 Format'。我用它在相同的格式表达式中两次替换 TableName 值。
我发现了一些在 FlameRobin 中工作的代码 return 数据库中所有表的记录数,但我只能在 TFDScript 中 运行 它工作正常但没有结果集可以访问。
我在 TFDQuery 和 TFDCommand 中尝试了各种方法并查看了 TFDConnection,但它们都出现“无法解析对象 'set term'”错误,因为它们不期望脚本。
在搜索了 ages 之后,我无论如何都找不到从 TFDScript 访问结果的方法,尽管有一个提示它可以,因为它有一个 FetchOptions 属性。
我有下面的脚本,非常感谢任何指导。
set term !! ;
EXECUTE BLOCK
returns ( stm varchar(60), cnt integer )
as
BEGIN
for select cast('select count(*) from "'||trim(r.RDB$RELATION_NAME)||'"' as varchar(60))
from RDB$RELATIONS r
where (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null
order by 1
into :stm
DO
BEGIN
execute statement :stm into :cnt;
suspend;
END
END
我无法立即找到从 FDScript 获取结果集的方法。但是,使用配置为访问 Firebird 数据库的 FDQuery 获取结果集很简单, 最好通过 FDConnection。
将 TFDConnection 和 TFDQuery 放在新的 VCL 项目的窗体上。
向窗体添加 TDataSource 和 TDBGrid,并设置 TDataSource 的数据集 将 FDQuery1 和 DBGrid1 的 DataSource 设置为 DataSource1。将 DBGrid1 的宽度设置为 500 或更多。
将 FDQuery1 的 Sql.Text 设置为
EXECUTE BLOCK
returns ( stm varchar(60), cnt integer )
as
BEGIN
for select cast('select count(*) from "'||trim(r.RDB$RELATION_NAME)||'"' as varchar(60))
from RDB$RELATIONS r
where (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null
order by 1
into :stm
DO
BEGIN
execute statement :stm into :cnt;
suspend;
END
END
当然,这只是您引用的脚本内容,减去不需要的 Set Term ...
语句。
- 将 FDQuery1 的 Active 设置为 True,查询内容应出现在 DBGrid 中。
更新 我不确定你为什么会收到评论中提到的错误,因为上面的代码在 Delphi 西雅图对演示来说对我来说工作正常 Employee.FDB 数据库。如果该问题仍然存在,您可以使用下面的代码 自己生成必要的 Sql 并执行它。
procedure TForm2.btnGenSqlClick(Sender: TObject);
var
Sql : String;
TableName : String;
const
sGetTableNames = 'select r.RDB$RELATION_NAME from RDB$RELATIONS r where '#13#10 +
' (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null';
begin
FDQuery1.Open(sGetTableNames);
Sql := '';
while not FDQuery1.Eof do begin
TableName := FDQuery1.Fields[0].AsString;
if Sql <> '' then
Sql := Sql + #13#10' union ';
Sql := Sql + Format('select ''%0:s'', count(*) from %0:s', [TableName]);
FDQuery1.Next;
end;
FDQuery1.Open(Sql);
end;
注意:如果您不熟悉它,结构 %0:s
的意思是“替代
const 数组中第一个值的值传递给 Format'。我用它在相同的格式表达式中两次替换 TableName 值。