2011-10-11 56 views
0

我有這樣的SQL語句,但它返回: 「錯誤轉換VARCHAR到數字」錯誤轉化爲varchar到數字:SQL Server 2008中

ADOTailles.SQL.Text := 'INSERT INTO tailles (numOF, taille, quantite, prixVente) VALUES(''' + numOF.Text + ''',''' + C.Caption + ''',''' + Q.Text + ''',''' + P.Text + ''')'; 
ADOTailles.ExecSQL 

的數值字段是prixVente;

我用這個,但仍是同樣的錯誤:

ADOTailles.SQL.Text := 'INSERT INTO tailles (numOF, taille, quantite, prixVente) VALUES(''' + numOF.Text + ''',''' + C.Caption + ''',''' + Q.Text + ''',CAST(''' + P.Text + ''' AS numeric(5, 2)))'); 
ADOTailles.ExecSQL 

注意:如果我把一個INTEGER沒有錯誤

完整的代碼是:

var 
    I: Int8; 
    C: TCheckBox; 
    Q, P: TEdit; 
for I := 1 to 16 do Begin 
       C := FindComponent('T' + IntToStr(I)) as TCheckBox; 
       Q := FindComponent('Q' + IntToStr(I)) as TEdit; 
       P := FindComponent('P' + IntToStr(I)) as TEdit; 
       if C.Checked = True then begin 
        ADOTailles.SQL.Text := 'INSERT INTO tailles (numOF, taille, quantite, prixVente) VALUES(''' + numOF.Text + ''',''' + C.Caption + ''',''' + Q.Text + ''',''' + P.Text + ''')'; 
        ADOTailles.ExecSQL 
       end; 
      End; 

沒有SQL注入,因爲我使用此代碼:

StringReplace(aricleFilter.Text, '''', '', [rfReplaceAll]); 
+9

您應該**不要**將您的SQL語句連接在一起 - 這非常容易出錯並且存在SQL注入**的風險。相反 - 使用**參數化查詢!**使用參數也經常使得提供不同類型的值(如字符串,整型等)變得更加容易 –

+1

SQL注入==非常不專業。 –

+1

[在這裏閱讀關於如何在Delphi中使用ADOQuery參數](http://delphi.about.com/od/database/l/aa050101a.htm) –

回答

0

不要通過追加文本來創建SQL查詢;使用參數。您可能會陷入Bobby Tables SQL injection trap

它更容易擺脫這些錯誤。

+0

謝謝Jeroen。 –

0

也許您的字符串不包含數字符號或不正確的小數點分隔符(例如「,」而不是「。」)。

0

你把價值的報價

... ''',''' + P.Text + ''')'; 

這是什麼原因造成的SQLServer嘗試了一些從varchar轉換之間。爲了防止這種情況,你將不得不離開報價:

... ''',' + P.Text + ')'; 

,並確保P.Text包含SQL Server需要小數和千位分隔符。最好只有小數點分隔符。您始終可以使用StrToFloat或StrToFloatDef將P.Text作爲輸入來自行完成轉換,然後重新格式化爲SQLServer。

從我所記得的情況來看,SQL Server期望SQL語句中的美國分隔符,這意味着您需要使用一個點作爲小數分隔符。

+0

我使用Frensh系統分隔符「,」 –

+0

據我所知, SQL Server使用系統使用的分隔符。 –

相關問題