2010-10-04 50 views
0
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与德尔福即时通讯试图从编辑框保存数据到我的数据库。错误即时得到是EOELeException“INSERT INTO声明”德尔福SQL插入到语句错误

TY提前

回答

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 ; 
+0

我已经改变代码如你所说我仍然得到同样的错误,我一直在试图找出过去一小时,我找不到我的错误,但无论如何感谢:) – Shadowriz 2010-10-04 19:23:13

+0

@Shadowriz ...什么引用例如,d的字符串返回:quotedstr(“你好”),将其返回“你好”或“你好” – 2010-10-04 19:24:16

+0

@Shadowriz:什么约翰说好像与此代码(我希望quotedstr返回单引号)的唯一问题。你确定你的表格定义符合这个陈述吗?你确定你的字段名称是正确的吗? – 2010-10-04 19:27:29

0
  1. 可能是你有你的第一行之前调用qryreg.SQL.Clear。
  2. 为什么不使用参数?
+0

嘿即时通讯和我只是改变了值的使用ATM那些IM能否请您阐述一下PARAMATERS – Shadowriz 2010-10-04 19:46:55

+0

@Shadowriz:请在您的回答教科书的名字 – 2010-10-05 08:01:33

4

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

+0

+1良好的渔获我完全忽略了一个 – 2010-10-04 20:01:00

8

由于oodesigner指出,更好的方法是使用参数。我不知道你在找什么教科书,但鉴于该代码是不是真的最好的做法(这是最糟糕的不是任何做法,至少它使用QuotedStr而不是'''' + edtname.Text + ''''其失败,你使用类似澳第一次奥康纳,并允许SQL注入攻击

使用的参数和假设SQL Server语法按照Rob的answe,并假设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

参数也避免了每一次硬解析查询,。允许重用一个已经解析过的语句,某些数据库不会“被”很多语句所淹没,因为当同一个语句被重新提交时并改变一些文字。 – 2010-10-04 20:57:16

+1

Ty我会研究使用参数 – Shadowriz 2010-10-04 21:02:30