Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
2 / 2 / 1
Регистрация: 23.01.2013
Сообщений: 52

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

26.03.2013, 22:35. Показов 5666. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2013, 22:35
Ответы с готовыми решениями:

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

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

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

6
 Аватар для rdama
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
27.03.2013, 01:24
Вместо
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  [ТС]
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  [ТС]
Ну что...никто не поможет???
0
86 / 86 / 24
Регистрация: 27.02.2010
Сообщений: 397
28.03.2013, 23:20
Delphi
1
Parameters.ParamByName('c_sum ').Value
Явно лишний пробел в указании параметра 'c_sum '.
1
2 / 2 / 1
Регистрация: 23.01.2013
Сообщений: 52
28.03.2013, 23:43  [ТС]
Цитата Сообщение от 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
86 / 86 / 24
Регистрация: 27.02.2010
Сообщений: 397
28.03.2013, 23:46
замените переменную date: string; скажем на dt: string;
У Вас цепляется ф-ция
Delphi
1
function Date: TDateTime;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2013, 23:46
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru