Delphi SQL插入语句错误

Delphi SQL插入语句错误,sql,delphi,Sql,Delphi,这是代码im使用atm与delphi im试图保存数据到我的数据库从编辑框。im获取的错误是EOELEEException Insert into语句 你的问题在第一行。我在下面做了更正。你需要一个括号 qryreg.SQL.Add('Insert into RegistreerTB'); qryreg.SQL.add('Name , Surname, E-mail, Password)'); qryreg.SQL.Add('Values ('+quotedstr(edtname.Text)+'

这是代码im使用atm与delphi im试图保存数据到我的数据库从编辑框。im获取的错误是EOELEEException Insert into语句


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

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 ('+quotedstr(edtname.Text)+','+quotedstr(edtsname.Text)+','+quotedstr(edtemail.Text)+','+quotedstr(edtpassuse.Text)+')'); 
qryreg.ExecSQL ; 
qryreg.SQL.Text := 'Select * from RegistreerTB'; 
qryreg.Open ; 
可能您必须在第一行之前调用qryreg.SQL.Clear。 为什么不使用参数?
正如所指出的,在值之前的列名周围需要有括号。您需要确保所有列名都是有效的SQL标识符。如果它们不是,就像电子邮件一样,您需要根据数据库的语法规则引用或转义它们。例如,MySQL使用严重的重音符号,Microsoft SQL使用括号,Oracle和Postgresql使用引号。

正如oodesigner所述,更好的方法是使用参数。我不知道你在看什么教科书,但给出的代码并不是真正的最佳实践,也不是最差的实践,至少它使用了QuotedStr而不是+edtname.text+,这在你第一次使用类似O'Connell的东西时失败,并允许SQL注入攻击

根据Rob的answe使用参数并假设SQL Server语法,并假设基于EOLEException的TADOQuery,代码如下所示:

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 ; 

我已经更改了代码,正如你所说,我仍然会遇到同样的错误,我在过去的一个小时里一直试图解决这个问题,但我找不到我的错误,但无论如何,谢谢:@Shadowriz。。。引用字符串返回什么例如:QuotedStrello它会返回hello还是“hello”@Shadowriz:John所说的似乎是该代码唯一的问题我希望quotedstr返回单引号。您确定您的表定义符合此语句吗?你确定你的字段名是正确的吗?是的,字段名是正确的@john我在使用教科书上的atm之前从未这样做过:quotedstredt1.text将返回输入编辑框idk的文本,如果这有任何帮助,但注释为Y。我正在使用教科书中的示例,我刚刚将值更改为im中的值使用自动取款机你能详细说明一下吗paramaters@Shadowriz:请在答案中包含教科书的名称。参数还避免每次都对查询进行硬解析,并允许重用已解析的语句。有些数据库不喜欢被大量语句淹没,因为当同一个语句被反复提交时,只需更改一些文本即可。我将研究如何使用参数
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 ;