字段列表中的未知列

时间:2016-07-07 19:04:46

标签: mysql delphi insert

我正在尝试使用Pascal向MySQL插入一些信息,但是当我运行程序时出现错误

  

字段列表中的未知列'mohsen'

这是我的代码

procedure TForm1.Button1Click(Sender: TObject);
var
  aSQLText: string;
  aSQLCommand: string;
  namee:string;
  family:string;
begin
  namee:='mohsen';
  family:='dolatshah';
  aSQLText:= 'INSERT INTO b_tbl(Name,Family) VALUES (%s,%s)';
  aSQLCommand := Format(aSQLText, [namee, family]);
  SQLConnector1.ExecuteDirect(aSQLCommand);
  SQLTransaction1.Commit;
end;

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

这是因为你的

VALUES (%s,%s)

不是用引号括起namee和family变量内容。因此,您的后端Sql引擎认为您的mohsen是列名,而不是值。

相反,请使用,例如

VALUES (''%s'',''%s'')

,如

  Namee := 'mohsen';
  Family := 'dolatshah';
  aSQLText:= 'INSERT INTO b_tbl(Name,Family) VALUES (''%s'',''%s'')';
  aSQLCommand := Format(aSQLText,[namee,family]);

在我的答案的原始版本中,我解释了如何通过在您尝试构建的Sql中“加倍”单引号来解决问题,因为在我看来,您很难看到(字面上)什么是你正在做的事情是错的。

避免问题的替代(和更好)方法(以及我在现实生活中总是使用的方法)是使用QuotedStr()函数。然后相同的代码将成为

aSQLText := 'INSERT INTO b_tbl (Name, Family) VALUES (%s, %s)'; 
aSQLCommand := Format(aSQLText, [QuotedStr(namee), QuotedStr(family)]);

根据在线帮助:

  

使用QuotedStr将字符串S转换为带引号的字符串。在S的开头和结尾插入单引号字符(')>并且字符串中的每个单引号字符都是重复的。

“重复”意味着什么,我称之为“加倍”。为什么这很重要,我使用QuotedStr的主要原因是为了避免Sql db-engine在您要发送的值包含单引号字符时抛出错误,如 O'Reilly

尝试使用MySql Workbench将包含该名称的行添加到您的表中,您将看到我的意思。

因此,使用QuotedStr不仅可以在Delphi代码中将SQL语句构造为字符串,而且更容易出错,但它也可以避免后端出现问题。

答案 1 :(得分:0)

以防万一这会帮助其他人,当我使用sql语句解析python变量并且在i.e中包含if语句时,我遇到了相同的错误。

sql="select bob,steve, if(steve>50,'y','n') from table;"

尽我所能提出这个“未知列y”-因此,我尝试了所有方法,然后将其清除掉,放弃了它作为一项糟糕的工作,直到我以为将“换成”和'for“ ... Hoooraaahh,它起作用了! 这是行之有效的语句

sql='select bob,steve, if(steve>50,"y","n") from table;'

希望有帮助...

答案 2 :(得分:-1)

为了避免这种问题和SQL注入,你应该真正考虑使用SQL参数,而不是Pascal格式语句。

相关问题