2 / 2 / 1
Регистрация: 23.01.2013
Сообщений: 52
1

Ошибка при преобразовании типа данных varchar к int

26.03.2013, 22:35. Показов 4640. Ответов 6
Метки нет (Все метки)

Есть 3 таблицы:

Покупатели - customer(id,name,city,phone,rating)
поставщики - supplier(id,name,city,phone)
договор - contract(id,cust_id,sup_id,date,sum)

Пытаюсь сделать приложение для работы с БД. На одной из форм для таблицы contract использую компонент DBLookupcomboboxEh. В нем появляется список покупателей, выбираю одну из фамилий, а в бд нужно занести его id. Аналогично с поставщиками. Проблема состоит в том, что при добавление новой записи(заключении нового договора) появляется такая ошибка: Ошибка при преобразовании типа данных varchar к int. Как я понимаю в DBLookupcomboboxEh отображается фамилия (тип nvarchar), а id (int). Подскажите пожалуйста как исправить эту ошибку.

Параметры DBLookupcomboboxEh вроде настроены правильно:
Для покупателей:
DataField-cust_id
DataSource-DataModule2.ContractDataSource
KeyField-id
ListField-name
ListSource-DataModule2.CustomerDataSource

C поставщиками аналогично.


Код (для добавления записи):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm5.btn1Click(Sender: TObject);
var cust_id, sup_id, date, sum: string;
 
begin
   cust_id:=QuotedStr(unit5.form5.dblkpcmbxhcust_id.text);
   sup_id:=QuotedStr(unit5.form5.dblkpcmbxhsup_id.text);
   dbdth2.Text:= DateToStr(dtp1.Date);
   date:=QuotedStr(unit5.form5.dbdth2.text);
   sum:=QuotedStr(unit5.form5.dbdth1.text);
 
   with Unit2.DataModule2.qry  do
   begin
     Close;
     SQL.Clear;
     SQL.Add('exec add_contract' +cust_id+','+sup_id+','+date+','+sum);
     Execsql;
     Unit2.DataModule2.ContractQuery.Active:=False;
     Unit2.DataModule2.ContractQuery.Active:=true;
   end;
end;
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2013, 22:35
Ответы с готовыми решениями:

Ошибка при преобразовании типа данных varchar к int
Подскажите в чем дело, пару часов назад таблица работала а теперь выдает ошибку. После того как...

Ошибка при преобразовании типа данных varchar к int
Вообщем, есть некая хранимая процедура в SQL: create procedure new_Aut (@InventarizNomer...

Ошибка при преобразовании типа данных varchar к real
Пытаюсь обновить запись в БД. Делаю так: double stavka = Convert.ToDouble(textBox3.Text);...

Ошибка "Преобразование значения типа varchar привело к переполнению столбца типа int" ?
Проблемы с SQL Server Создал таблицу: use LivlagsBar go IF EXISTS (SELECT name FROM...

6
568 / 291 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
27.03.2013, 01:24 2
Вместо
Delphi
1
2
3
4
5
6
7
8
9
 
..
var cust_id, sup_id, date, sum: string;
..
   cust_id:=QuotedStr(unit5.form5.dblkpcmbxhcust_id.text);
   sup_id:=QuotedStr(unit5.form5.dblkpcmbxhsup_id.text);
..
SQL.Add('exec add_contract' +cust_id+','+sup_id+','+date+','+sum);
..
надо
Delphi
1
2
3
4
5
6
7
8
9
10
   
..
var date, sum: string;
     cust_id, sup_id : integer;
..   
   cust_id:=unit5.form5.dblkpcmbxhcust_id.KeyValue;
   sup_id:=unit5.form5.dblkpcmbxhsup_id.KeyValue;
..
SQL.Add('exec add_contract' +IntToStr(cust_id)+','+IntToStr(sup_id)+','+date+','+sum);
..
А так вообще делать нельзя
Delphi
1
dbdth2.Text:= DateToStr(dtp1.Date);
Меняем региональные настройки и к вашей программе приходит белая пушистая лисичка.
Да и вообще нужно использовать параметризированный запрос.
Вместо
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm5.btn1Click(Sender: TObject);
var cust_id, sup_id, date, sum: string;
 
begin
   cust_id:=QuotedStr(unit5.form5.dblkpcmbxhcust_id.text);
   sup_id:=QuotedStr(unit5.form5.dblkpcmbxhsup_id.text);
   dbdth2.Text:= DateToStr(dtp1.Date);
   date:=QuotedStr(unit5.form5.dbdth2.text);
   sum:=QuotedStr(unit5.form5.dbdth1.text);
 
   with Unit2.DataModule2.qry  do
   begin
     Close;
     SQL.Clear;
     SQL.Add('exec add_contract' +cust_id+','+sup_id+','+date+','+sum);
     Execsql;
     Unit2.DataModule2.ContractQuery.Active:=False;
     Unit2.DataModule2.ContractQuery.Active:=true;
   end;
end;
Стоит написать так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm5.btn1Click(Sender: TObject);
begin
   with Unit2.DataModule2.qry  do
   begin
     Close;
     SQL.Clear;
     SQL.Add('exec add_contract( :cust_id , :sup_id , :с_date , :c_sum )';
     Parameters.ParamByName('cust_id').Value := unit5.form5.dblkpcmbxhcust_id.KeyValue;
     Parameters.ParamByName('sup_id').Value := unit5.form5.dblkpcmbxhsup.KeyValue;
     Parameters.ParamByName('с_date').Value := dtp1.Date;
     Parameters.ParamByName('c_sum ').Value := StrToFloat(unit5.form5.dbdth1.text);
     Execsql;
     Unit2.DataModule2.ContractQuery.Active:=False;
     Unit2.DataModule2.ContractQuery.Active:=true;
   end;
end;
здесь параметры date и sum заменены на c_date и c_sum т.к. date и sum это зарезервированные слова.
Избегайте названий полей и переменных зарезервированными словами т.к. это не минуемо приведет к ошибкам.
В этой строке не ясно в каком виде вы храните суммы но скорее всего необходимо сделать так как я написал.
Delphi
1
Parameters.ParamByName('c_sum ').Value := StrToFloat(unit5.form5.dbdth1.text);
Вряд ли вы храните суммы в текстовых полях. Хотя можете использовать целочисленные. Кто вас знает.
Так же перед выполнением
Delphi
1
StrToFloat(unit5.form5.dbdth1.text)
стоит проверить какой используется в системе разделитель целой и дробной частей. Т.к. ввод осуществляется пользователем и может возникнуть ситуация, что поставили точку вместо запятой и наоборот.
Можно конечно плеваться ошибками о невозможности преобразования. Но лучше сделать замену символа на тот что применяется в системе.
1
2 / 2 / 1
Регистрация: 23.01.2013
Сообщений: 52
27.03.2013, 18:22  [ТС] 3
rdama, спасибо большое, сделала как вы сказали:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm5.btn1Click(Sender: TObject);
begin
   with Unit2.DataModule2.qry  do
   begin
     Close;
     SQL.Clear;
     SQL.Add('exec add_contract( :cust_id , :sup_id , :с_date , :c_sum )';
     Parameters.ParamByName('cust_id').Value := unit5.form5.dblkpcmbxhcust_id.KeyValue;
     Parameters.ParamByName('sup_id').Value := unit5.form5.dblkpcmbxhsup.KeyValue;
     Parameters.ParamByName('с_date').Value := dtp1.Date;
     Parameters.ParamByName('c_sum ').Value := StrToFloat(unit5.form5.dbdth1.text);
     Execsql;
     Unit2.DataModule2.ContractQuery.Active:=False;
     Unit2.DataModule2.ContractQuery.Active:=true;
   end;
end;
но теперь выскакивает ошибка: qry: Parameter 'c_sum' not found
Не знаю как исправить! У поля sum тип данных real.
В системе используется разделитель "." Как сделать замену символа, на тот что применяется в системе?

Пробовала и вот этот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm5.btn1Click(Sender: TObject);
var date, sum: string;
    cust_id, sup_id:Integer;
 
begin
   cust_id:=unit5.form5.dblkpcmbxhcust_id.KeyValue;
   sup_id:=unit5.form5.dblkpcmbxhsup_id.KeyValue;
   dbdth2.Text:= DateToStr(dtp1.Date);
   date:=QuotedStr(unit5.form5.dbdth2.text);
   sum:=QuotedStr(unit5.form5.dbdth1.text);
 
   with Unit2.DataModule2.qry  do
   begin
     Close;
     SQL.Clear;
     SQL.Add('exec add_contract' +IntToStr(cust_id)+','+IntToStr(sup_id)+','+date+','+sum);
     Execsql;
     Unit2.DataModule2.ContractQuery.Active:=False;
     Unit2.DataModule2.ContractQuery.Active:=true;
   end;
end;
Но там тоже ошибка: неправильный синтаксис около конструкции ","
Помогите пожалуйста!
0
2 / 2 / 1
Регистрация: 23.01.2013
Сообщений: 52
28.03.2013, 22:52  [ТС] 4
Ну что...никто не поможет???
0
58 / 86 / 24
Регистрация: 27.02.2010
Сообщений: 397
28.03.2013, 23:20 5
Delphi
1
Parameters.ParamByName('c_sum ').Value
Явно лишний пробел в указании параметра 'c_sum '.
1
2 / 2 / 1
Регистрация: 23.01.2013
Сообщений: 52
28.03.2013, 23:43  [ТС] 6
Цитата Сообщение от kwinto Посмотреть сообщение
Delphi
1
Parameters.ParamByName('c_sum ').Value
Явно лишний пробел в указании параметра 'c_sum '.
Спасибо, помогло, но теперь новая ошибка: Ошибка при преобразовании типа данных nvarchar к date
Не подскажите,что не так?

Добавлено через 9 минут
Получилось! Заменила строку
Цитата Сообщение от Яна44 Посмотреть сообщение
Parameters.ParamByName('с_date').Value := dtp1.Date;
на
Parameters.ParamByName('c_date').Value := DateToStr(unit5.Form5.dtp1.Date);
Вроде работает!
0
58 / 86 / 24
Регистрация: 27.02.2010
Сообщений: 397
28.03.2013, 23:46 7
замените переменную date: string; скажем на dt: string;
У Вас цепляется ф-ция
Delphi
1
function Date: TDateTime;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2013, 23:46
Помогаю со студенческими работами здесь

Ошибка преобразования значения varchar в тип данных int
Доброго времени суток! Есть три простые таблицы в базе Shop: первая - All_buy с данными о...

Ошибка при преобразовании int в fpos_t
Всем привет, ругается на строчке приравнивания int Start_Pos_UnSorted_File; fpos_t position;...

"Ошибка при преобразовании типа данных nvarchar к bigint"
таблица create table поставщик (код_поставщика int not null primary key identity(1,1),...

Ошибка преобразования значения varchar в тип данных int"
Нужно цифру из выбранного ряда в dataGridView1 разделить на 3 и вывести результат в текстбокс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru