各位高手,我又做了一个最简单的测试程序,如下所示
调用下面的操作数据库函数之前,如果数据库断开了,捕获完了异常后,在函数返回前报
Unhandled exception in dbtest.exe (MFC42D.DLL): 0xC0000005: Access Violation。原帖见http://topic.csdn.net/u/20100501/02/f625bc01-48e7-4b25-ad62-422bdd50e3cf.html?seed=324874811&r=65147440#r_65147440谁能提供解决方法?解决后再另开新帖加100分!加上本帖共250分!代码示例:void CDbtestDlg::OnButton1()  
{
// TODO: Add your control notification handler code here
try
{
//打开数据表
HRESULT hr = m_pRecordset->Open( "SELECT * FROM t_test",  
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText
);
if (!SUCCEEDED(hr))
{
return;
}
}
catch(_com_error &e)
{
//关闭记录集
if (m_pRecordset->State)
{
m_pRecordset->Close();
}
}
}

解决方案 »

  1.   


    void CDbtestDlg::OnButton1()  
    {
    // TODO: Add your control notification handler code here
    try
    {
    //打开数据表
    HRESULT hr = m_pRecordset->Open( "SELECT * FROM t_test",  
    m_pConnection.GetInterfacePtr(),
    adOpenDynamic,
    adLockOptimistic,
    adCmdText
    );
    if (!SUCCEEDED(hr))
    {
    return;
    }
    }
    catch(_com_error &e)
    {
    //关闭记录集
    m_pRecordset->PutActiveConnection(NULL); //这里加这句试一试
    m_pRecordset->Close();}
    }
      

  2.   

    感谢楼上回答,
    m_pRecordset->PutActiveConnection(NULL); 
    这种写法编译通不边,我改成下面的写法,执行时直接就报异常了,应该是不能将活动连接置为NULL
    _variant_t var;
    var.vt = VT_NULL;
    m_pRecordset->PutActiveConnection(var);
      

  3.   

    是不是没有下面的初始化?
    m_pRecordset.CreateInstance(__uuidof(Recordset));我式了一下断开连接调m_pRecordset->Close()等都不会出问题。
      

  4.   

    不是调m_pRecordset->Close()报的错,是函数退出是报的,你看一下我原帖里有更详细的描述。不过问题已经解决了,我发现必须在执行完ADO操作后马上catch才可以,我现在是这样的try
    {
    HRESULT hr = m_pRecordset->Open( "SELECT * FROM t_test", 
                                             m_pConnection.GetInterfacePtr(),
                                             adOpenDynamic,
                                             adLockOptimistic,
                                             adCmdText
                                             );
    }
    catch(_com_error &e)
    {
                    CString strTips;
    strTips.Format("错误编号=[%08lx], 错误信息=[%s], 错误源[%s], 错误描述[%s]",
                                   e.Error(),   
                                   e.ErrorMessage(),   
                                   (LPCSTR)e.Source(),   
                                   (LPCSTR)e.Description());
                    MessageBox(strTips);
    }
    具体原因还不知道,其它的PutCollect和GetCollect也一样就好了,期待有人能说明白