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


Автор: Lunatikus 16.6.2009, 14:14
Здравствуйте.
MS SQL 2005 и Delphi 7.

Код

q.Close;
q.SQL.Clear;

q.SQL.Add('SELECT SUM(prognoz) sum FROM sum_prognoz_4 ');
q.SQL.Add(' WHERE filial_name=:filial_name AND art_msc=:art_msc ');
q.SQL.Add('       AND data>=(dateadd(month,datediff(month,0,getdate())+2+:srok2m,0)+:srok2)');
q.SQL.Add('       AND  data<(dateadd(month,datediff(month,0,getdate())+3+:srok3m,0)+:srok3)');


далее в цикле я присваиваю параметрам значения и вызываю метод Open.
параметры, на которые ругается: srok2m,srok3m. Они челочисленного типа.

Однако получаю ошибку при выполнении запроса:
"argument data type datetime is invalid for argument 2 af dateadd function"
На форуме SQL мне сказали, что параметры надо объявлять через @, чтобы их можно было использовать в функции SQL-языка "dateadd()".
Но я все время использовал двоеточие и читал, что это и есть использование параметров.

спасибо за уделенное время

Автор: Данкинг 16.6.2009, 15:45
Ты же в данном случае подставляешь параметры именно в Query, при чём здесь SQL-сервер. Значит, двоеточия используешь, как обычно.

Автор: Lunatikus 16.6.2009, 15:49
тогда из-за чего может происходить такая ошибка?

Автор: Данкинг 16.6.2009, 22:59
Цитата(Lunatikus @ 16.6.2009,  16:49)
тогда из-за чего может происходить такая ошибка?

Я так понимаю, что ошибку пишет сам SQL-сервер. А почему - уж не знаю, я в нём не силён. Попробуй тот же запрос непосредственно на сервере выполнить.

Автор: flomaster 16.6.2009, 23:11
Значения (тип значений), присвоенные параметрам не подходят.
Для датовых параметров очень важно использовать:
Код

ParamByName().DataType:= ftDate;// или  ftTime, ftDateTime,

            

Автор: Lunatikus 17.6.2009, 09:20
Данкинг,пробовал. Объявлял параметры, присваивал им целочисленное значение и все работало.

flomaster, тип передаваемого значения параметра - целочисленный, почему тут надо вручную присваивать ftDatetime?
Ведь в SQL-запросе это целое число прибавляется к дате. Если я присвою ему тип даты, сможет ли корректно сработать функция dateadd?

Автор: flomaster 17.6.2009, 12:08
Ага, пока читал сообщение об ошибке, забыл что они целые... 
Код

"argument data type datetime is invalid for argument 2 af dateadd function"

Тогда читаем еще раз "Аргумент типа datetime не подходит для второго аргумента функции dateadd"
Т.е. во втором аргументе, а именно 
Код

datediff(...)+... 

образуется дата. Убираем дату и запускаем.
Либо избавляемся от datediff, что вероятно будет не достаточно.
Либо избавляемся от дробной части и преобразуем к целому.

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