我封装的ADO类ADOConn
class ADOConn  
{
public:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public:
ADOConn(){::CoInitialize(NULL);m_pConnection=NULL;m_pRecordset=NULL;}
virtual ~ADOConn(){::CoUninitialize();}
int DefaultConn();//建立连接m_pConnection;
void ExitConnect(){
if (NULL != m_pRecordset)
     if (m_pRecordset->State)
     m_pRecordset->Close();
if (NULL != m_pConnection)
     if (m_pConnection->State)
     m_pConnection->Close();
}
};
我在有一个线程需要时时检测数据库数据,我在线程里用的是下面的代码
while(1)
{
Sleep(1000);
ADOConn adoconn; 
adoconn.DefaultConn();
........//一些数据删除,修改,查询的操作.
adoconn.ExitConnect();
}
//上面的代码可以运行一段时间,时间不固定,长时10分,短时3分,就报一个0xc0000005 Asscess violation的错误,

解决方案 »

  1.   

    void ExitConnect(){
    if (NULL != m_pRecordset)
    {
       m_pRecordset->Close();
       pRecordset=NULL; 
    }
    if (NULL != m_pConnection)
    {
       m_pConnection->Close();
      pConnection=NULL;
    }
    还有一个潜在的问题就是
    ........//一些数据删除,修改,查询的操作.
    如果你这个过程比较长,比如里面有存储过程的调用等耗时操作.可能会在这个操作没完成之前就进入到下一个循环.从而造成数据库连接数过多或数据库死锁等问题.
      

  2.   

    还有,把你上面这个线程函数优化一下,不用每次都连接,关闭数据库,这样也可以减轻数据库的压力,有可能你操作数据库的时间还不如连接和释放数据库时间长.ADOConn adoconn; 
    adoconn.DefaultConn();
    while(1)
    {
    ........//一些数据删除,修改,查询的操作.
    }
    adoconn.ExitConnect();
      

  3.   

    only DAO
    http://www.codeproject.com/database/mtdaorecordset.asp
      

  4.   

    还有一个潜在的问题就是
    ........//一些数据删除,修改,查询的操作.
    如果你这个过程比较长,比如里面有存储过程的调用等耗时操作.可能会在这个操作没完成之前就进入到下一个循环.从而造成数据库连接数过多或数据库死锁等问题.TO:lzzqqq(Jonersen)
    我这里面暂时涉及到的是查询一条记录,判断此记录状态,如果不符合要求,UPDATE一下,
    这些操作会有你说的那个潜在的问题么????
      

  5.   

    怎么在你的类里面没看到createinstance这样的代码
    你用了吗??还有release也没有看到??这些都是需要的
      

  6.   

    TO handsomerun(毛毛) 
    智能指针需要release吗??/我印象中好象不需要.createinstance已经被封装在类函数里头了.比如:DefaultConn(),(建立连接)
    GetRecordSet()(执行select语句,并把得到记录交给m_pRecordset)等函数.
      

  7.   

    TO handsomerun(毛毛) 
    智能指针需要release吗??/我印象中好象不需要.createinstance已经被封装在类函数里头了.比如:DefaultConn(),(建立连接)
    GetRecordSet()(执行select语句,并把得到记录交给m_pRecordset
      

  8.   

    看样子没有太耗时的数据库操作,应该没什么大问题啊,你按上面说的把COM指针Realease一下试试.不行再说.
    void ExitConnect()
    {
      if (NULL != m_pRecordset)
      {
         m_pRecordset->Close();
         m_pRecordset->Release();
         m_pRecordset=NULL; 
      }
      if (NULL != m_pConnection)
      {
         m_pConnection->Close();
         m_pConnection->Release();
         m_pConnection=NULL;
      }
    }
      

  9.   

    要的
    一个createinstance
    对应一个release
      

  10.   

    TO lzzqqq(Jonersen)
    ADOConn adoconn; 
    adoconn.DefaultConn();
    while(1)
    {
    ........//一些数据删除,修改,查询的操作.
    }
    adoconn.ExitConnect();
    用这种方法运行了40分,没有出现问题,但感觉治标没治本,
    放在循环内部怎么做才能不报错处理,我想只有解决了这个问题,才会让我认识问题的本质.我接着试下楼上的这个方法
    void ExitConnect()
    {
      if (NULL != m_pRecordset)
      {
         m_pRecordset->Close();
         m_pRecordset->Release();
         m_pRecordset=NULL; 
      }
      if (NULL != m_pConnection)
      {
         m_pConnection->Close();
         m_pConnection->Release();
         m_pConnection=NULL;
      }
    }
      

  11.   

    TO lzzqqq(Jonersen) ,handsomerun(毛毛) 
    用Release后,第一个循环就抱了错,追到代码里面去,发现是在析构adoconn时,代码内部已经调用了_release(),
    所以我觉得这里的问题不是release()的问题,
    有可能是lzzqqq(Jonersen)大哥说的数据库连接还没来的及断开就进入下个循环了,
    我接着这样试下.while(1)
    {
    ADOConn adoconn; 
    adoconn.DefaultConn();
    ........//一些数据删除,修改,查询的操作.
    adoconn.ExitConnect
    Sleep(3000);
    }
      

  12.   

    加CriticalSection,或每个线程用一个连接。