Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

’’ is not a valid integer value [D6, MySQL]


RayRom ©   (2004-04-03 18:56:00) 

Необходима помощь по ошибке или ее устранении.
Использую МуSQL 4.0.17 и библиотеку ZeosDbo 5.3.4, уже год пытаюсь понять ее причину, выскакивает не часто, но метко.

MyQuery2.Close;
MyQuery2.Sql.Clear;
MyQuery2.Sql.Add('select * from texosmotr where nomznak like "' + ZDBGrid1.DataSource.DataSet.FieldByName('nom_znak').AsString +  '" and typeamt = ' + DM.MyQuery.FieldByName('type_amt').AsString + ' and year(texosmotr.date)=year(now());');
MyQuery2.Open;
// Вот здесь происходит ошибка « ’’ is not a valid integer value»

Запрос получается типа
select * from texosmotr
where nomznak like "Ж6918ДО" and typeamt = 1 and year(texosmotr.date)=year(now());

Структура таблицы:
Поле Тип         Ноль По умолчанию
nkard   int(9)          Нет  
date   date         Нет  0000-00-00
nomznak varchar(8) Да  NULL
vkub   smallint(5) Нет  0
yearpay tinyint(1) Нет  0
typeamt tinyint(1) Нет  0
nalog   float(8,2) Нет  0.00
tosp   float(5,2) Нет  0.00
diag   float(5,2) Нет  0.00
comp   float(5,2) Нет  0.00
talonto float(5,2) Нет  0.00
summ   float(8,2) Нет  0.00
lgots   char(1)         Нет  N
typelg  tinyint(1) Нет  0
50pr   char(1)         Нет  N
LUD   varchar(30) Да  NULL
talon   int(11)         Нет  0

Использую для редактирования компоненты:
DBCtrlGrid1: TDBCtrlGrid;
   DBText2: TDBText;
   DBText3: TDBText;
   DBCheckBox1: TDBCheckBox;
   DBCheckBox2: TDBCheckBox;
   DBEdit2: TDBEdit;
   DBText1: TDBText;
   DBComboBox1: TDBComboBox;
   DBEdit1: TDBEdit;
   DBComboBox3: TDBComboBox;
   DBComboBox4: TDBComboBox;
   DBComboBox5: TDBComboBox;
   DBText4: TDBText;
   DBText5: TDBText;
   RxDBComboBox1: TRxDBComboBox;
   DBEdit3: TDBEdit;
   RxDBComboBox2: TRxDBComboBox;

Надеюсь что полную информацию дал.
Мастера кто что может сказать по этому поводу?!!!


sniknik   (2004-04-10 23:16:00) [1]

даже если нужна дата сервера, то всеравно лутше использовать такой принцип (> < = between) с датой, а не результат функции year(texosmotr.date)=year(now() вот здесь. иначе индекс не используется. (как узнать начало года в функциях MySql я к сожалению не знаю поэтому и привел пример с параметром, хотя видел что у тебя now(), ну у тебя есть дока - посмотри)


RayRom   (2004-04-10 18:19:00) [2]

Спасибо всем кто откликнулся, особенно sniknik .
Нашол ошибку отключая по очереди компоненты ввода.
Она оказалась в DBCheckBox2: TDBCheckBox;
Не правильно указал значения на Истину и Лож в поле базы.
Да кстати sniknik твой вариант мне не очень пождходит особенно с датой, дело втом что один вид транспорта проходит раз в 2 года техосмотр а другой каждый год.
И представь если на компе клиента год другой будет стоять и что тогда, по этому я и использую дату сервера.


sniknik   (2004-04-04 23:33:00) [3]

ладно давай по другому, сделай так и ошибки не будет, и плюс скорость при наличии индексов соответствующих возрастет

MyQuery2.Close;
MyQuery2.Sql.Clear;
MyQuery2.Sql.Add('select * from texosmotr where '+
                  'typeamt = :typeamt and '+
                  'texosmotr.date >= :txDate and '+
                  'nomznak = :nomznak'););
MyQuery2.ParamByName('typeamt').AsInteger:= DM.MyQuery.FieldByName('type_amt').AsInteger;
MyQuery2.ParamByName('txDate').AsDateTime:= StartOfTheYear(now());
MyQuery2.ParamByName('nomznak').AsString:= ZDBGrid1.DataSource.DataSet.FieldByName('nom_znak').AsString;
MyQuery2.Open;

так надеюсь понятнее чем про преобразованиях в запросе толковать.


RayRom   (2004-04-04 19:24:00) [4]

Так короче для sniknik если чел проходил техосмотр в прошлом году то в ентом году он дожен пройти по новойо, а ошибка ета возникает тогда когда чел неколько дней н6азад пришол получил простыню для прохождения техосмотра то зачем по новой поля заполнят лучше новую карточку распечатать по тем же данным что раньше были введены, а тут длин ошибка возникает!!!


sniknik   (2004-04-04 19:15:00) [5]

> к сождалению у меня накопительная система и данные по ентому клиету за предыдущий год не должны быть видны, это основное и главное, но
> данные за предыдущие года должны быть.
какая разница? если texosmotr.date ты передаеш изне, из своей программы и текущую(now()) тоже узнать не проблема, и в запросе везде между условиями and стоит, т.е. если бы ты туда сразу результат сравнений передал trye/false было бы тоже самое, и при false запрос ничего не вернет, ну вот это то и лишнее, в этом случае запрос вообще не нужен (все одно пустой будет) только лишняя обработка.  

> Да кстати когда делаю запуск с отладкой то возникает исключение EConvertError в модуле DB
ну твои же данные конвертит, неужели посмотреть нельзя что он пытается сконвертить, до ошибки.

> Кстати по поводу одинарной или двойной кавічки то в МуСКЛ єто безразницы, в отличии от Аксеса!!!!
если ты так все по своему понимаеш, то думаю дальнейшие обьяснения бессмысленны. (значит и другое "перевернул")
вроде ясно сказал "аксес к примеру и так и такпонимает"
т.е. select '1"1"1', "2'2'2"
вполне нормальный для аксесса запрос.


RayRom   (2004-04-04 18:58:00) [6]


> > year(texosmotr.date)=year(now())
> вообще из запроса выкинуть, и то и то значение внутрь передается
> ну и обрабатывай с клиента, не сходится - запрос не нужен.

к сождалению у меня накопительная система и данные по ентому клиету за предыдущий год не должны быть видны, это основное и главное, но данные за предыдущие года должны быть.

Да кстати когда делаю запуск с отладкой то возникает исключение EConvertError в модуле DB.

Кстати по поводу одинарной или двойной кавічки то в МуСКЛ єто безразницы, в отличии от Аксеса!!!!


sniknik   (2004-04-04 12:47:00) [7]

’’is not a valid integer value
явно же говорит '' невалидное целочисленное значение. значит временами (хотя и говориш невозможно) проходит туда пустое значение. проверяй какждое значение перед заданием в запрос для уверености.

> like "Ж6918ДО"
лутше, если возможно на = переделать, а то индекс не используется  
> year(texosmotr.date)=year(now())
вообще из запроса выкинуть, и то и то значение внутрь передается ну и обрабатывай с клиента, не сходится - запрос не нужен.
> ну и все естественно на параметры переделать

Nikolay M. ©   (04.04.04 12:31) [4]
>> 'select * from texosmotr where nomznak like "
> Должна быть одинарная.
точно? аксес к примеру и так и так понимает, MySQL возможно тоже а то и только ".


Nikolay M.   (2004-04-04 12:31:00) [8]


> 'select * from texosmotr where nomznak like "

Должна быть одинарная.


DevMaster   (2004-04-03 22:19:00) [9]

showmessage(MyQuery2.Sql.Strings[0]); посмотри результат на эране может запрос не верный(где-то кавычку потерял?)

>DM.MyQuery.FieldByName('type_amt').AsString - это тот же Query?


RayRom   (2004-04-03 20:02:00) [10]


> 2. typeamt точно не может быть NULL ?


Нулем он ни когда не бывает только от 1 до 6


Zacho   (2004-04-03 19:31:00) [11]

Не использую ни MySQL, ни Zeos, но могу дать пару советов:
1. Используй параметризированный запрос вместо динамической генерации запроса.
2. typeamt точно не может быть NULL ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо