我正在尝试使用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;
我该如何解决这个问题?
答案 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格式语句。