ADO多线程数据库查询
时间:2021-07-01 10:21:17
帮助过:27人阅读
ADO查询多线程单元}
unit ADOThread;
interface
uses
Classes,StdCtrls,ADODB;
type TADOThread =
class(TThread)
private { Private declarations }
FListBox:TListBox;
FLabel:TLabel;
ConnString:WideString;
FSQLString:string;
sl:TStrings;
procedure UpdateCount;
protected procedure Execute;
override;
public constructor Create(SQL:
string;LB:TListBox;Lab:TLabel);
end;
implementation
uses
unit1,SysUtils,ActiveX;
{ TADOThread }
constructor TADOThread.
Create(SQL:
string; LB: TListBox;Lab:TLabel);
begin
ConnString:=
Form1.con1.ConnectionString;
FListBox:=
LB;
FLabel:=
Lab;
FSQLString:=
SQL;
Inherited Create(False);
end;
procedure TADOThread.Execute;
var
Qry:TADOQuery;
i:Integer;
begin { Place thread code here }
FreeOnTerminate:=
True;
sl:=TStringList.
Create;
CoInitialize(nil);
//必须调用(需Uses ActiveX)
Qry:=TADOQuery.
Create(
nil);
try
Qry.ConnectionString:=ConnString;
//必须有自己的连接
Qry.Close;
Qry.SQL.Clear;
Qry.SQL.Add(FSQLString);
Qry.Open;
FListBox.Clear;
for i :=
1 to 1000 do //为了执行久点重复历遍数据集101次
begin
Qry.First;
while not Qry.Eof And
not Terminated
do
begin
//FListBox.AddItem(Qry.Fields[0].asstring,nil);
//FListBox.Items.Add(Qry.Fields[0].asstring);
sl.Add(Qry.Fields[
0].asstring);
//如果不调用Synchronize,会出现Canvas Does NOT Allow Drawing
//Synchronize(UpdateCount);
Qry.Next;
end;
//Qry.First;
//FListBox.AddItem(‘*******‘,nil);
//Synchronize(UpdateCount);
end;
Synchronize(UpdateCount);
finally
sl.Free;
Qry.Free;
end;
CoUninitialize;
end;
procedure TADOThread.UpdateCount;
begin
//FLabel.Caption:=IntToStr(FListBox.Items.Count);
FListBox.Items.Assign(sl);
FLabel.Caption:=
IntToStr(sl.Count);
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;
type
TForm1 =
class(TForm)
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
lst1: TListBox;
lst2: TListBox;
lst3: TListBox;
cbb1: TComboBox;
cbb2: TComboBox;
cbb3: TComboBox;
btn1: TButton;
qry1: TADOQuery;
con1: TADOConnection;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ADOThread;
procedure TForm1.FormCreate(Sender: TObject);
var
strSQL:string;
begin
strSQL:=
‘select * from tb_student‘;
qry1.Close;
qry1.SQL.Clear;
qry1.SQL.Add(strSQL);
qry1.Open;
cbb1.Clear;
cbb2.Clear;
cbb3.Clear; //将客户Company和相关CustNo填到ComboBox中
while not qry1.Eof
do
begin
//cbb1.AddItem(qry1.Fields[1].asString, TObject(qry1.Fields[0].AsInteger));
cbb1.Items.Add(qry1.fieldbyname(
‘smc‘).AsString);
qry1.Next;
end;
cbb2.Items.Assign(cbb1.Items);
cbb3.Items.Assign(cbb1.Items); // 默认选中第一个
cbb1.ItemIndex :=
0;
cbb2.ItemIndex :=
0;
cbb3.ItemIndex :=
0;
end;
procedure TForm1.btn1Click(Sender: TObject);
const
SQL_CONST=
‘select sxm from tb_student where sxm‘;
var c1,c2,c3:Integer; s1,s2,s3:
string;
begin //取得三个选择框客户的编码
s1:=SQL_CONST+
QuotedStr(cbb1.Text);
s2:=SQL_CONST+
QuotedStr(cbb2.Text);
s3:=SQL_CONST+QuotedStr(cbb3.Text);
//三个线程同时查询
TADOThread.
Create(s1,lst1,lbl1);
TADOThread.Create(s2,lst2,lbl2);
TADOThread.Create(s3,lst3,lbl3);
end;
end.
ADO多线程数据库查询
标签:sql connect 相关 string std protected 线程 出现 ***