本人在做一个多线程程序,需要在线程中操作数据库,请问
1:能不能在线程中使用主窗体的ADO控件(TADOConnection、TADOQuery、TADOStoredProc),看书好像不能多线程操作VCL?
2:如果不能,在线程中该怎么做?

解决方案 »

  1.   

    Thread -> Synchronize(PushTheButton); -> VCL
      

  2.   

    在线程中创建该对象,并且由于ado 是个com的东东,如果是跨线程的使用,使用的时候要注意线程调用com的套间的区别。找到适合自己的方式。
    还有注意做好线程互斥的一些东西。
      

  3.   

    我想在每个线程中都创建ADO控件是不是可以?我的客户端数量不大,最多只有4、5个,但操作比较频繁。
      

  4.   

    关于多线程使用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;
      

  5.   

    还有:
    每一个线程最好都有ADO元件新的实例,如果你把ADOConnection1与ADOQuery1
    等放在数据模块DataModule1,则每个线程都要新建DataModule1的实例,则内含
    的元件自动也是新的实例
    如果不注意区别
    会出现“Connection is busy with results For another command”的错误哦