Delphi SQL插入语句错误

时间:2010-10-04 19:19:03

标签: sql delphi

qryreg.SQL.Add('Insert into RegistreerTB');
qryreg.SQL.add('Name , Surname, E-mail, Password)');
qryreg.SQL.Add('Values ('+quotedstr(edtname.Text)+','+quotedstr(edtsname.Text)+','+quotedstr(edtemail.Text)+','+quotedstr(edtpassuse.Text)+')');
qryreg.ExecSQL ;
qryreg.SQL.Text := 'Select * from RegistreerTB';
qryreg.Open ;

这是使用atm和delphi的代码我试图从编辑框将数据保存到我的数据库。我得到的错误是EOELeException“Insert into statement”

事先提前

4 个答案:

答案 0 :(得分:8)

正如oodesigner所说,更好的方法是使用参数。我不知道你正在看什么教科书,但给出的代码并不是最好的做法(这也不是最差的做法,至少它使用QuotedStr而不是'''' + edtname.Text + ''''失败你第一次使用像O'Connell这样的东西,并允许SQL注入攻击。

根据Rob的回答使用参数并假设SQL Server语法,并假设TADOQuery(基于EOLEException),代码将类似于:

qryreg.SQL.Add('Insert into RegistreerTB');  
qryreg.SQL.Add('(Name , Surname, [E-mail], Password)');  //SQL Server syntax with square brackets

// OR qryreg.SQL.Add('(Name , Surname, "E-mail", Password)');  //Oracle/Postgres syntax with double quotes
// OR qryreg.SQL.Add('(Name , Surname, `E-mail`, Password)');  //MySQL syntax with grave accent

qryreg.SQL.Add('Values :Name, :Surname, :Email, :Password)'); 

qryreg.Parameters.ParamByName('Name').Value := edtName.Text;
qryreg.Parameters.ParamByName('Surname').Value := edtSName.Text;
qryreg.Parameters.ParamByName('Email').Value := edtEmail.Text;
qryreg.Parameters.ParamByName('Password').Value := edtPassUse.Text;

qryreg.ExecSQL;  
qryreg.SQL.Text := 'Select * from RegistreerTB';  
qryreg.Open ;  

答案 1 :(得分:4)

正如John's answer所指出的那样,您需要在VALUES之前的列名称周围加上括号。您需要确保所有列名都是有效的SQL标识符。如果不是,如E-mail的情况,则需要根据数据库的语法规则引用或转义它们。例如,MySQL使用严重重音,Microsoft SQL使用括号,Oracle和Postgresql使用引号。

答案 2 :(得分:2)

您的问题出在第一行。我在下面做了修正。你需要一个左括号。

qryreg.SQL.Add('Insert into RegistreerTB ('); 
qryreg.SQL.Add('Name , Surname, E-mail, Password)'); 
qryreg.SQL.Add('Values ('+quotedstr(edtname.Text)+','+quotedstr(edtsname.Text)+','+quotedstr(edtemail.Text)+','+quotedstr(edtpassuse.Text)+')'); 
qryreg.ExecSQL ; 
qryreg.SQL.Text := 'Select * from RegistreerTB'; 
qryreg.Open ; 

看看是否有效

qryreg.SQL.Add("Insert into RegistreerTB ("); 
qryreg.SQL.Add("Name , Surname, E-mail, Password)"); 
qryreg.SQL.Add("Values ('"+edtname.Text+"','"+edtsname.Text +"','"+edtemail.Text+"','"+edtpassuse.Text +"')"); 
qryreg.ExecSQL ; 
qryreg.SQL.Text := "Select * from RegistreerTB"; 
qryreg.Open ; 

答案 3 :(得分:0)

  1. 您可能需要在第一行之前调用qryreg.SQL.Clear。
  2. 为什么不使用参数?