【问题标题】:Syntax Error in Insert to statement for Delphi 10.2 TokyoDelphi 10.2 Tokyo 的插入语句中的语法错误
【发布时间】:2018-08-10 08:22:14
【问题描述】:

我在编码方面需要帮助,我尝试更改变量并显示 SQL,但仍然看不到错误

谢谢。

这是我的代码:

qryCustomerInformation.SQL.Add('/*The SQL query string from below*/');
showmessage(qryCustomerInformation.SQL.Text);
qryCustomerInformation.ExecSQL;

这是我的查询字符串:

INSERT INTO BasicInformation (
    Passwords, 
    CustomerID, 
    Names, 
    Surname, 
    Age, 
    IdentitiyNumber, 
    Address, 
    CardNumber, 
    CSV, 
    Expirey, 
    Image, 
    PhoneNumber
) VALUES (
    ''' + CustomerPassword + 
    ''',''' + CustomerId + 
    ''',''' + CustomerName + 
    ''',''' + CustomerSurname + 
    ''',''' + CustomerAge + 
    ''',''' + CustomerIdNumber + 
    ''',''' + CustomerAddress + 
    ''',''' + CustomerCardNumber + 
    ''',''' + CustomerCSV + 
    ''',''' + CustomerExpirey + 
    ''',''' + CustomerImage + 
    ''',''' + CurstomerPhoneNumber 
+ ''')

【问题讨论】:

  • 像您提供的那样的屏幕截图绝对没有用在这里寻求帮助。请将您的 Sql 文本复制/粘贴到您的问题中。同时,-1
  • 如果任何变量中有一个单引号,如果您没有对变量进行转义,您将检索到一个语法错误,它会破坏您的查询字符串。由于您提供的信息很少,因此很难判断您的问题是什么。
  • 嘎。使用参数。避免引用问题并防御 SQL 注入。
  • 使用参数还可以更轻松地处理日期/时间类型。懒惰,让自己的生活更轻松,使用参数。这就是他们的目的。

标签: mysql sql delphi


【解决方案1】:

您遇到问题的部分原因是您的 SQL 在语法上 不必要的复杂。假设CustomerPassword等都是字符串变量, 您可以按如下方式简化您的 Sql:

var InsertSql : String;

begin
  [...]
  InsertSql :=
  'INSERT INTO BasicInformation ('
   + '    Passwords, '
   + '    CustomerID, '
   + '    Names, '
   + '    Surname, '
   + '    Age, '
   + '    IdentitiyNumber, '
   + '    Address, '
   + '    CardNumber, '
   + '    CSV, '
   + '    Expirey, '
   + '    Image, '
   + '    PhoneNumber'
   + ')'
   + ' VALUES ('
   + QuotedStr(CustomerPassword) + ', '
   [... etc]
   + QuotedStr(CurstomerPhoneNumber) + ')'
   ;

   qryCustomerInformation.SQL.Add(InsertSql);

我添加了 InsertSql 局部变量以避免在其中构造 Sql 调用 qryCustomerInformation.SQL.Add(),因为这经常会导致错误。

上面的代码在字符串变量的值周围使用了QuotedStr。它不仅提供了必要的引号,还可以正确处理变量值包含嵌入式单引号的情况。

但是,正如 David Heffernan 所说,最好使用参数化查询, 您需要为每个值添加一个参数到 qryCustomerInformation 在Values 子句中,并修改 InsertSql 使其引用它们中的每一个 而不是原来的字符串值,像这样

   + ' VALUES ('
   + ':CustomerPassword, '
   etc.

qryCustomerInformation 会自动将参数值替换为冒号前的标签。

顺便说一句,您的代码包含许多我认为可疑的拼写: 过期ey CustomerExpirey CurstomerPhoneNumber

【讨论】:

  • Martyn 虽然我也强烈同意他应该切换到参数以防止 SQL 注入,但在您的第一个解决方案中,您忘记引用这些值。您应该将 CustomerPassword 替换为 QuotedStr(CustomerPassword),并对其他每个值重复此操作。
  • 确实如此。非常感谢您发现 @MarcGuillot!
猜你喜欢
  • 2016-06-10
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
相关资源
最近更新 更多