try 
{
         ...... if(adStateOpen == pRdMySql->GetState()) 
pRdMySql->Close();
}
catch (_com_error &e)
{
_bstr_t ErrMessage=e.Description(); if(adStateOpen == pRdMySql->GetState()) 
pRdMySql->Close(); ExportLogFile("ERROR:"+(CString)(char *)ErrMessage+"\r\n");//写入日志文件
}进入catch块时,要是pRdMySql->Close()的话,就出现运行库错误,可如果不写close就不会出错。
为啥?咋解决呢???

解决方案 »

  1.   

    pRdMySql是连接对象吧
    if(pRdMySql->State)
      pRdMySql->Close();
      

  2.   

    pRdMySql是_RecordsetPtr对象。if(pRdMySql->State)
      pRdMySql->Close();
    这个语句我也试过,一样的结果。
      

  3.   

    前面没有close(),所以比较奇怪。
      

  4.   

    try{}里面的写的语句不全,可能是问题在别的语句上,如果已经close了就不能再close,如果open没成功,也就是说try{open()}失败的话,在catch{}里不要close,否则也会出错。
      

  5.   

    对你的环境不熟悉,猜测解决方法二:
    1。ADO是用的是COM组件技术,进入程序前要初始化CoInitialize(),退出程序后要CoUninitialize()。(也有的用AfxOLEINTI()?,记不清了,好像是这个函数,是把上面的二个函数集成在一起的)
      你把CoUninitialize()注释掉看看。
    2。用如下语句代替你的try内的语句
       if( pRdMySql != NULL )
       {
          pRdMySql.Close();
          pRdMySql = NULL;//这一句很重要,记住所有关闭指针的操作都要搭配这一句。否则上面的if判断就进不来了。
       }
      

  6.   

    建议不要在catch{}里面关表或其他复杂的处理.
    我一般是这样做的.
    try
    {
    ...
    }
    catch(_com_error &e)
    {
    //写日志.
    nErrorFlag = 1
    }
    if(nErrorFlag == 1)
    {
    try
    {
    //在这里关表.
    }
    catch(..)
    {
    //ErrorLog("关表失败");
    }
    }
    这样唯一的好处是不会让你的程序崩溃.
      

  7.   

    既然进入catch块就说明可能pRdMySql无效,那你再引用这个对象pRdMySql->Close()岂不出错才怪
      

  8.   

    pRdMySql应该不会无效,我是在读取一个记录集的中间某一条记录时出的错误。
      

  9.   

    ADOSet.CreateInstance(__uuidof(Recordset));这条语句是必须加上的,其余代码如下ADOSet.CreateInstance(__uuidof(Recordset));
    if ( ADOSet->State == adStateOpen) ADOSet->Close();
    try
    {
           ADOSet->Open(strSQL, ADOConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdUnknown);
    }
    catch(_com_error &e)
    {
           CString err;
           err.Format("ADO Error: %s",(char*)e.Description());
           AfxMessageBox(err);
    }
      

  10.   

    在释放前加判断语句:
    //关闭ADO记录集
    if(m_pRs != NULL && m_pRs->GetState() == adStateOpen)
    m_pRs->Close();