插入 SQL 语法错误 delphi
Insert into SQL syntax error delphi
我想使用带参数的过程将记录插入数据库 table(网站)。 SQL 代码已在 mysql workbench 中测试过,可以正常插入新数据。但是,使用 delphi 我得到一个 'SQL Syntax error near [insert whole line of code here]'。我想知道你们中是否有人可以告诉我哪里出错了。再次感谢。
procedure TNewWebsite.InsertData(WID, D, T, Wh, Dr, Od, Rd, Rc, Pm, OStat, Cstat, Rstat, N, U1, P1, P2, PStat, CID : string);
begin
WebsiteTable.WebsiteQuery.SQL.Add('INSERT INTO website VALUES ( '+WID+', '''+D+''', '''+T+''', '''+Wh+''', '''+D+''', '''+Od+''', '''+Rd+''', '+Rc+', '''+Pm+''', '+Ostat+', '+Cstat+', '''+Rstat+''', '''+N+''', '''+U1+''', '''+P1+''', '''+P2+''', '+Pstat+', '+CID+';)');
WebsiteTable.WebsiteQuery.Open;
end;
请将查询行末尾的 '+CID+';)');
替换为 '+CID+');');
。 ;
放错地方了。
你的代码有不少问题。
A) 不要夸大函数参数,如果你有很多变量,assemble 它们在记录中或 class 取决于你的需要。
B) 您的 SQL 代码容易受到 SQL 注入攻击。您可能从未听说过 SQL 注入,请 Google 或阅读此 really good answer。针对 SQL 注入的解决方案是使用参数(参见我的代码示例)。一个额外的好处是您的 SQL 语句将是人类可读的,并且不容易出错。
C) Open
函数仅与 return 结果集的查询结合使用,如 SELECT
语句。对于 INSERT
、DELETE
和 UPDATE
语句,您需要使用 ExecSQL
函数。
清理代码:
interface
type
TMyDataRecord = record
WID : String;
D : String;
T : String;
Wh : String;
Dr : String;
Od : String;
Rd : String;
Rc : String;
Pm : String;
OStat : String;
Cstat : String;
Rstat : String;
N : String;
U1 : String;
P1 : String;
P2 : String;
PStat : String;
CID : String;
end;
...
implementation
procedure TNewWebsite.InsertData(Data : TMyDataRecord);
var
SQL : String;
begin
SQL := 'INSERT INTO website VALUES (:WID, :D1, :T, :Wh, :D2, :Od, :Rd, :Rc',+
'Pm, :Ostat, :Cstat, :Rstat, :N, :U1, :P1, :P2, :Pstat, :CID)';
WebsiteTable.WebsiteQuery.ParamCheck := True;
WebsiteTable.WebsiteQuery.SQL.Text := SQL;
WebsiteTable.WebsiteQuery.Params.ParamByName('WID').AsString := Data.WID;
WebsiteTable.WebsiteQuery.Params.ParamByName('D1').AsString := Data.D;
...// rest of parameters
WebsiteTable.WebsiteQuery.Params.ParamByName('CID').AsString := Data.CID;
WebsiteTable.WebsiteQuery.ExecSQL;
end;
或许你可以这样使用
function FormatQuery(Query: String; Args: array of const): string;
var S:string; FmtSet: TFormatSettings;
begin
Result:= Query;
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FmtSet);
FmtSet.DecimalSeparator := '.';
FmtStr(S, Query, Args, FmtSet);
Result:= S;
end;
procedure TNewWebsite.InsertData(Query: String; Args: array of const);
var MyQuery: string;
begin
MyQuery:= FormatQuery(Query, Args);
WebsiteTable.WebsiteQuery.SQL.Clear;
WebsiteTable.WebsiteQuery.SQL.Add(MyQuery);
WebsiteTable.WebsiteQuery.Open;
end;
之后就可以这样调用了
var MyQuery: string;
MyQuery:= 'INSERT INTO website VALUES (%s,"%s","%s","%s","%s","%s","%s",%s,"%s",%s,%s,"%s","%s","%s","%s","%s",%s,%s;)';
InsertData(MyQuery,[WID,D,T,Wh,D,Od,Rd,Rc,Pm,Ostat,Cstat,Rstat,N,U1,P1,P2,Pstat,CID]);
希望能帮到你
关于 table 和您尝试插入以修复代码的数据的信息不足。 T_G的答案可能是正确的,建议参数化查询的答案很好,但可能还有其他错误。我将为您提供一些关于如何诊断您的确切问题的建议。
首先,不要尝试通过 Delphi 调试您的 SQL 语句。使用专为您的数据库设计的数据库管理工具,例如 MySQL Workbench http://www.mysql.com/products/workbench/ 它会提供更详细的错误消息,可以帮助您找到导致错误的原因。
如果您以编程方式创建 SQL 语句,如您的问题所示,请将其分配给一个变量,以便您可以在调试时捕获它,然后将其复制到您选择的数据库管理工具中进行调试.
var
SQL : string;
begin
SQL := 'INSERT INTO website VALUES ( '+WID+', '''+D+''', '''+T+''', '''+Wh+''', '''+D+''', '''+Od+''', '''+Rd+''', '+Rc+', '''+Pm+''', '+Ostat+', '+Cstat+', '''+Rstat+''', '''+N+''', '''+U1+''', '''+P1+''', '''+P2+''', '+Pstat+', '+CID+';)');
WebsiteTable.WebsiteQuery.SQL.Text := SQL;
其次,不在 SQL 语句中包含列名是不好的做法。你应该让你的SQL像下面这样
INSERT INTO WEBSITE (COLUMN1, COLUMN2, COLUMN3) VALUES (1, 'ABC', 'XYZ')
或使用参数化查询
INSERT INTO WEBSITE (COLUMN1, COLUMN2, COLUMN3) VALUES (:C1, :C2, :C3)
是的,它更多的是打字,但它可以防止假设成为错误的原因,这样的数据会进入错误的列。
我想使用带参数的过程将记录插入数据库 table(网站)。 SQL 代码已在 mysql workbench 中测试过,可以正常插入新数据。但是,使用 delphi 我得到一个 'SQL Syntax error near [insert whole line of code here]'。我想知道你们中是否有人可以告诉我哪里出错了。再次感谢。
procedure TNewWebsite.InsertData(WID, D, T, Wh, Dr, Od, Rd, Rc, Pm, OStat, Cstat, Rstat, N, U1, P1, P2, PStat, CID : string);
begin
WebsiteTable.WebsiteQuery.SQL.Add('INSERT INTO website VALUES ( '+WID+', '''+D+''', '''+T+''', '''+Wh+''', '''+D+''', '''+Od+''', '''+Rd+''', '+Rc+', '''+Pm+''', '+Ostat+', '+Cstat+', '''+Rstat+''', '''+N+''', '''+U1+''', '''+P1+''', '''+P2+''', '+Pstat+', '+CID+';)');
WebsiteTable.WebsiteQuery.Open;
end;
请将查询行末尾的 '+CID+';)');
替换为 '+CID+');');
。 ;
放错地方了。
你的代码有不少问题。
A) 不要夸大函数参数,如果你有很多变量,assemble 它们在记录中或 class 取决于你的需要。
B) 您的 SQL 代码容易受到 SQL 注入攻击。您可能从未听说过 SQL 注入,请 Google 或阅读此 really good answer。针对 SQL 注入的解决方案是使用参数(参见我的代码示例)。一个额外的好处是您的 SQL 语句将是人类可读的,并且不容易出错。
C) Open
函数仅与 return 结果集的查询结合使用,如 SELECT
语句。对于 INSERT
、DELETE
和 UPDATE
语句,您需要使用 ExecSQL
函数。
清理代码:
interface
type
TMyDataRecord = record
WID : String;
D : String;
T : String;
Wh : String;
Dr : String;
Od : String;
Rd : String;
Rc : String;
Pm : String;
OStat : String;
Cstat : String;
Rstat : String;
N : String;
U1 : String;
P1 : String;
P2 : String;
PStat : String;
CID : String;
end;
...
implementation
procedure TNewWebsite.InsertData(Data : TMyDataRecord);
var
SQL : String;
begin
SQL := 'INSERT INTO website VALUES (:WID, :D1, :T, :Wh, :D2, :Od, :Rd, :Rc',+
'Pm, :Ostat, :Cstat, :Rstat, :N, :U1, :P1, :P2, :Pstat, :CID)';
WebsiteTable.WebsiteQuery.ParamCheck := True;
WebsiteTable.WebsiteQuery.SQL.Text := SQL;
WebsiteTable.WebsiteQuery.Params.ParamByName('WID').AsString := Data.WID;
WebsiteTable.WebsiteQuery.Params.ParamByName('D1').AsString := Data.D;
...// rest of parameters
WebsiteTable.WebsiteQuery.Params.ParamByName('CID').AsString := Data.CID;
WebsiteTable.WebsiteQuery.ExecSQL;
end;
或许你可以这样使用
function FormatQuery(Query: String; Args: array of const): string;
var S:string; FmtSet: TFormatSettings;
begin
Result:= Query;
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FmtSet);
FmtSet.DecimalSeparator := '.';
FmtStr(S, Query, Args, FmtSet);
Result:= S;
end;
procedure TNewWebsite.InsertData(Query: String; Args: array of const);
var MyQuery: string;
begin
MyQuery:= FormatQuery(Query, Args);
WebsiteTable.WebsiteQuery.SQL.Clear;
WebsiteTable.WebsiteQuery.SQL.Add(MyQuery);
WebsiteTable.WebsiteQuery.Open;
end;
之后就可以这样调用了
var MyQuery: string;
MyQuery:= 'INSERT INTO website VALUES (%s,"%s","%s","%s","%s","%s","%s",%s,"%s",%s,%s,"%s","%s","%s","%s","%s",%s,%s;)';
InsertData(MyQuery,[WID,D,T,Wh,D,Od,Rd,Rc,Pm,Ostat,Cstat,Rstat,N,U1,P1,P2,Pstat,CID]);
希望能帮到你
关于 table 和您尝试插入以修复代码的数据的信息不足。 T_G的答案可能是正确的,建议参数化查询的答案很好,但可能还有其他错误。我将为您提供一些关于如何诊断您的确切问题的建议。
首先,不要尝试通过 Delphi 调试您的 SQL 语句。使用专为您的数据库设计的数据库管理工具,例如 MySQL Workbench http://www.mysql.com/products/workbench/ 它会提供更详细的错误消息,可以帮助您找到导致错误的原因。
如果您以编程方式创建 SQL 语句,如您的问题所示,请将其分配给一个变量,以便您可以在调试时捕获它,然后将其复制到您选择的数据库管理工具中进行调试.
var
SQL : string;
begin
SQL := 'INSERT INTO website VALUES ( '+WID+', '''+D+''', '''+T+''', '''+Wh+''', '''+D+''', '''+Od+''', '''+Rd+''', '+Rc+', '''+Pm+''', '+Ostat+', '+Cstat+', '''+Rstat+''', '''+N+''', '''+U1+''', '''+P1+''', '''+P2+''', '+Pstat+', '+CID+';)');
WebsiteTable.WebsiteQuery.SQL.Text := SQL;
其次,不在 SQL 语句中包含列名是不好的做法。你应该让你的SQL像下面这样
INSERT INTO WEBSITE (COLUMN1, COLUMN2, COLUMN3) VALUES (1, 'ABC', 'XYZ')
或使用参数化查询
INSERT INTO WEBSITE (COLUMN1, COLUMN2, COLUMN3) VALUES (:C1, :C2, :C3)
是的,它更多的是打字,但它可以防止假设成为错误的原因,这样的数据会进入错误的列。