Вниз
Скачать: CL | DM;

Проблема с выполнением запросов в цикле   Найти похожие ветки 

← →
TEXHAPb   (2004-03-15 16:14) [0]

Используется компонент TQuery
В цикле обращаются к функции UpdateRec, которая делает следующее:
1. Устанавливает значение параметров запроса (несколько ParamByName)
2. Исполняет запрос (Open)

Проблема: Оказалось, что перед выполнением Open, из внешнего цикла заново выбывается функция UpdateRec, и занова вызывается установка параметров так, что перед исполнением Open запрос уже содержит неправильные данные.

Как можно этого избежать?


← →
Плохиш   (2004-03-15 16:17) [1]

Ошибка в 17й строке


← →
alex_bredin ©   (2004-03-15 16:19) [2]


> Плохиш   (15.03.04 16:17) [1]
> Ошибка в 17й строке

перевожу: покажите код


← →
TEXHAPb   (2004-03-15 16:54) [3]

Вот фрагмент кода. Забыл добавить, что class TLogManager - наследник класса TServerSocket, может это существенно.

procedure TLogManager.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var S:TLogString;
   EndRec:Integer;
begin
  ReadBuf:=ReadBuf+Socket.ReceiveText;
  EndRec:=Pos("-",ReadBuf);
  S:=TLogString.Create;
  while EndRec>0 do
   begin
    ...
         UpdateRec(S);  // <- Вызо функции
    ...
     Delete(ReadBuf,1,EndRec);
    EndRec:=Pos("-",ReadBuf);
   end;
  S.Free;
end;

procedure TLogManager.UpdateRec(Rec: TLogString);
begin
 PrepareData(SelectQuery,Rec);
 SelectQuery.Open;
 if SelectQuery.Fields[0].AsInteger=0 then
  ...
end;

procedure TLogManager.PrepareData(Q: TQuery; S:TLogString);
begin
 Q.ParamByName("ext").AsString:=S.Ext;
 Q.ParamByName("code").AsString:=S.AccCode;
....
end;


← →
TEXHAPb   (2004-03-15 16:56) [4]

Вот фрагмент кода. Забыл добавить, что class TLogManager - наследник класса TServerSocket, может это существенно.

procedure TLogManager.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var S:TLogString;
   EndRec:Integer;
begin
  ReadBuf:=ReadBuf+Socket.ReceiveText;
  EndRec:=Pos("-",ReadBuf);
  S:=TLogString.Create;
  while EndRec>0 do
   begin
    ...
         UpdateRec(S);  // <- Вызо функции
    ...
     Delete(ReadBuf,1,EndRec);
    EndRec:=Pos("-",ReadBuf);
   end;
  S.Free;
end;

procedure TLogManager.UpdateRec(Rec: TLogString);
begin
 PrepareData(SelectQuery,Rec);
 SelectQuery.Open;
 if SelectQuery.Fields[0].AsInteger=0 then
  ...
end;

procedure TLogManager.PrepareData(Q: TQuery; S:TLogString);
begin
 Q.ParamByName("ext").AsString:=S.Ext;
 Q.ParamByName("code").AsString:=S.AccCode;
....
end;


← →
TEXHAPb   (2004-03-15 16:56) [5]

Вот фрагмент кода. Забыл добавить, что class TLogManager - наследник класса TServerSocket, может это существенно.

procedure TLogManager.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var S:TLogString;
   EndRec:Integer;
begin
  ReadBuf:=ReadBuf+Socket.ReceiveText;
  EndRec:=Pos("-",ReadBuf);
  S:=TLogString.Create;
  while EndRec>0 do
   begin
    ...
         UpdateRec(S);  // <- Вызо функции
    ...
     Delete(ReadBuf,1,EndRec);
    EndRec:=Pos("-",ReadBuf);
   end;
  S.Free;
end;

procedure TLogManager.UpdateRec(Rec: TLogString);
begin
 PrepareData(SelectQuery,Rec);
 SelectQuery.Open;
 if SelectQuery.Fields[0].AsInteger=0 then
  ...
end;

procedure TLogManager.PrepareData(Q: TQuery; S:TLogString);
begin
 Q.ParamByName("ext").AsString:=S.Ext;
 Q.ParamByName("code").AsString:=S.AccCode;
....
end;


← →
TEXHAPb   (2004-03-15 16:57) [6]

Вот фрагмент кода. Забыл добавить, что class TLogManager - наследник класса TServerSocket, может это существенно.

procedure TLogManager.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var S:TLogString;
   EndRec:Integer;
begin
  ReadBuf:=ReadBuf+Socket.ReceiveText;
  EndRec:=Pos("-",ReadBuf);
  S:=TLogString.Create;
  while EndRec>0 do
   begin
    ...
         UpdateRec(S);  // <- Вызо функции
    ...
     Delete(ReadBuf,1,EndRec);
    EndRec:=Pos("-",ReadBuf);
   end;
  S.Free;
end;

procedure TLogManager.UpdateRec(Rec: TLogString);
begin
 PrepareData(SelectQuery,Rec);
 SelectQuery.Open;
 if SelectQuery.Fields[0].AsInteger=0 then
  ...
end;

procedure TLogManager.PrepareData(Q: TQuery; S:TLogString);
begin
 Q.ParamByName("ext").AsString:=S.Ext;
 Q.ParamByName("code").AsString:=S.AccCode;
....
end;


← →
alex_bredin ©   (2004-03-15 17:41) [7]

ну хватит пока коду))


← →
ek   (2004-03-15 18:16) [8]

может перед PrepareData(SelectQuery,Rec);
вставить SelectQuery.Close;?



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.031 c
4-1075123907
Igit
2004-01-26 16:31
2004.04.11
Как убить процесс созданный?


1-1080117589
alex123
2004-03-24 11:39
2004.04.11
Как запретить смену страницы а PageControl


14-1082017686
MPS
2004-04-15 12:28
2004.04.11
Хуки, хуки, и ещё раз Хуки


4-1079437946
tany
2004-03-16 14:52
2004.04.11
функция имитирующая нажатие клавиши


3-1081669851
ppcat
2004-04-11 11:50
2004.04.11
Проект, базы данных




   Наверх