2011-10-11 45 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使用系统使用的分隔符。 –

相关问题