2010-10-04 51 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