![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос к 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';
Через параметры не прокатит.