簡體   English   中英

將varchar轉換為數值時出錯:SQL Server 2008

[英]error converting varchar to numeric : SQL Server 2008

我有此SQL語句,但返回:“將varchar轉換為數值時出錯”

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

注意:如果我輸入一個整數沒有錯誤

完整的代碼是:

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]);

也許您的字符串中沒有數字符號或不正確的十進制分隔符(例如,“,”而不是“。”)。

您將報價的價格放在報價之間

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

這就是導致SQLServer嘗試從varchar轉換為數字的原因。 為防止這種情況,您將必須刪除引號:

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

並確保P.Text包含SQL Server期望的小數和千位分隔符。 最好僅使用小數點分隔符。 您始終可以使用StrToFloat或StrToFloatDef(以P.Text作為輸入)進行轉換,然后為SQLServer重新格式化。

據我所知,SQL Server期望SQL語句中使用美國分隔符,這意味着您需要使用點作為小數點分隔符。

不要通過添加文本來創建SQL查詢; 使用參數。

否則您將陷入Bobby Tables SQL注入陷阱

它也使消除這些錯誤的方法變得更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM