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

Вниз

Ошибка в потоке   Найти похожие ветки 

 
panov ©   (2004-09-16 20:27) [0]

При динамическом создании 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;


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


 
jack128 ©   (2004-09-16 20:33) [1]

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

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


 
panov ©   (2004-09-16 20:36) [2]

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


 
jack128 ©   (2004-09-16 20:38) [3]

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


 
panov ©   (2004-09-16 20:44) [4]

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


 
jack128 ©   (2004-09-16 20:48) [5]

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

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


 
panov ©   (2004-09-16 20:54) [6]

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



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

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
3-1094042775
Zyb
2004-09-01 16:46
2004.10.03
Передача Dataset


1-1095192147
Саня
2004-09-15 00:02
2004.10.03
Как сушествить перевод числа?


14-1095069018
Scalder
2004-09-13 13:50
2004.10.03
Общие вопросы по Delphi


4-1093525727
Kniff
2004-08-26 17:08
2004.10.03
Масштабирование окна.


4-1093120848
Getsevich
2004-08-22 00:40
2004.10.03
Закрытие процесса