这是因为你的
VALUES (%s,%s)
没有用引号将 namee 和 family 变量内容括起来。因此,你的后端Sql引擎认为你的mohsen
是列名,而不是值。
相反,使用,例如
VALUES (''%s'',''%s'')
as in
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 数据库引擎抛出错误,如下所示O'Reilly.
尝试使用 MySql Workbench 将包含该名称的行添加到表中,您就会明白我的意思。
因此,使用 QuotedStr 不仅可以减少在 Delphi 代码中将 SQL 语句构造为字符串的可能性,而且还可以避免后端出现问题。