ADO中的多线程(100分)

  • 主题发起人 主题发起人 jihenglixin
  • 开始时间 开始时间
J

jihenglixin

Unregistered / Unconfirmed
GUEST, unregistred user!
利用ADO组件编写多线程查询需要注意哪些问题?
 
注意每一个ADO都有自己的连接。
不要多个ADO共享一个ADOConnection,除非你能确保共享一个ADOConnection的ADO不可能同时被2个线程调用。
否则在与数据库的连接上会出问题。
 
to:raymondcen
若不用ADOConnection组件,只设置每个ADO的ConnectionString来建立连接的话行不行
 
可以的。我现在就这么做。以前我用共享ADOConnection的做法。后来多线程调试问题多多。
 
to:raymondcen
能不能给个例子[:D]
 
比如有两个ADOQuery共享一个ADOConnection
2个不同的线程。
线程1正执行到访问ADOQuery1取数据,线程2正执行到访问ADOQuery2存数据。
这个时候2个线程共享连接就会发生冲突。
所以最好每个ADOQuery本身连接到数据库。
而且多线程中,最好把ADOQuery作为线成的一个property。否则2个线程共用一个ADOQuery会怎么样我没试过。
 
to:raymondcen
请帮忙确认下面的代码为何会导致蓝屏错误

//由主窗口传入一个TAdoDataset组件和ListView组件,若查询到结果就显示在主窗口的listview组件中.

unit Unit2;

interface

uses
Classes,DB,AdoDB,ComCtrls,SysUtils;

type
TQueryThread = class(TThread)
private
{ Private declarations }
FDataSet:TAdoDataset;
FQueryException:Exception;
ListView:TListview;
procedure UpdateListView;
protected
procedure Execute; override;
public
constructor Create(Q:TAdoDataSet;LV:TListview); virtual;
end;

implementation
uses
windows,unit3;

{ TQueryThread }

constructor TQueryThread.Create(Q: TAdoDataSet;LV:TListview);
begin
inherited Create(true);
ListView:=LV;
FDataSet := Q;
FDataset.CommandText :='SELECT * FROM TABLE'
FreeOnTerminate:=true;
Resume;
end;


procedure TQueryThread.Execute;
begin
try
FDataset.Open;
if not FdataSet.IsEmpty then
begin
synchronize(Updatelistview);
end;
except
FqueryException:=ExceptObject as Exception;
raise FqueryException.Create('查找过程出错');
end;
end;

procedure TQueryThread.UpdateListView;
var
listItem:TlistItem;
begin
with listview do
begin
while not Fdataset.eof do
begin
listitem:=items.add;
listitem.Caption :='..... '
listitem.SubItems.Add(Fdataset.fieldbyname('A').asstring);
listitem.SubItems.Add(Fdataset.fieldbyname('Br').asstring);
//.......
Fdataset.next;
end;
end;
end;

end.
 
不是很清楚。经验不足。也实在没时间慢慢调。[:)]
 
to:raymondcen
深表感谢,稍后给您加分.
 
接受答案了.
 
请教raymondcen:
注意每一个ADO都有自己的连接。
不要多个ADO共享一个ADOConnection,除非你能确保共享一个ADOConnection的ADO不可能同时被2个线程调用。
否则在与数据库的连接上会出问题。

能解释一下吗?我现在用多线程做查询就遇到一个问题,不解:
线程中的ADOQuery对象是线程的私有变量,在线程中创建、销毁,就是为了避免被不同线程同时调用,但是,线程中
ADOQuery1.close;
ADOQuery1.sql.clear; <--
时,出错,返回“对象被打开。”,这个现象只在多线程并发执行时才出现,看上去是ADOQuery1在close后又被什么打开了,但ADOQuery1是私有变量,在线程外不可能被调用,我的程序中的确是“多个ADO共享一个ADOConnection”,能请帮忙解答一下为什么吗?
 
可能是其他线程的其他的query正在使用那个connection导致的。
 
后退
顶部