Ошибка преобразования VARCHAR в числовой: SQL Server 2008 - PullRequest
0 голосов
/ 11 октября 2011

У меня есть этот оператор 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

ПРИМЕЧАНИЕ. Если я поставлю 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]);

Ответы [ 3 ]

0 голосов
/ 11 октября 2011

Вы помещаете значение для цены между кавычками

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

Именно поэтому SQLServer пытается выполнить преобразование из числа varchar в число. Чтобы этого не произошло, вам нужно будет оставить цитаты:

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

и убедитесь, что P.Text содержит десятичный и тысячный разделители, ожидаемые SQL Server. Желательно только десятичный разделитель. Вы всегда можете выполнить преобразование самостоятельно, используя StrToFloat или StrToFloatDef с P.Text в качестве входных данных, а затем переформатировать это для SQLServer.

Насколько я помню, SQL Server ожидает разделители США в операторах SQL, что означает, что вам нужно использовать точку в качестве десятичного разделителя.

0 голосов
/ 11 октября 2011

Не создавать SQL-запрос путем добавления текста;использовать параметры.

Или вы попадете в ловушку SQL-инъекций Bobby Tables .

Это также облегчает избавление от этих ошибок.

0 голосов
/ 11 октября 2011

Возможно, ваша строка содержит не числовые символы или неверный десятичный разделитель (например, "," вместо ".").

...