来自tfdscript的结果集?

4xrmg8kj  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(399)

我在flamerobin中找到了一些代码,可以返回数据库中所有表的记录数,但我只能在tfdscript中运行它,该脚本工作正常,但没有可访问的结果集。
我在tfdquery和tfdcommand中尝试了各种方法,并查看了tfdconnection,但它们都出现了错误“无法分析对象”set term“”,因为它们不需要脚本。
在搜索了ages之后,我找不到任何从tfdscript访问结果的方法,尽管有一个提示它可以,因为它有一个fetchoptions属性。
我有下面的脚本,并将感谢任何指导。

  1. set term !! ;
  2. EXECUTE BLOCK
  3. returns ( stm varchar(60), cnt integer )
  4. as
  5. BEGIN
  6. for select cast('select count(*) from "'||trim(r.RDB$RELATION_NAME)||'"' as varchar(60))
  7. from RDB$RELATIONS r
  8. where (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null
  9. order by 1
  10. into :stm
  11. DO
  12. BEGIN
  13. execute statement :stm into :cnt;
  14. suspend;
  15. END
  16. END
2lpgd968

2lpgd9681#

我无法立即找到从fdscript获取结果集的方法。但是,使用配置为访问firebird数据库的fdquery获取结果集很简单,最好是通过fdconnection。
将tfdconnection和tfdquery放在新vcl项目的窗体上。
将tdatasource和tdbgrid添加到表单中,tdatasource的dataset设置为fdquery1,dbgrid1的datasource设置为datasource1。将dbgrid1的宽度设置为500或更大。
将fdquery1的sql.text设置为

  1. EXECUTE BLOCK
  2. returns ( stm varchar(60), cnt integer )
  3. as
  4. BEGIN
  5. for select cast('select count(*) from "'||trim(r.RDB$RELATION_NAME)||'"' as varchar(60))
  6. from RDB$RELATIONS r
  7. where (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null
  8. order by 1
  9. into :stm
  10. DO
  11. BEGIN
  12. execute statement :stm into :cnt;
  13. suspend;
  14. END
  15. END

当然,这只是你引用的剧本的内容,减去 Set Term ... 声明,这是不需要的。
将fdquery1的active设置为true,查询内容应该出现在dbgrid中。
更新我不知道你为什么会得到你的评论中提到的错误,因为上面的代码在delphi seattle中对demo employee.fdb数据库运行良好。如果问题仍然存在,您可以使用下面的代码自己生成必要的sql并执行它。

  1. procedure TForm2.btnGenSqlClick(Sender: TObject);
  2. var
  3. Sql : String;
  4. TableName : String;
  5. const
  6. sGetTableNames = 'select r.RDB$RELATION_NAME from RDB$RELATIONS r where '#13#10 +
  7. ' (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) and r.RDB$VIEW_BLR is null';
  8. begin
  9. FDQuery1.Open(sGetTableNames);
  10. Sql := '';
  11. while not FDQuery1.Eof do begin
  12. TableName := FDQuery1.Fields[0].AsString;
  13. if Sql <> '' then
  14. Sql := Sql + #13#10' union ';
  15. Sql := Sql + Format('select ''%0:s'', count(*) from %0:s', [TableName]);
  16. FDQuery1.Next;
  17. end;
  18. FDQuery1.Open(Sql);
  19. end;

注意:如果您不熟悉它,构造 %0:s 表示“将const passes数组中第一个值的值替换为format”。我用它在同一个格式表达式中两次替换tablename值。

展开查看全部

相关问题