【问题标题】:Why am I getting this syntax logic error?为什么我会收到此语法逻辑错误?
【发布时间】:2021-06-20 00:57:34
【问题描述】:

我有一个连接和显示数据库的基本 Windows 窗体应用程序。我想使用两个表中的信息更新其中一个数据库,

    UPDATE account AS a
    SET accrued = (a.accrued + ((p.intrate/365)*balance))
    FROM customer c JOIN product p
    ON p.prodid = a.prodid
    WHERE c.custid = a.custid AND active = 1

在数据库浏览器中有效

using (SQLiteCommand cmd = connAccount.CreateCommand())
{
    // adds customers details to the database
    cmd.CommandText = @"UPDATE account AS a SET accrued = (a.accrued + ((p.intrate / 365) * balance)) FROM customer c JOIN product p ON p.prodid = a.prodid WHERE c.custid = a.custid AND active = 1";

    cmd.ExecuteNonQuery();
    MessageBox.Show("Daily Accrued Updated");
}

在我的应用程序中给了我错误:

System.Data.SQLite.SQLiteException: 'SQL 逻辑错误 “FROM”附近:语法错误'

【问题讨论】:

  • 检查您的应用使用的 SQLite 版本。从您的应用程序中执行SELECT sqlite_version(); 并记录结果。
  • 在 dB 浏览器上显示 3.33.0
  • 这是dB浏览器使用的SQLite版本。您的应用可能使用不同的版本。
  • 啊抱歉是 3.32.1
  • 自 3.33.0 版起支持 UPDATE 语句中的此 FROM 语法:sqlite.org/lang_update.html#update_from 可以使用旧语法编写查询,但您必须提及 balanceactive 列它们所属的表。

标签: c# winforms sqlite sql-update


【解决方案1】:

早于 3.33.0 的 SQLite 版本不支持代码中 UPDATE...FROM 语句的语法。

您可以对相关子查询使用旧语法:

UPDATE account AS a
SET accrued = a.accrued +
    (SELECT p.intrate/365
    FROM customer c JOIN product p
    ON p.prodid = a.prodid
    WHERE c.custid = a.custid) * a.balance
WHERE a.active = 1

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多