如何在多线程中使用ADO数据控件操作数据库?

zlnet 2005-01-10 02:16:07
本人在做一个多线程程序,需要在线程中操作数据库,请问
1:能不能在线程中使用主窗体的ADO控件(TADOConnection、TADOQuery、TADOStoredProc),看书好像不能多线程操作VCL?
2:如果不能,在线程中该怎么做?
...全文
329 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlnet 2005-01-10
  • 打赏
  • 举报
回复
问题解决,同步的方法还是有问题,最后采用动态创建的方法来解决的,谢谢各位的大力帮助!
zlnet 2005-01-10
  • 打赏
  • 举报
回复
顶!
Kshape 2005-01-10
  • 打赏
  • 举报
回复
还有:
每一个线程最好都有ADO元件新的实例,如果你把ADOConnection1与ADOQuery1
等放在数据模块DataModule1,则每个线程都要新建DataModule1的实例,则内含
的元件自动也是新的实例


如果不注意区别
会出现“Connection is busy with results For another command”的错误哦
Kshape 2005-01-10
  • 打赏
  • 举报
回复
楼上说的不错
最好动态生成
随时注意释放
避免线程中的冲突
weidegong 2005-01-10
  • 打赏
  • 举报
回复
关于多线程使用ADO数据控件的问题,根据我的经验还是在线程中动态生成为好,减少耦合,同时减少线程之间的干扰。尤其是ADOConnection,为一个线程分配一个。在线程数目不是非常多的时候(<32?具体数目记不清了)的时候,完全没有问题。如果你的线程数目非常多,可能就需要用到连接池,每次进行数据库操作的时候,从连接池中取得当前空闲的连接。

另外,多线程创建ADO对象时,需要执行CoInitialize

代码演示如下:
constructor TAlarm.create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);

CoInitialize(nil);
self.log('创建ADO对象...');
dbcon:=TDataBaseConnection.Create();
ADOConOA:=TADOConnection.Create(application);
ADOConOA.LoginPrompt:=false;
ADOQueryOA:=TADOQuery.Create(application);
ADOQueryOA.Connection:=ADOConOA;
self.log('创建ADO对象成功!');
end;
zlnet 2005-01-10
  • 打赏
  • 举报
回复
我想在每个线程中都创建ADO控件是不是可以?我的客户端数量不大,最多只有4、5个,但操作比较频繁。
boatzm 2005-01-10
  • 打赏
  • 举报
回复
在线程中创建该对象,并且由于ado 是个com的东东,

如果是跨线程的使用,使用的时候要注意线程调用com的套间的区别。找到适合自己的方式。
还有注意做好线程互斥的一些东西。
zlnet 2005-01-10
  • 打赏
  • 举报
回复
怎么没人帮我吗?
zlnet 2005-01-10
  • 打赏
  • 举报
回复
再顶起来!!!
ahyf 2005-01-10
  • 打赏
  • 举报
回复
会有问题的。
zlnet 2005-01-10
  • 打赏
  • 举报
回复
再来,怎么没人啊??
cangwu_lee 2005-01-10
  • 打赏
  • 举报
回复
Thread -> Synchronize(PushTheButton); -> VCL
zlnet 2005-01-10
  • 打赏
  • 举报
回复
先顶一下!!

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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