【问题标题】:SQL syntax error in updating a database value更新数据库值时的 SQL 语法错误
【发布时间】:2019-08-29 18:21:30
【问题描述】:

我只在数据库中更新一个人的钱。钱被保存为货币,电子邮件被保存为字符串。我的 SQL 抛出语法错误

ADOQuery.sql.text:= ' UPDATE TblPlayerdetails SET Money = "' + Inttostr(NewAmount) + '" WHERE Email = "' + Playersemail + '"';

Newamount 是一个整数,email 是一个字符串。

【问题讨论】:

  • 学习使用参数和参数占位符!不要将查询字符串与参数值混为一谈!
  • 我不明白你的意思,你能详细说明一下
  • 如果您遵循@GordonLinoff 的建议,那么您遇到语法错误的可能性就会大大降低。参见例如docwiki.embarcadero.com/RADStudio/Rio/en/…。您现有的 SQL 不需要 Inttostr(NewAmount) 周围的双引号。
  • 你能帮我重写 SQL 还是给一个例子。我不明白你要解释什么@MartynA
  • 你应该自己做,否则你什么也学不到。如果您不厌其烦地阅读那篇文章,它会充分解释参数化查询。它链接到的这篇文章展示了如何在运行时指定参数值:docwiki.embarcadero.com/RADStudio/Rio/en/…

标签: sql database delphi


【解决方案1】:

我希望您能设法从我在 cmets 中链接的文档中弄清楚该怎么做,但经过反思,我认为我最好提供一个正确的答案。

设置如下代码

procedure TForm1.Button1Click(Sender: TObject);
begin
  AdoQuery2.SQL.Text := 'update moneytable set money = :money where id = :id';

  AdoQuery2.Parameters.ParamByName('ID').Value := 1;
  AdoQuery2.Parameters.ParamByName('Money').Value := 99;

  AdoQuery2.ExecSQL;
end;

线

  AdoQuery2.SQL.Text := 'update moneytable set money = :money where id = :id';

设置参数化的 UPDATE 语句。 :id:moneyparameter 值的占位符,它们将单独提供。参数名称是 ID 和 Money,尽管它们可以被赋予其他名称。请注意,如果您愿意,可以在设计时在 IDE 中设置 AdoQuery2 的 SQL.Text。

接下来的两行

  AdoQuery2.Parameters.ParamByName('ID').Value := 1;
  AdoQuery2.Parameters.ParamByName('Money').Value := 99;

指定实际执行 UPDATE 时要设置的参数值。 ID 值是表中要更新的行的行 ID(也称为主键)。在实际执行 UPDATE 语句之前,AdoQuery 会解析 SQL 并创建参数(如果它们不存在)(您可以在设计时在 IDE 中通过编辑 AdoQuery 的 Parameters 属性来创建它们。

终于

  AdoQuery2.ExecSQL;

是实际执行 UPDATE 语句的内容。请注意,您可以根据需要多次重复设置参数值和调用 ExecSQL 的步骤。

您的 UPDATE 语句的主要问题是您使用了双引号 (") 标记,而当 SQL 语句需要引号时(并且数字列的值不需要),它们应该是单引号(')。在 Delphi 代码中构造 SQL 语句时的一个复杂之处在于,它的语法需要将要嵌入到 SQL 中的单引号加倍。

还请注意,您应该始终为您的 SELECT、UPDATE、INSERT 和 DELETE 语句使用参数化 SQL,因为这有助于保护您的应用免受Sql injection 的侵害。例如,使用户可以访问未参数化的语句可以允许恶意用户尝试执行他们希望执行的任何 SQL。

【讨论】:

    【解决方案2】:

    在您的问题中,您没有说明“金钱”是什么类型的列。如果是 varchar、char,那我明白你为什么要把 NewAmount 转换成字符串了。

    但是,如果数据库需要数值(因为该字段的类型为 int、double、dec 或 float),则语法为 SET Money= '+ NewAmount +'

    【讨论】:

    • OP 说 Money 列是 Int(eger) 列,而不是字符列。此外,鉴于某些 SO 用户倾向于从答案中不假思索地复制和粘贴代码,因此显示缺少限制性 WHERE 子句的 UPDATE 语句不是一个好主意。
    • 您不能直接连接字符串和浮点数或整数。您发布的适用于 type int、double、dec 或 float 的示例将无法编译,因此语法不正确。如果您阅读标签以了解您正在为其编写答案的语言,并且如果您不熟悉该语言,则不要回答会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多