Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при использовании параметров в ADOQuery 
:(
    Опции темы
stark3
Дата 5.12.2013, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.8.2013

Репутация: нет
Всего: нет



Приветствую

При запуске из 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 все так же
PM MAIL   Вверх
kami
Дата 5.12.2013, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



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

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

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

Это сообщение отредактировал(а) kami - 5.12.2013, 15:29
PM MAIL WWW   Вверх
stark3
Дата 5.12.2013, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.8.2013

Репутация: нет
Всего: нет



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? Но это как-то не по феншую((


Это сообщение отредактировал(а) stark3 - 5.12.2013, 16:03
PM MAIL   Вверх
kami
Дата 5.12.2013, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



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

Потому что Param.Value - это Variant, а он примет почти всё что угодно и попытается преобразовать в то, что надо.
PM MAIL WWW   Вверх
Агрох
Дата 5.12.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Попробуй вставлять дату прямо в текст запроса, без использования параметра, преобразовав её в строку.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
stark3
Дата 5.12.2013, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.8.2013

Репутация: нет
Всего: нет



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 в америкосовский формат СУБД
PM MAIL   Вверх
Агрох
Дата 5.12.2013, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Ткну пальцем в небо.
Разницы по идее быть не должно, но всё же. Вместо ADOQuery_Eh1.Active:=true; напиши ADOQuery_Eh1.Open;
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
kami
Дата 5.12.2013, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



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


PM MAIL WWW   Вверх
Агрох
Дата 5.12.2013, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Точно. Now же возвращает datetime а не date. kami, ты об этом?
Только наверно лучше будет datetime в delphi преобразовать в date, а не в таблице использовать datetime вместо date.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
stark3
Дата 5.12.2013, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.8.2013

Репутация: нет
Всего: нет



Агрох, без изменений

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;

PM MAIL   Вверх
Агрох
Дата 5.12.2013, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



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

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

Код

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

--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
kami
Дата 5.12.2013, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Протестировал у себя:
Код

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. Иначе при автоматическом распознавании типов полей опять может всплыть бяка.
PM MAIL WWW   Вверх
БелАмор
Дата 5.12.2013, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: нет
Всего: 17



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


Загляните сюда:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=56405
(См. сообщение от 25-10-2007 16:48)
PM   Вверх
stark3
Дата 6.12.2013, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.8.2013

Репутация: нет
Всего: нет



Цитата(Агрох @ 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)

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

Да и дело уже не в "работает-не работает", а почему возникает эта ошибка
PM MAIL   Вверх
stark3
Дата 6.12.2013, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.8.2013

Репутация: нет
Всего: нет



Всем спасибо, похоже выяснил в чем дело

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

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

Это сообщение отредактировал(а) stark3 - 6.12.2013, 09:01
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1360 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.