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”
事先提前答案 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)