【问题标题】:ON CONFLICT(id) DO UPDATE SET does not work for FireDAC in DELPHI 10.3.1ON CONFLICT(id) DO UPDATE SET 不适用于 DELPHI 10.3.1 中的 FireDAC
【发布时间】:2023-03-10 20:21:02
【问题描述】:

附加第二个数据库后,我尝试使用 ON CONFLICT(id) DO UPDATE 在第一个数据库的表中插入和更新数据。字段 id 是第一个表的主键。

  FDQuery1.EXECSQL('ATTACH ''D:\Update2019.DB'' AS DBUpdate');

  FDQuery1.SQL.Text:=
    'INSERT INTO acts (id,title) SELECT id,title FROM DBUpdate.acts'+
    '   WHERE (DBUpdate.acts.id >100)'+
    '   ON CONFLICT(id) DO UPDATE SET'+
    '   title=excluded.title;'
  FDQuery1.ExecSQL;

我收到错误消息:““ON”附近的错误:语法错误” 当我删除 WHERE (DBUpdate.acts.id >100 条件 错误消息为:““DO”附近的错误:语法错误”。

同样的查询在 SQLITESTUDIO 中也能正常工作。

【问题讨论】:

标签: sqlite delphi firedac delphi-10.3-rio


【解决方案1】:

正如 cmets 中正确指出的那样,您的应用程序使用的 SQLite 不支持此语法。您将需要使用更新版本的 SQLite。为此,请遵循 FireDAC SQLite connection 主题的 动态链接 段落,否则 Delphi 会使用与它一起分发的版本的静态链接 SQLite 对象构建您的 FireDAC 应用程序(这会使您的应用程序依赖于此类 SQLite 版本)不管周围有什么 SQLite DLL)。

不要忘记这项任务中最重要的部分;修改 FireDAC.inc 包含文件以使用动态链接。如果您不想破坏您的 Delphi 安装源文件夹,请将所有 FireDAC 模块复制到其他地方,将它们添加到项目的构建搜索路径中,然后修改 FireDAC.inc 包含文件在那里。

【讨论】:

  • 感谢 TLama。我没有使用动态链接。 “注意:SQLite 数据库加密仅支持静态链接。”。所以我必须找到另一种解决方案,而不是“插入 ... ON CONFLICT(id) DO”
猜你喜欢
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2023-02-04
  • 2018-09-10
相关资源
最近更新 更多