Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
3-1132681869
vladik
2005-11-22 20:51
2006.01.22
сколько записей обработано запросом


6-1128587101
Pul
2005-10-06 12:25
2006.01.22
CONNECTION CLOSED GRACEFULLY


14-1135337499
Хинт
2005-12-23 14:31
2006.01.22
Стандартную иконка Delphi7


8-1123878872
tazik
2005-08-13 00:34
2006.01.22
Плавные переходы с помощью BassPLayer a


2-1136460168
Vek
2006-01-05 14:22
2006.01.22
Как сделать чтобы открывался текстовый файл в блокноте