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

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

Запрос к MSSQL через ADOQuery c параметрами


dmitry501 ©   (2005-05-06 11:08:00) 

Здравствуйте. Передаю запрос SQL серверу примерно вот так:
frmDM.queryAcc.SQL.Add('SELECT State, PavilionID, PacketType, CreateTime, TimeToCreate, TimetoSend, FileSize');
frmDM.queryAcc.SQL.Add('FROM DataPackets WHERE (CreateTime BETWEEN :p1 AND :p2) AND (PavilionID IN (:p3)) AND (State = :p4)');

frmDM.queryAcc.Parameters[0].DataType:= ftDate;
frmDM.queryAcc.Parameters[1].DataType:= ftDate;
frmDM.queryAcc.Parameters[2].DataType:= ftString;
frmDM.queryAcc.Parameters[3].DataType:= ftString;

frmDM.queryAcc.Parameters[0].Value := dtpBegin.Date;
frmDM.queryAcc.Parameters[1].Value := dtpEnd.Date;
frmDM.queryAcc.Parameters[2].Value := '7, 8';
frmDM.queryAcc.Parameters[3].Value := '2';


При выполнении ругается - "Syntax error converting the varchar value '7, 8' to a column of data type int"
Причем в Enterprise Manager запрос

SELECT     State, PavilionID, PacketType, CreateTime, TimeToCreate, TimetoSend, FileSize
FROM         DataPackets
WHERE     (CreateTime BETWEEN ' 05/05/ 2005 ' AND ' 05/06/ 2005 ') AND (PavilionID IN (7; 8)) AND (State = 2)

нормально возвращает строки.
Ткните, пожалуйста, носом а ошибку....


dmitry501   (2005-05-06 11:35:00) [1]

Да, спасибо, посмотрел.

SET FMTONLY ON select CreateTime,CreateTime,PavilionID,State from  DataPackets SET FMTONLY OFF

SET FMTONLY ON SELECT State, PavilionID, PacketType, CreateTime, TimeToCreate, TimetoSend, FileSize
FROM DataPackets WHERE (CreateTime BETWEEN '01-01-1992 01:01:01:000' AND '01-01-1992 01:01:01:000') AND (PavilionID IN (0)) AND (State = 0)
SET FMTONLY OFF

exec sp_executesql N'SELECT State, PavilionID, PacketType, CreateTime, TimeToCreate, TimetoSend, FileSize
FROM DataPackets WHERE (CreateTime BETWEEN @P1 AND @P2) AND (PavilionID IN (@P3)) AND (State = @P4)
', N'@P1 datetime,@P2 datetime,@P3 varchar(6),@P4 varchar(4)', 'May  4 2005  1:51:40:000PM', 'May  4 2005  1:52:03:000PM', '''7, 8''', '2'


Кроме всего прочего, еще и в дату не преобразовал, а  оставил DateTime....


Danilka   (2005-05-06 11:20:00) [2]

[3] Ozone ©   (06.05.05 11:16)
нет, не прокатывала.

а по теме, твой запрос с параметрами и вот-этот:
SELECT     State, PavilionID, PacketType, CreateTime, TimeToCreate, TimetoSend, FileSize
FROM         DataPackets
WHERE     (CreateTime BETWEEN ' 05/05/ 2005 ' AND ' 05/06/ 2005 ') AND (PavilionID IN (7; 8)) AND (State = 2)


это две разные вещи. запусти Profiler и увидишь, что на самом деле уходит на сервер.


Polevi   (2005-05-06 11:19:00) [3]

ups, sorry


dmitry501   (2005-05-06 11:18:00) [4]

Что ж, спасибо. Жаль.


Polevi   (2005-05-06 11:18:00) [5]

frmDM.queryAcc.Parameters[2].Value := QuotedStr('7, 8');


Ozone   (2005-05-06 11:16:00) [6]

>  [1] Nikolay M. ©   (06.05.05 11:13)

В Oracle такая конструкция прокатывала


Johnmen   (2005-05-06 11:15:00) [7]

Устойчивая тема :)
Фактически :p3 не параметр, а макроподстановка. Делай выводы...


Nikolay M.   (2005-05-06 11:13:00) [8]


> Ткните, пожалуйста, носом а ошибку....



>   IN(:p3)


> frmDM.queryAcc.Parameters[2].Value := '7, 8';

Через параметры не прокатит.


Наверх

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