你的原因是:
cnn->Open(...); 
rs->Open(_bstr_t(strSQL), (IDispatch*)cnn, adOpenDynamic, adLockOptimistic, asCmdText); 
这两句在一块,当然rs和cnn都会被open啦。
你可以在整个程序初始化的时候打开cnn,
在程序结束时关闭cnn.即在程序运行期间保持cnn处于打开状态。
在运行期间使用rs时就不要再打开cnn啦!

解决方案 »

  1.   

    Open没什么关系,只要是一个connection,Open多少次都没关系,关键是
    cnn.CreateInstance(...); 创建一个之后Open就会增加一个连接。
      

  2.   

    现在的情况是cnn(Connection)是全局的,rs(Recordset)是局部的,rs Open时用的是cnn,但Open后就会多出一个Connection,程序没有用次打开rs都Open一个Connection
      

  3.   

    只要建立一个全局的Connection对象就可以了
      

  4.   

    你的cnn和rs在程序运行过程中是不是只CreateInstance了一次呢?
      

  5.   

    各位~!!!!!!!!!
    帮帮忙啊!!!!我有一个好简单的问题,但是没有碰到人帮我啊,我已经没钱了,就要下线了,我实在等不及了,就在这里做做广告吧,帮我去看看我的题吧!谢天谢谢你们的关注了!我下线了啊!希望下次来的时候能够碰到救主!
    http://www.csdn.net/expert/topic/576/576103.xml?temp=.2464258
      

  6.   

    在_RecordSetPtr中,
    connection 的类型是_variant_t.
    你可以直接把一个_bstr_t作为_Recordset::Open的参数._Recordset::Open用该参数作为连接字符串建立连接后,会直接把connection变成相应的连接类型.结论:调用_Recordset::Open时,不用再调用connection的open.
      

  7.   

    试一下:
    rs->Open(_bstr_t(strSQL), _variant_t((IDispatch*)cnn,true), adOpenDynamic, adLockOptimistic, asCmdText);
      

  8.   

    你有没有装MSDN(2000版),有的话,找里面关于ADO方面的例程对着查一下。照着微软的例子改一个DEMO,试试看还会不会发生这种现象。