如何在多线程中使用ADO数据控件操作数据库? 本人在做一个多线程程序,需要在线程中操作数据库,请问1:能不能在线程中使用主窗体的ADO控件(TADOConnection、TADOQuery、TADOStoredProc),看书好像不能多线程操作VCL?2:如果不能,在线程中该怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Thread -> Synchronize(PushTheButton); -> VCL 在线程中创建该对象,并且由于ado 是个com的东东,如果是跨线程的使用,使用的时候要注意线程调用com的套间的区别。找到适合自己的方式。还有注意做好线程互斥的一些东西。 我想在每个线程中都创建ADO控件是不是可以?我的客户端数量不大,最多只有4、5个,但操作比较频繁。 关于多线程使用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; 还有:每一个线程最好都有ADO元件新的实例,如果你把ADOConnection1与ADOQuery1等放在数据模块DataModule1,则每个线程都要新建DataModule1的实例,则内含的元件自动也是新的实例如果不注意区别会出现“Connection is busy with results For another command”的错误哦 删除继承的窗体中的控件属性时出现错误 除了用正则表达式外 怎么写电子邮件的有效性检验 关于进制转换的问题 这种查询窗体如何做出来,是用控件的吗? 帮帮我啊,紧急求助!!! 并发丢失数据问题,请教高手。 如何让ComboBox的菜单向上!!! 十万火急,如何将结构开始赋空 advstringgrid怎么才能让过滤的行不参加合计 怎样用CM_MOUSEENTER,CM_MOUSELEAVE 实现SPeenButton按钮移进,移走换图片吗? 在钩子中如何判断键盘或鼠标消息是发送给哪一个句柄的 请问delphi6下indy的一个例子使用出错是何原因?急!盼高手指点!
还有注意做好线程互斥的一些东西。
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;
每一个线程最好都有ADO元件新的实例,如果你把ADOConnection1与ADOQuery1
等放在数据模块DataModule1,则每个线程都要新建DataModule1的实例,则内含
的元件自动也是新的实例
如果不注意区别
会出现“Connection is busy with results For another command”的错误哦