Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > ошибка при использовании параметров в ADOQuery


Автор: stark3 5.12.2013, 14:30
Приветствую

При запуске из Delphi (F9) ошибка:
"Project Project1.exe raised exception class EOleException with message 'Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом'"

Но все работает
При запуске ехе-ка ошибки, соответственно, нет

Код:
Код

ADOQuery_Eh1.Close;
 
 ADOQuery_Eh1.SQL.Text := 'SELECT * FROM proto.stv WHERE (date_montaz > :dat)';
// ADOQuery_Eh1.Parameters.ParseSQL(ADOQuery_Eh1.sql.text, true); так ли нужна эта строка? и без нее все работает и с ней...
 ADOQuery_Eh1.Parameters.ParamByName('dat').Value:=yesterday;
// ADOQuery_Eh1.Parameters.ParamByName('dat').DataType:= ftDate; тоже не влияет
 
 ADOQuery_Eh1.Active:=true;


Перепробовал много разных вариантов, но всегда эта ошибка
Что это может быть?

БД - mysql, для поля date_montaz - тип DATE, при создании параметра вручную в ADOQuery.Parameters все так же

Автор: kami 5.12.2013, 15:27
Цитата(stark3 @  5.12.2013,  14:30 Найти цитируемый пост)
для поля date_montaz - тип DATE

Вот здесь засада. Проходил это, ответ кажется нашел на sql.ru - когда создавался АДО типа DATE не было. Емнип, если попробовать посмотреть на параметры этого запроса в designtime, то типом параметра окажется строка. Для совместимости юзайте DATETIME

Имеется ввиду - ALTER TABLE    ALTER COLUMN тра-ля-ля

Автор: stark3 5.12.2013, 15:45
kami,
напомню, что параметр срабатывает, в гриде даты те, что надо. но... появляется эта ошибка

есть у меня такой тип в таблице, переделал:
  
Код

  ADOQuery_Eh1.Close;
  ADOQuery_Eh1.SQL.Text := 'SELECT * FROM proto.stv WHERE (first_datetime > :dat)';
  ADOQuery_Eh1.Parameters.ParamByName('dat').Value:=now;//strtodate(edit1.text);//yesterday;
  ADOQuery_Eh1.Active:=true;

не помогло

Выяснилось, что ошибка появляется только 1 раз при первом открытии ADOQuery, потом работает без нареканий даже при смене значения даты

То же самое происходит при работе с другими типами - int, string и т.д.

Может ну его в try-finally? Но это как-то не по феншую((

Автор: kami 5.12.2013, 16:02
Цитата(stark3 @  5.12.2013,  15:45 Найти цитируемый пост)
напомню, что параметр срабатывает, в гриде даты те, что надо. но... появляется эта ошибка

Потому что Param.Value - это Variant, а он примет почти всё что угодно и попытается преобразовать в то, что надо.

Автор: Агрох 5.12.2013, 16:16
Попробуй вставлять дату прямо в текст запроса, без использования параметра, преобразовав её в строку.

Автор: stark3 5.12.2013, 16:17
kami,
гм, напрашивается вопрос, как сделать, чтоб ошибка не появлялась? ведь преобразовывает правильно, но долбаная ошибка не исчезает. 
Может это баг среды? или драйвера мускл?

Попробовал так, все равно((

  
Код

  ADOQuery_Eh1.Close;
  ADOQuery_Eh1.SQL.Text := 'SELECT * FROM proto.stv WHERE (date_montaz = :dat)';
  ADOQuery_Eh1.Parameters.ParseSQL(ADOQuery_Eh1.sql.text, true);
  ADOQuery_Eh1.Parameters[0].name:='dat';
  ADOQuery_Eh1.Parameters[0].DataType:=ftdate;
  ADOQuery_Eh1.Parameters[0].Value:=yesterday;
  ADOQuery_Eh1.Active:=true;


Добавлено через 2 минуты и 53 секунды
Агрох,
сейчас у меня так во всем проекте сделано - работает без нареканий
Но хотелось бы использовать параметры, т.к. например, не слишком изящно каждый раз любую дату конвертить через formatdatetime в америкосовский формат СУБД

Автор: Агрох 5.12.2013, 16:26
Ткну пальцем в небо.
Разницы по идее быть не должно, но всё же. Вместо ADOQuery_Eh1.Active:=true; напиши ADOQuery_Eh1.Open;

Автор: kami 5.12.2013, 16:30
Цитата(kami @  5.12.2013,  15:27 Найти цитируемый пост)
Для совместимости юзайте DATETIME
Имеется ввиду - ALTER TABLE    ALTER COLUMN тра-ля-ля


Автор: Агрох 5.12.2013, 16:35
Точно. Now же возвращает datetime а не date. kami, ты об этом?
Только наверно лучше будет datetime в delphi преобразовать в date, а не в таблице использовать datetime вместо date.

Автор: stark3 5.12.2013, 16:37
Агрох, без изменений

kami, я ж пробовал) Ну хорошо, уходим от дат и времени. Это тоже выдает ошибку, но работает:

Код

  ADOQuery_Eh1.Close;
  ADOQuery_Eh1.SQL.Text := 'SELECT * FROM proto.stv WHERE (id_rab = :dat)';
  ADOQuery_Eh1.Parameters.ParseSQL(ADOQuery_Eh1.sql.text, true);
  ADOQuery_Eh1.Parameters.ParamByName('dat').Value:=16;//strtodate(edit1.Text);// yesterday;
  ADOQuery_Eh1.Open;

Автор: Агрох 5.12.2013, 17:03
А если текст запроса и параметры указать заранее, а не динамически тоже самое выдаст? Т.е. кинуть компонент на форму и настроить.

Попробуй ещё все значения параметров при присвоении преобразовывать в стринг.

Код

ADOQuery_Eh1.Parameters.ParamByName('dat').Value:=IntToStr(16);

Автор: kami 5.12.2013, 17:43
Протестировал у себя:
Код

var
  qry: TADOQuery;
  conn: TADOConnection;
begin
  conn:=TADOConnection.Create(nil);
  try
    conn.ConnectionString:=ADODB.PromptDataSource(0, ''); 
    qry:=TADOQuery.Create(nil);
    try
      qry.Connection:=conn;

      qry.SQL.Text:='SELECT * FROM mytable WHERE `StartTime` >= :st_';
      //qry.Parameters.ParseSQL('SELECT * FROM threecars_logistic.dbo_optionsserver where `OptionsServerID` = :id_', True);
      // лишнее - при присвоении SQL запроса ParseSQL выполняется автоматически.
      qry.Parameters.ParamByName('st_').DataType:=ftDateTime;
      qry.Parameters.ParamByName('st_').Value:=EncodeDate(2013, 12, 1);
      qry.Open;
      qry.Close;
    finally
      qry.Free;
    end;
  finally
    conn.Free;
  end;

Я же говорил - нужен тип датавремя. правда, не там хотел поменять, но все же smile
И все равно - рекомендую в самой таблице сделать тип не DATE, а DATETIME. Иначе при автоматическом распознавании типов полей опять может всплыть бяка.

Автор: БелАмор 5.12.2013, 19:40
Цитата(stark3 @  5.12.2013,  15:30 Найти цитируемый пост)
При запуске из Delphi (F9) ошибка:
<...>
Но все работает
При запуске ехе-ка ошибки, соответственно, нет


Загляните сюда:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=56405
(См. сообщение от 25-10-2007 16:48)

Автор: stark3 6.12.2013, 08:31
Цитата(Агрох @ 5.12.2013,  17:03)
А если текст запроса и параметры указать заранее, а не динамически тоже самое выдаст? Т.е. кинуть компонент на форму и настроить.

Попробуй ещё все значения параметров при присвоении преобразовывать в стринг.

Код

ADOQuery_Eh1.Parameters.ParamByName('dat').Value:=IntToStr(16);

Указывал в ADOQuery.SQL текст запроса и параметр в .Parameters в desigbtime - все сработало без ошибки (но мне так не нужно)
В любом другом случае (т.е., например, запрос в динамике, параметр - в query) ошибка((

Строки как только не преобразовывал, все одно...

Добавлено через 2 минуты и 44 секунды
Цитата(kami @ 5.12.2013,  17:43)
Протестировал у себя:
Код

var
  qry: TADOQuery;
  conn: TADOConnection;
begin
  conn:=TADOConnection.Create(nil);
  try
    conn.ConnectionString:=ADODB.PromptDataSource(0, ''); 
    qry:=TADOQuery.Create(nil);
    try
      qry.Connection:=conn;

      qry.SQL.Text:='SELECT * FROM mytable WHERE `StartTime` >= :st_';
      //qry.Parameters.ParseSQL('SELECT * FROM threecars_logistic.dbo_optionsserver where `OptionsServerID` = :id_', True);
      // лишнее - при присвоении SQL запроса ParseSQL выполняется автоматически.
      qry.Parameters.ParamByName('st_').DataType:=ftDateTime;
      qry.Parameters.ParamByName('st_').Value:=EncodeDate(2013, 12, 1);
      qry.Open;
      qry.Close;
    finally
      qry.Free;
    end;
  finally
    conn.Free;
  end;

Я же говорил - нужен тип датавремя. правда, не там хотел поменять, но все же smile
И все равно - рекомендую в самой таблице сделать тип не DATE, а DATETIME. Иначе при автоматическом распознавании типов полей опять может всплыть бяка.

Спасибо, но еще раз повторюсь, давайте забудем про дата-время) Вон с integer тоже не пашет

Добавлено через 6 минут и 37 секунд
Цитата(БелАмор @ 5.12.2013,  19:40)
Цитата(stark3 @  5.12.2013,  15:30 Найти цитируемый пост)
При запуске из Delphi (F9) ошибка:
<...>
Но все работает
При запуске ехе-ка ошибки, соответственно, нет


Загляните сюда:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=56405
(См. сообщение от 25-10-2007 16:48)

Спасибо
Но все же, думаю, это не очень правильно.  Я лучше через прямую подстановку в запрос буду делать, чем отключу сообщения о НЕкритических ошибках

Да и дело уже не в "работает-не работает", а почему возникает эта ошибка

Автор: stark3 6.12.2013, 08:59
Всем спасибо, похоже выяснил в чем дело

Вроде как это глюк ODBC прова - использую драйвер от MySQL и ставлю его на каждый комп

Буду и дальше подставлять в запрос данные, без параметров... К сожалению((

Автор: kami 6.12.2013, 09:28
Цитата(stark3 @  6.12.2013,  08:31 Найти цитируемый пост)
Спасибо, но еще раз повторюсь, давайте забудем про дата-время) Вон с integer тоже не пашет

Зачем забывать? Я проверял на датавремя и на integer, на разных (но реальных) таблицах и тоже с использованием ODBC-драйвера MySQL. Исключений не возникает, в том числе из-под отладчика. Код абсолютно идентичный, ну кроме самого запроса и .DataType.
Win7, MySQL 5.6, ODBC 5.2.6.

Автор: stark3 6.12.2013, 09:42
Цитата(kami @ 6.12.2013,  09:28)
Цитата(stark3 @  6.12.2013,  08:31 Найти цитируемый пост)
Спасибо, но еще раз повторюсь, давайте забудем про дата-время) Вон с integer тоже не пашет

Зачем забывать? Я проверял на датавремя и на integer, на разных (но реальных) таблицах и тоже с использованием ODBC-драйвера MySQL. Исключений не возникает, в том числе из-под отладчика. Код абсолютно идентичный, ну кроме самого запроса и .DataType.
Win7, MySQL 5.6, ODBC 5.2.6.

тааак, а Delphi? у меня хе2

Автор: kami 6.12.2013, 10:03
2010, но это не суть - исключение идет во "внутренностях" АДО

Добавлено через 1 минуту и 4 секунды
Цитата(kami @  6.12.2013,  10:03 Найти цитируемый пост)
исключение идет во "внутренностях" АДО

Чтобы не вносить смуту - исключение о котором говорим идет во "внутренностях" АДО, но в моем коде даже его не возникало.

Добавлено через 1 минуту и 48 секунд
И еще обращаю внимание - у меня нет полей типа DATE, все поля идут как DATETIME

Автор: stark3 6.12.2013, 10:07
Тогда я в тупике...

Результат таков, что всегда появляется эта ошибка, кроме случая, когда пишу запрос в Query.SQL в designTime, но так не приемлимо


Чтоб уж точно плюнуть на это дело, для чистоты совести сделал:
  1. дрова Mysql были 5.2.3, установил свежие - ошибка
  2. Попробовал в другой таблице (вообще без дат) и даже в другой базе - ошибка
  3. Начал с чистого проекта и квериков - ошибка


Буду считать что это глюк ADO W7-пиратка))

kami, вам отдельное спасибо за участие и остальным тоже


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)