Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.046 c
14-1095092172
}|{yk
2004-09-13 20:16
2004.10.03
Сабо обозвал Интернет "сборищем бомжей с Бессарабки"


1-1095106051
HydraMarat
2004-09-14 00:07
2004.10.03
Int64 vs Integer


4-1093079315
Arnold
2004-08-21 13:08
2004.10.03
Как узнать количество запущенных процессов???


3-1094220146
Thunder
2004-09-03 18:02
2004.10.03
Импорт txt в таблицу БД


6-1090591822
Skyhawk
2004-07-23 18:10
2004.10.03
Как зайти в систему на удаленном компьютере





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский