来自tfdscript的结果集?

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

我在flamerobin中找到了一些代码,可以返回数据库中所有表的记录数,但我只能在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
2lpgd968

2lpgd9681#

我无法立即找到从fdscript获取结果集的方法。但是,使用配置为访问firebird数据库的fdquery获取结果集很简单,最好是通过fdconnection。
将tfdconnection和tfdquery放在新vcl项目的窗体上。
将tdatasource和tdbgrid添加到表单中,tdatasource的dataset设置为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 seattle中对demo 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 passes数组中第一个值的值替换为format”。我用它在同一个格式表达式中两次替换tablename值。

相关问题