多线程访问数据库,最好有源码!分不够可以再加!!!!

Tspeng 2003-09-12 05:11:47
rt
...全文
61 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
helodd 2003-09-18
  • 打赏
  • 举报
回复

type
TQueryThread = class(TThread)
private
SP:TAdoStoredProc;
PN:String;
Start_Date:TDateTime;
END_Date:TdateTime;
procedure DoQuery();
protected
procedure Execute; override;
public
Constructor Create(ADOSP:TAdoStoredProc;PName:String;SD:TDatetime;ED:TdateTime);virtual;
end;



implementation


Constructor TQueryThread.Create(ADOSP:TADOStoredproc;PName:String;SD:TDatetime;ED:TdateTime);
begin
inherited create(False);
FreeOnTerminate:=True;
SP:=ADOSP;
PN:=PName;
Start_Date:=SD;
End_Date:=ED;
resume;
end;

procedure TQueryThread.Execute;
begin
synchronize(DoQuery);
end;

procedure TQueryThread.doQuery();
begin
with SP do
begin
close;
ProcedureName:=PN;
Parameters.Refresh;
Parameters[1].Value:=Datetostr(Start_Date);
Parameters[2].Value:=DateToStr(End_date);
Prepared:=true;
open;
end;
end;


但我发觉在ADO下只有单线程模式的.
helodd 2003-09-18
  • 打赏
  • 举报
回复

type
TQueryThread = class(TThread)
private
SP:TAdoStoredProc;
PN:String;
Start_Date:TDateTime;
END_Date:TdateTime;
procedure DoQuery();
protected
procedure Execute; override;
public
Constructor Create(ADOSP:TAdoStoredProc;PName:String;SD:TDatetime;ED:TdateTime);virtual;
end;



implementation


Constructor TQueryThread.Create(ADOSP:TADOStoredproc;PName:String;SD:TDatetime;ED:TdateTime);
begin
inherited create(False);
FreeOnTerminate:=True;
SP:=ADOSP;
PN:=PName;
Start_Date:=SD;
End_Date:=ED;
resume;
end;

procedure TQueryThread.Execute;
begin
synchronize(DoQuery);
end;

procedure TQueryThread.doQuery();
begin
with SP do
begin
close;
ProcedureName:=PN;
Parameters.Refresh;
Parameters[1].Value:=Datetostr(Start_Date);
Parameters[2].Value:=DateToStr(End_date);
Prepared:=true;
open;
end;
end;


但我发觉在ADO下只有单线程模式的.
haoguozhong 2003-09-18
  • 打赏
  • 举报
回复
up
Tspeng 2003-09-17
  • 打赏
  • 举报
回复
各位大侠的帮忙
Devlopered 2003-09-16
  • 打赏
  • 举报
回复
up
jhwh 2003-09-15
  • 打赏
  • 举报
回复
1、定义一个运行函数,需要两个参数,TDataSet和一个同步类。比如Star(ds:TDataSet,sync:TSync)。在Star中,调用线程函数Excute,这样,线程能够完成我们将要作的事情的细节,具体的数据操作应该是在ds中完成。不要在 Execute 中调用我们的函数,这样就太死板了,代码肯定不能重用。传入同步类,可以根据不同的同步方式进行组合,而且这样对于同步来说,很容易控制。比如需要进行显示查询结果,主线程中调用
begin
...
sync.ResetEvent( );
Star(ds, sync);
sync.WaitForEvent( );
...
end
而工作线程只需要在线程中调用sync.SetEvent( )之类的方法,就可以通知主线程工作。在
这期间,主线程可以干其他的事情。注意,主线程不一定是指Application,可能是其他线程。

2、又有一个问题,TDataSet仅仅是基类,可能是ADO,可能是BDE,甚至是第三方控件。怎样重用?我们得自己定义一个类,比如:TMyDataSet。这个类用来封装不同的DataSet的派生类。这样你的代码就能重用了。需要加入什么,自己看着办就行了。

3、关于平台相关的东东:不同的DataSet的派生类,初始话不一样,自己定义的TMyDataSet应当注意这一点。
FrameSniper 2003-09-15
  • 打赏
  • 举报
回复
多线程查询一个表,并且进行相同的操作!楼主为什么用这种怪方法来提高查询速度?
leapmars 2003-09-15
  • 打赏
  • 举报
回复
如果用的是 ADO 访问数据库,需要在线程中动态创建 TADOConnection,TADODataSet等,并且要初始化 COM 库。大概的调用形式为:

procedure TYourThread.Execute
var
Connection: TADOConnection;
DataSet: TADODataSet;
begin
CoInitialize(nil); // 初始化 COM 库
try
Connection := TADOConnection.Create(nil);
try
DataSet := TADODataSet.Create(nil);
try

......
finally
DataSet.Free;
end;
finally
Connection.Free;
end;
finally
CoUninitialize();
end;
end;

dxwin 2003-09-15
  • 打赏
  • 举报
回复
比较高深的问题,帮你顶
chenxiaoqiang 2003-09-15
  • 打赏
  • 举报
回复
我的办法是:
1,写一个数据模块,放入我的数据库操作函数funThre();
2,写一个线程类thred,在execute里调用我的funThre();
3,在程序运行时,用thred.Create(false)创建线程;

但实际运行时,问题很多。如果不用线程,直接在程序运行时调用函数vfunThre()则没有一点问题。
上海老李 2003-09-15
  • 打赏
  • 举报
回复
???你写到线程启动就是了,不过最好只是查询而不能用多线程过多写,否则如果是多客户,那你要考虑清楚
chenxiaoqiang 2003-09-15
  • 打赏
  • 举报
回复
我也正为这个问题头疼,我们交换一下信息吧!!我的qq是2715373
Tspeng 2003-09-15
  • 打赏
  • 举报
回复
感谢以上各位大侠的帮忙?
其实我用多线程查询数据的目的很简单
1)、提高查询效率。因为数据量太大,而机器配置可以很高,不用担心多线程会占用资源。
2)、便于控制。如果用户等待时间过长可以终止查询线程。
3)、启用多线程来查询,这样查询线程进行查询时,不影响主线程工作。
以上诸位的方法对我很有帮助,欢迎大家提出有更高效率的方法!
yangmanyuan 2003-09-12
  • 打赏
  • 举报
回复
up
leapmars 2003-09-12
  • 打赏
  • 举报
回复
Mark
Tspeng 2003-09-12
  • 打赏
  • 举报
回复
当然是想用多个线程同时对某个数据表进行查询,这些线程干的是一样的事情。
比如对一个含有200万条记录的表进行满足某个条件的查询,想用多线程进行查询。
wyr521 2003-09-12
  • 打赏
  • 举报
回复
你到底想问什么问题?
Tspeng 2003-09-12
  • 打赏
  • 举报
回复
自己也UP一下!
pooler 2003-09-12
  • 打赏
  • 举报
回复
帮你up:)

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧