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

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

Проблема с выполнением запросов в цикле [D6, MySQL]


TEXHAPb ©   (2004-03-15 16:14:00) 

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

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

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


ek   (2004-03-15 18:16:00) [1]

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


alex_bredin   (2004-03-15 17:41:00) [2]

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


TEXHAPb   (2004-03-15 16:57:00) [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:00) [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:00) [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:54:00) [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 16:19:00) [7]


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

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


Плохиш   (2004-03-15 16:17:00) [8]

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


Наверх

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