在VC2005中用ADO方式操作Access数据库。用下面的程序段(为了说明问题作了简化,只显示一个字段值)显示前记录的数据(显示后一记录数据的程序略),当到达表中第一个记录时,再执行下面的操作就会出错,程序中已经有了判断是否到第一个记录的语句,但是没有管用。出错了也没有跳到相应的处理程序段:
CATCH_ALL(e)
AfxMessageBox(_T("Error"));
END_CATCH_ALL
中。
显示“下一记录”时也有同样的问题。问题出在哪里,该怎么样解决?
谢谢!void CADODlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
// 到前一个记录 if(!m_pRecordset->BOF )
{
_variant_t varName;
TRY
{
m_pRecordset->MovePrevious(); varName=m_pRecordset->GetCollect(_T("Name"));
if(varName.vt!=VT_NULL)
m_姓名=(char*)_bstr_t(varName);
}
CATCH_ALL(e)
AfxMessageBox(_T("Error"));
END_CATCH_ALL
UpdateData(FALSE);
}
}

解决方案 »

  1.   

    BOF很可能和名字空间std的标识符重复。试试在引入动态库时添加
    #import "c:\program files\common files\system\ado\msado15.dll"\
           no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
      

  2.   

    BOF很可能和名字空间std的标识符重复。试试在引入动态库时添加
    #import "c:\program files\common files\system\ado\msado15.dll"\
           no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")我实际上是这样做的,只是在发贴子时简化了,问题不是出在这里.
      

  3.   

    请问你是否先建立了正确的数据库连接,建议在连接时也用catch捕捉一下看有没有错误。另外,看一下你的"m_姓名=(char*)_bstr_t(varName);",这样转是否会引起数据错误或是内存泄漏从而导致不可捕捉的错误,因为数据库中的_bstr_t型有些古怪,我遇到过类似的问题。
      

  4.   

    lswandym_888() ( ) 
    请问你是否先建立了正确的数据库连接,建议在连接时也用catch捕捉一下看有没有错误。另外,看一下你的"m_姓名=(char*)_bstr_t(varName);",这样转是否会引起数据错误或是内存泄漏从而导致不可捕捉的错误,因为数据库中的_bstr_t型有些古怪,我遇到过类似的问题。数据库连接是正确的.在第一条到最后一条记录之间进行浏览是正确的,就是到了第一条记录后再看"前一条"记录,或者到达最后一条记录后再看"后一条"记录的内容时,会报错. 我在上面的程序段中移动指针后再加一个判断语句:    if (m_pRecordset->BOF) 
            m_pRecrodset->MoveFirst();才能判出到达"第一条"记录的信息.进行处理就不会出错了,但是这样做不太规范吧?void CADODlg::OnBnClickedButton2()
    {
    // TODO: 在此添加控件通知处理程序代码
    // 到前一个记录if(!m_pRecordset->BOF )
    {
    _variant_t varName;
    TRY
    {
    m_pRecordset->MovePrevious();//////////////////////////////////////////////////////////
        if (m_pRecordset->BOF)            //这是增加的保护语句,这样做才不会出错.
            m_pRecrodset->MoveFirst();
    /////////////////////////////////////////////////////////varName=m_pRecordset->GetCollect(_T("Name"));
    if(varName.vt!=VT_NULL)
    m_姓名=(char*)_bstr_t(varName);
    }
    CATCH_ALL(e)
    AfxMessageBox(_T("Error"));
    END_CATCH_ALL
    UpdateData(FALSE);
    }
    }
     
      

  5.   

    应该是这样
    if(!m_pRecordset->BOF )//是判断你的记录集指针是否到达首部,也就是第一条的前面。
    {
    _variant_t varName;
    TRY
    {
    m_pRecordset->MovePrevious();//到达了首部,即是空记录了
    //下面的操作就是非法的
    varName=m_pRecordset->GetCollect(_T("Name"));
    if(varName.vt!=VT_NULL)
    m_姓名=(char*)_bstr_t(varName);
    }
    CATCH_ALL(e)
    AfxMessageBox(_T("Error"));
    END_CATCH_ALL
    UpdateData(FALSE);
    }
    }------------------------------------------------------------
    把m_pRecordset->MovePrevious();语句移到if语句前面m_pRecordset->MovePrevious();
    if(!m_pRecordset->BOF )
    {
    _variant_t varName;
    TRY
    {
    varName=m_pRecordset->GetCollect(_T("Name"));
    if(varName.vt!=VT_NULL)
    m_姓名=(char*)_bstr_t(varName);
    }
    CATCH_ALL(e)
    AfxMessageBox(_T("Error"));
    END_CATCH_ALL
    UpdateData(FALSE);
    }
      

  6.   

    你既然用rename("EOF","adoEOF") rename("BOF","adoBOF")重新命名了BOF,为什么不把
    if(!m_pRecordset->BOF )改为if(!m_pRecordset->adoBOF )
      

  7.   

    把m_pRecordset->MovePrevious();语句移到if语句前面我试过了,试过吗?逻辑上也不是对的,还是照样出错!