在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);
}
}
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);
}
}
#import "c:\program files\common files\system\ado\msado15.dll"\
no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#import "c:\program files\common files\system\ado\msado15.dll"\
no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")我实际上是这样做的,只是在发贴子时简化了,问题不是出在这里.
请问你是否先建立了正确的数据库连接,建议在连接时也用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);
}
}
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);
}
if(!m_pRecordset->BOF )改为if(!m_pRecordset->adoBOF )