数据库中保存了多个单位服务器ip、数据库sid、password、database等字段,需要逐个探测各条记录保存的数据连接信息是否可连,若逐个测试耗费时间太长,所以我想用多线程来实现
我是在一窗体的主程序中建立的线程,测试数据连结用的是adoconnection unit U_ljqk;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, RzGroupBar,
Grids, DBGridEh, ExtCtrls, RzListVw, RzCommon, RzButton, RzPanel,
DB, ADODB, inifiles, Menus, CoolTrayIcon, Syncobjs;type
Tf_ljqk = class(TForm)
。 private
{ Private declarations }
public
{ Public declarations }
end;
Thrd = class(TThread)
private
{ Private declarations }
FDBInfo: string;
procedure UpdateUI;
protected
procedure Execute; override;
public
constructor Create(Suspended: Boolean; DBInfo: string);
end;
var
f_ljqk: Tf_ljqk;
implementation
{$R *.dfm}
constructor Thrd.Create(Suspended: Boolean; DBInfo: string);
begin
FDBInfo := DBInfo;
end;
procedure Thrd.Execute;
var
ADO: TADOConnection;
begin
self.FreeOnTerminate:=true;
ADO := TADOConnection.Create(nil);
ADO.Connectionstring := FDBInfo;
ado.CommandTimeout:=10;
ado.ConnectionTimeout:=5;
ado.LoginPrompt:=false;
if ADO.connected then
Synchronize(UpdateUI)
{ Place thread code here }
end;
procedure Thrd.UpdateUI;
begin
f_ljqk.label1.caption := '数库1成功';
end;
procedure Tf_ljqk.FormCreate(Sender: TObject);
var
v_dbstr: string;
begin
with adoquery1 do
begin
while not eof do
begin
v_dbstr:='Provider=SQLOLEDB.1;Password='+trim(FieldByName('loadpwd').AsString)+';'+ 'Persist Security Info=True;User ID='+trim(FieldByName('loadid').AsString)+';Initial Catalog=master'+';Data Source='+trim(FieldByName('ip').AsString);
Thrd.Create(false,v_dbstr);
next;
end;
end;
end;
错误提示 ....THread Error :句柄无效(6)....
我知道参数传递时有错误,但我不知道怎么改,哪位大侠能帮我改改吗 ,兄弟我感激不尽
我是在一窗体的主程序中建立的线程,测试数据连结用的是adoconnection unit U_ljqk;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, RzGroupBar,
Grids, DBGridEh, ExtCtrls, RzListVw, RzCommon, RzButton, RzPanel,
DB, ADODB, inifiles, Menus, CoolTrayIcon, Syncobjs;type
Tf_ljqk = class(TForm)
。 private
{ Private declarations }
public
{ Public declarations }
end;
Thrd = class(TThread)
private
{ Private declarations }
FDBInfo: string;
procedure UpdateUI;
protected
procedure Execute; override;
public
constructor Create(Suspended: Boolean; DBInfo: string);
end;
var
f_ljqk: Tf_ljqk;
implementation
{$R *.dfm}
constructor Thrd.Create(Suspended: Boolean; DBInfo: string);
begin
FDBInfo := DBInfo;
end;
procedure Thrd.Execute;
var
ADO: TADOConnection;
begin
self.FreeOnTerminate:=true;
ADO := TADOConnection.Create(nil);
ADO.Connectionstring := FDBInfo;
ado.CommandTimeout:=10;
ado.ConnectionTimeout:=5;
ado.LoginPrompt:=false;
if ADO.connected then
Synchronize(UpdateUI)
{ Place thread code here }
end;
procedure Thrd.UpdateUI;
begin
f_ljqk.label1.caption := '数库1成功';
end;
procedure Tf_ljqk.FormCreate(Sender: TObject);
var
v_dbstr: string;
begin
with adoquery1 do
begin
while not eof do
begin
v_dbstr:='Provider=SQLOLEDB.1;Password='+trim(FieldByName('loadpwd').AsString)+';'+ 'Persist Security Info=True;User ID='+trim(FieldByName('loadid').AsString)+';Initial Catalog=master'+';Data Source='+trim(FieldByName('ip').AsString);
Thrd.Create(false,v_dbstr);
next;
end;
end;
end;
错误提示 ....THread Error :句柄无效(6)....
我知道参数传递时有错误,但我不知道怎么改,哪位大侠能帮我改改吗 ,兄弟我感激不尽
var
v_dbstr: string;
myThrd: ^Thrd;
begin
with adoquery1 do
begin
while not eof do
begin
v_dbstr:='Provider=SQLOLEDB.1;Password='+trim(FieldByName('loadpwd').AsString)+';'+ 'Persist Security Info=True;User ID='+trim(FieldByName('loadid').AsString)+';Initial Catalog=master'+';Data Source='+trim(FieldByName('ip').AsString);
new(myThrd);
myThrd^ := Thrd.Create(True);
myThrd^.FreeOnTerminate := True;
myThrd^.FDBInfo := v_dbstr;
myThrd^.Resume;
next;
.....