各位大哥,我在用多线程+ADO方式连接SQL Server2000数据库对其操作会导致出错:
"在异步运行时,操作不能被执行"
"对象打开时,不允许操作"
"对象已关闭" 之类提示,找了很多地方,没有答案,望高手解答~!谢谢 我的ClientSocket 接到数据包时,把消息内容插入到数据库表中,另外一个线程从数据库中提取消息对
其进行操作,完成后,删除这条记录.如果数据量很少时,不会有问题,数据量大时就会出现上述错误! 我的 ADOConnection  和多个 ADOQuery 组件是动态创建的.ADOQuery共用 ADOConnection 多个线程就利用ADOQuery访问数据库,我也用到了TCriticalSection();访问时锁定,也不行,也试过在每个线程内
创建ADOQuery也不行,(在创建时用到了 CoInitialize(NULL) 和CoUninitialize;在头尾)
其中ADOConnection1的Mode属性设为了cmReadWrite;,还有ADOQuery的CacheSize属性设为1000;
 有高手提议把 ADO 用异步方式去做,可我不会...
请问有没有解决方法,谢谢各位了!....

解决方案 »

  1.   

    要每个线程一个adoconnection
    这样也好的!
    并且你对数据要进行什么样的操作呢?
      

  2.   

    我也遇到这种问题,我是在使用INDY的IDTCPSERVER控件时遇到的。我如果多个线程使用一个ADOCONNECTION的话就会出现你所说的问题,查了资料说可能是因为多线程同时使用一个数据库连接时要考虑同步问题。然后我就对每个线程创建了一个ADOCONNECTION,但是最后发现这样也是不行的,因为这些线程使用的连接在线程结束时不能被断开,导致数据库连接直线上涨,最后就连不上数据库了。到现在也没有找到解决办法。
      

  3.   

    一个Connection是可以挂多个Query的,应该没有问题呀.感觉还是你的程序写的有问题,是不是同步用的不好呀?ADOConnection的Mod设成cmShareDenyNone试试呢.
      

  4.   

    要一个线程一个Connection,要不然会出现死机的现象。这就是并发问题。你在每创建一个线程的时候,同时为他创建一个ADOConnection,在线程释放时将连接也释放。
    同一个线程内确实一个连接就可以了,但是在多个线程中时必须得将连接分机。因为在一个连接中毕竟不同的Query访问数据库时是存在顺序的,但是不多个线程同时使用时,便会出现“争抢连接”的现象,导致出现操作数据库时时间变长,或者出现一个线程工作正常其它线程报错的现象。
      

  5.   

    To coffee36(咖啡)
       不知道你是怎么做,应该在线程结束时是可以释放的。你将一个连接定义为线程内私有变理,在线程结束的时候将连接FreeAndNil掉就可以了。这样不会出现你说有不能将连接无法释放的现象。
      

  6.   

    同意
    一个线程一个Connection就OK了!
      

  7.   

    好象ADO对多线程的支持有问题。
      

  8.   

    在每个线程开始的时候Create一个ADOConnection;
    线程结实的时候Freeandnil(ADOConnection)
      

  9.   

    一个线程一个Connection,
    楼主可以揭贴了,这个问题不少人都吃过苦的,
    包括偶在内,:)
      

  10.   

    每一个线程使用一个adoconntion,更新时尽量用sql自己写,不要用adoquery.post这样的东西.
    多捕获异常,把异常存到日志文件中,比如txt中.以免出错后程序中指
    ---------------------------------------              欢迎访问 http://www.coderpub.com 技术论坛
                                delphi,asp.net,C#,j2me,软件工程,企业管理
      

  11.   

    我定义的ADOCONNECTION就是线程的私有变量呀。只不过我是用的ADOCONNECTION。FREE来释放的。我试试FREEANDNIL