插入 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 语句。对于 INSERTDELETEUPDATE 语句,您需要使用 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)

是的,它更多的是打字,但它可以防止假设成为错误的原因,这样的数据会进入错误的列。