Форум: "Основная";
Текущий архив: 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