Главная страница
    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.035 c
14-1095408271
Prohodil Mimo
2004-09-17 12:04
2004.10.03
Что более правильно: предопределённый массив или CASE?


4-1093175700
banderas
2004-08-22 15:55
2004.10.03
net send


3-1094644138
DA
2004-09-08 15:48
2004.10.03
Запрос с параметром в MSSQL


14-1095332722
СатирЪ
2004-09-16 15:05
2004.10.03
Уникальный номер


14-1095355650
lipskiy
2004-09-16 21:27
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский