【问题标题】:Delphi FireDAC error when loading SQLite3.dll加载 SQLite3.dll 时出现 Delphi FireDAC 错误
【发布时间】:2020-10-13 13:35:27
【问题描述】:

我已经从 SQLite Download Page 下载了最新的 SQLite.dll 并尝试使用 TFDPhysDriverLink.VendorLib 加载它

但是当我运行应用程序时,其中包含以下代码:

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDConnection1.Close;
  FDPhysSQLiteDriverLink1.Release;
  FDPhysSQLiteDriverLink1.VendorLib:= 'Path\SQLite3.dll';
  FDQuery1.Open('SELECT *, ROW_NUMBER() OVER() Col FROM TableName');
end;

它抛出:

[FireDAC][Phys][SQLite] 错误:“(”附近:语法错误

这意味着无法识别窗口函数ROW_NUMBER()

  • 我做错了什么?
  • 如何强制 FireDAC 使用最新的 SQLite.dll?

【问题讨论】:

  • 您是否查看了文档以查看 SQLite 是否完全支持该语法?如果是这样,我相信是 OVER() 导致了这个问题。
  • SELECT *, ROW_NUMBER() OVER() Col FROM TableName 肯定不是有效的 SQL。
  • SELECT *, ROW_NUMBER() OVER (ORDER BY Col) FROM TableName 怎么样?见Built-in Window Functions
  • 不,SELECT *, ROW_NUMBER() OVER() Col FROM TableName 是有效的 SQL @ArnaudBouchez,甚至 SELECT *, ROW_NUMBER() OVER( ORDER BY ColumnName) Col FROM TableName 也不起作用
  • 看来你得重新编译FireDAC,真的很蹩脚。请参阅Firedac not recognizing new ALTER feature in sqlite3 的回复。

标签: sqlite delphi firedac delphi-10-seattle


【解决方案1】:

SQLite 不支持 ROW_NUMBER。 查看this question 的答案,您可能会找到可以替换ROW_NUMBER 的内容。

【讨论】:

【解决方案2】:

如果您收到此错误,则表明 SQlite3.dll 已正常加载。

只需使用RowID 字段,该字段始终存在于任何标准 SQLite3 表中 - 除非您使用 CREATE TABLE WITHOUT ROWID 语句显式创建它们。

所以我只想写:

 FDQuery1.Open('SELECT *, RowID FROM TableName');

请注意,如果您的表中有明确的INTEGER PRIMARY KEY 列,它实际上会映射内部的RowID 列。检查 the SQLite3 documentation 了解其工作原理。

【讨论】:

  • 不,我不想使用ROWID,而是想使用窗口函数。 ROW_NUMBER() OVER() 只是窗口函数的一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多