【问题标题】:FireDAC SQLITE : No such table column :PRAGMA_TABLE_INFOFireDAC SQLITE:没有这样的表列:PRAGMA_TABLE_INFO
【发布时间】:2019-11-01 15:22:50
【问题描述】:

我正在使用 delphi rio 10.3 和 fireac sqlite3 构建应用程序

pragma 函数无法与“SELECT COMMAND”一起使用,如下所示:

procedure Tamdf.Button31Click(Sender:TObject);
begin
   MyFDQuery.Open('SELECT name FROM PRAGMA_table_info("DOCM")');
   ShowMessage(MyFDQuery.Fields[0].AsString);
end;

我收到错误消息:“错误:没有这样的表列:PRAGMA_table_info.name” 我做错了什么?

【问题讨论】:

  • 您是否尝试过执行“SELECT * from ...”并查看返回的列名实际上是什么?
  • 列名是真的他的名字是"name" put no rsult return just error message 我在'DB BROWSER FOR SQLITE'程序中尝试了同一行,它工作正常,没有错误消息

标签: delphi firedac


【解决方案1】:

以下代码在包含“MyTable”表的 Sqlite 数据库上运行良好。我不确定您使用的 SQL 是否适合在 FireDAC 中使用

procedure TForm3.Button1Click(Sender: TObject);
begin
  if FDQuery1.Active then
    FDQuery1.Close;
  FDQuery1.Open('PRAGMA Table_Info(''MyTable'')');
end;

返回

 cid    name
 0       ID
 1       NAME

如果不出意外,您可以使用 FireDAC 的 LocalSQL 从返回的结果集中提取 Name

我看看能否让 SELECT 与 PRAGMA 查询一起工作......

此查询在 FireFox 的 Sqlite Manager 插件中运行良好

select * from PRAGMA_table_info('mytable')

但返回错误

没有这样的表:PRAGMA_Table_Info'。

当被 FDQuery1 执行时。

【讨论】:

  • FDQuery1.Open('PRAGMA Table_Info(''MyTable'')');在 FIREDAC 中可以正常工作,但 FDQuery.Open('SELECT name FROM PRAGMA_table_info("DOCM")');出现错误
  • SQLite 的列元数据描述函数sqlite3_table_column_metadata 对于此类 SQL 命令失败。问题是没有这样的表pragma_table_info,因此没有这样的列来描述并且SQLite返回失败(然后FireDAC传播)。但是这个表名是由 SQLite 在为准备好的语句调用 sqlite3_column_table_name 时描述的,所以我称之为 SQLite 的问题(他们说,这是 Bob,当我们尝试更多地了解 Bob 时,他们说他们不知道。不知道这个名字的任何人)。
  • 我找出了问题所在,FIREDAC 的问题它不直接接受带有 SELECT 语句的 SQLITE3 函数,在上面尝试我的代码返回错误但@branko 的代码工作正常而没有错误,我尝试我在 DB BROWSER 程序中的代码:它工作正常且直接
  • FireDAC 可能对查询函数调用返回的结果集的命令(例如SELECT TheColumn FROM TheFunction())有一个后备。 SQLite 现在向 FireDAC 描述了 TheFunction 这样的语句表名称,FireDAC 后来向 SQLite 询问此类表的元数据(由于它是一个函数,而不是表,所以它不存在)。如果获取 DB 列元数据失败,FireDAC 可能会要求提供语句列元数据。
  • @TLama:谢谢,这听起来很合理,我注意到在检索和使用元数据方面,FD 比其他库做得更好。如果这是 SqlServer,我只需启动 SSMS 的分析器并查看实际发送到服务器的内容,但我对 FD 和 Sqlite 还不够熟悉,不知道如何做类似的事情。当我有一个小时的空闲时,我会尝试查找它。
【解决方案2】:

使用 FireDAC,您可以使用创建临时表“table_info”的解决方法:

MyFDQuery.Open(
  'DROP TABLE IF EXISTS table_info;' +
  'CREATE TEMPORARY TABLE table_info AS SELECT * FROM pragma_table_info("DOCM");' + 
  'SELECT name FROM table_info');

编辑

我的环境:Delphi 10.3.2 Rio,Win32,默认 SQLite 3.28.0 静态链接。无特殊设置。

连接 - TFDConnection 仅:

FDConnection1.Params.DriverID := 'SQLite';
FDConnection1.Params.Database := 'D:\TMP\TEST.db';

【讨论】:

  • 对我来说,这会返回与我的答案中引用的相同的错误。不知道是不是Sqlite版本特有的问题?
  • @MartynA - 它工作正常,没有错误。 Delphi 10.3 Rio,SQLite 3.28.0(默认静态链接)。它在其他 sqlite 浏览器(SQLiteSpy,...)中也能正常工作。
  • 嗯,我正在使用西雅图,刚刚下载了 v.3.30.1 并且仍然得到相同的结果 - 在 FF Sqlite 管理器中工作正常,我在 FireDAC 中引用了同样的错误。好奇...
  • @Branko Tank 的答案,但它在 fireac 中返回相同的错误
  • @MartynA - 我尝试 SQLITE V 3.28 并尝试 V 3.30 与 FIREDAC 的问题是相同的错误
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 2013-03-07
  • 2022-01-05
  • 2020-06-02
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多