来自 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。

  1. 将 TFDConnection 和 TFDQuery 放在新的 VCL 项目的窗体上。

  2. 向窗体添加 TDataSource 和 TDBGrid,并设置 TDataSource 的数据集 将 FDQuery1 和 DBGrid1 的 DataSource 设置为 DataSource1。将 DBGrid1 的宽度设置为 500 或更多。

  3. 将 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 ... 语句。

  1. 将 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 值。