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

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

Ошибка в потоке [D6, Win2k]


panov ©   (2004-09-16 20:27:00) 

При динамическом создании TADOConnection в методе потока TThtread.Execute возникает Exception, помогите найти ошибку?

uses 
  Classes,DB, ADODB, SyncObjs,windows,Sysutils;

type

 TLongQuery = class(TThread)
 private
   FDB: TADOConnection;
   Q: TADOQuery;
   FWait: Boolean;
   FQueryStr: String;
   FError: Integer;
   FEvent,FEventWaitComplete: TEvent;
   CS: RTL_CRITICAL_SECTION;
 protected
   procedure Execute; override;
 public
   constructor Create;
   destructor Destroy; override;
   procedure ExecQuery(const aQueryStr: String;aWait: Boolean=True);
   property LastError: Integer read FError;
 end;

implementation

uses Proc;

destructor TLongQuery.Destroy;
begin
 DeleteCriticalSection(CS);
 FEvent.Free;
 FEventWaitComplete.Free;
 FEventWaitComplete := nil;
 FEvent := nil;
 if Assigned(Q) then Q.Free;
 if Assigned(FDB) then FDB.Free;
end;

constructor TLongQuery.Create;
begin
 inherited Create(True);
 FreeOnTerminate := True;
 FError := 0;
 FEvent := TEvent.Create(nil, True, False,'');
 FEventWaitComplete := TEvent.Create(nil, True, False,'');
 Resume;
end;

procedure TLongQuery.ExecQuery(const aQueryStr: String;aWait: Boolean=True);
begin
 EnterCriticalSection(CS);
 FQueryStr := Trim(aQueryStr);
 FError := 0;
 FWait := aWait;
 FEvent.SetEvent;
 if FWait then FEventWaitComplete.WaitFor(Infinite);
 LeaveCriticalSection(CS);
end;

procedure TLongQuery.Execute;
var
 s: String;
 wr: TWaitResult;
begin
 InitializeCriticalSection(CS);
 EnterCriticalSection(CS);
 try
    FDB := TADOConnection.Create(nil);
   FDB.Name := 'ADOC_';
   s := GetParmStr('FDB','Provider');
   if s='' then
   begin
     s := 'SQLOLEFDB.1';
     WriteParmStr('FDB','Provider',s);
   end;

   FDB.Provider := s;

   FDB.ConnectionString := 'Provider='+s+';';

   s := GetParmStr('FDB','Persist Security Info');
   if s='' then
   begin
     s := 'False';
     WriteParmStr('FDB','Persist Security Info',s);
   end;
   FDB.ConnectionString := FDB.ConnectionString+'Persist Security Info='+s+';';

   s := GetParmStr('FDB','User ID');
   if s='' then
   begin
     s := 'wg';
     WriteParmStr('FDB','User ID',s);
   end;
   FDB.ConnectionString := FDB.ConnectionString+'User ID='+s+';';

   s := GetParmStr('FDB','Initial Catalog');
   if s='' then
   begin
     s := 'wgFDB';
     WriteParmStr('FDB','Initial Catalog',s);
   end;
   FDB.ConnectionString := FDB.ConnectionString+'Initial Catalog='+s+';';

   s := GetParmStr('FDB','Data Source');
   if s='' then
   begin
     s := 'SRVBASE';
     WriteParmStr('FDB','Data Source',s);
   end;
   FDB.ConnectionString := FDB.ConnectionString+'Data Source='+s;

   FDB.Open;
   Q := TADOQuery.Create(nil);
   Q.Connection := FDB;
 except
   FError := -1;
   Terminate;
 end;
 LeaveCriticalSection(CS);

 while not Terminated do
 begin
   wr := FEvent.WaitFor(1000);
   if wr=wrTimeout then Continue;
   Q.SQL.Text := FQueryStr;
   try
//      if UpperCase(Copy(FQueryStr,1,4))='SELE'
//        then Q.Open
//        else Q.ExecSQL;
     Q.ExecSQL;
   except
     FError := -2;
   end;
   if FWait then FEventWaitComplete.SetEvent;
   FEvent.ResetEvent;
 end;

 { Place thread code here }
end;


Ошибка возникает на выделенной жирным шрифтом строке.


panov   (2004-09-16 20:54:00) [1]

>jack128 ©   (16.09.04 20:48) [5]
Да нет, тоже был в Execute-(


jack128   (2004-09-16 20:48:00) [2]

panov ©   (16.09.04 20:44) [4]
Снова добавил вызов CoInitialize, Ошибка пропала

может раньше он вызов) стоял в  constructor TLongQuery.Create; ..


panov   (2004-09-16 20:44:00) [3]

>jack128 ©   (16.09.04 20:38) [3]
Честно говоря, я в недоумении...
Снова добавил вызов CoInitialize, Ошибка пропала.
Заодно еще нашел ошибки - уже в данных.
Спасибо за помощь, все-таки форум сильно иногда помогает-)


jack128   (2004-09-16 20:38:00) [4]

jack128 ©   (16.09.04 20:33) [1]
Не помешал бы класс и тект ошибки,


panov   (2004-09-16 20:36:00) [5]

CoInitialize выполнял при попытках найти ошибку, то же самое происходит.


jack128   (2004-09-16 20:33:00) [6]

Не помешал бы класс и тект ошибки, но наверника нужно инициализировать СОM

procedure TLongQuery.Executeж
begin
 CoInitialize;
 try
   // Твой код
 finally
   CoUninitialize;
 end;
end;


Наверх

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