Форум: "Базы";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
ВнизTADODataSet.CreateParameter в ран-тайме Найти похожие ветки
← →
Ega23 © (2005-11-25 13:13) [0]В чём может быть проблема?
Есть запрос, крутящийся в отдельном потоке. Берёт данные из БД по параметру (больше, чем некая дата) и кладёт их в потоко-защищённую очередь. Время исполнения запроса надо максимально уменьшить.
Если динамически генерить запрос - всё прекрасно работает:
procedure TEventDataThread.Execute;
begin
while not Terminated do
begin
FADOQuery.Close;
FADOQuery.CommandText:="exec S_EventProtoProc @ActNam="Sel", @DatIn="+ValX(LastDatIn);
try
FADOQuery.Open;
FADOQuery.First;
LastDatIn:=FADOQuery.FieldByName("DatIn").AsDateTime;
FQueue.Push(FADOQuery);
finally
//Suspend;
Sleep(100);
end;
end;
end;
ValX - перевод даты в SQL-формат.
Воспользовался рекомендацией sniknic, сделал ему Prepare и попытался перевести на параметры:
constructor TEventDataThread. Create(aConnectionString:String; Queue:TEventDataQueue);
begin
...........
FADOQuery:=TADOdataSet.Create(nil);
FADOQuery.Connection:=ADOConnection;
FADOQuery.CommandText:="exec S_EventProtoProc @ActNam="Sel", @DatIn=:DatIn";
FADOQuery.Parameters.CreateParameter("DatIn",ftDateTime, pdInput,8,Null);
FADOQuery.Prepared := true;
....
В execute:
while not Terminated do
begin
FADOQuery.Close;
//FADOQuery.CommandText:="exec S_EventProtoProc @ActNam="Sel", @DatIn="+ValX(LastDatIn);
FADOQuery.Parameters.ParamByName("DatIn").Value:=LastDatIn;
try
FADOQuery.Open;
На Open ругается -
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
Что делаю не так?
← →
sniknik © (2005-11-25 13:22) [1]строка конекта похоже неправильная. говорят проверь каждое значение.
и для уверености
FADOQuery:=TADOdataSet.Create(nil);
FADOQuery.ParamCheck:= false;
FADOQuery.CommandText:="exec S_EventProtoProc @ActNam="Sel", @DatIn=?";
...
либо не создавай параметр сам (т.е. вместо этого убери строку с CreateParameter).
← →
Ega23 © (2005-11-25 13:28) [2]
> строка конекта похоже неправильная. говорят проверь каждое
> значение.
>
Строка правильная. Я тоже сначала на это подумал. Изголялся всячески. Но первый вариант-то - работает!
>FADOQuery.CommandText:="exec S_EventProtoProc @ActNam="Sel", @DatIn=?";
Это уже я не понял. Что ты имел ввиду?
← →
sniknik © (2005-11-25 13:29) [3]и еще, если надо ускорить циклы, обычно избавляюсь от всяких "по имени" (в основном для полей, но тут...) т.е.
вместо
> FADOQuery.Parameters.ParamByName("DatIn").Value:=LastDatIn;
в циклах, ставлю перед
DatInPar:= FADOQuery.Parameters.ParamByName("DatIn");
в цикле уже
DatInPar.Value:= LastDatIn;
DatInPar тут естественно типа параметр. и + добавляю with, хотя и нелюблю его ;). (в смысле использовать... а вы что подумали?)
← →
Плохиш © (2005-11-25 13:31) [4]
> FADOQuery.Prepared := true;
Эта строка пересоздаёт список параметров заново.
Попробуй после неё установить тип параметру.
← →
Ega23 © (2005-11-25 13:31) [5]
> в циклах, ставлю перед
> DatInPar:= FADOQuery.Parameters.ParamByName("DatIn");
> в цикле уже
> DatInPar.Value:= LastDatIn;
> DatInPar тут естественно типа параметр. и + добавляю with,
> хотя и нелюблю его ;).
Это я, безусловно, позже сделаю. Сейчас общей функциональности добиться надо. А она пока хромает... :о)
← →
sniknik © (2005-11-25 13:32) [6]> Это уже я не понял. Что ты имел ввиду?
ты же сам пытаешся создать параметр, так? ну значит надо отключить автосоздание и пользоваться "канонической" формой запроса.
← →
sniknik © (2005-11-25 13:34) [7]Плохиш © (25.11.05 13:31) [4]
да еще и это. или убрать строку с препаред.
← →
Ega23 © (2005-11-25 13:39) [8]Так, с ParamCheck:=False уже лучше. Уже всего лишь Инсоррект синтакс :о)
Про Paramcheck я как-то и забыл...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.048 c