关于vc用ado访问数据库的问题,在线等。。。 我用的是sqlserver2000,为什么我的Rs访问GetEditMode()的时候老是出下面这个错误呢?{"Unknown error 0x800A0BCD"} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是这样的,我打开一个记录集,等我对这个记录集操作完成以后我要关闭这个记录集。在关闭的时候我要调用GetEditMode()看看当前这个记录集是不是还有编辑或者增加的操作没有完成,如果都完成了就关闭,如果还有动作没有完成就先结束了那个编辑或者增加的动作再关闭。现在就是在我调用GetEditMode查看当前记录集的动作的时候出上面的错误。不知为何。 没有相关代码的话,怎么知道什么出错了呢。把出错的地方贴一下吧。正常调用GetEditMode是不会有错误的,我想你是不是已经把记录集Close了再调用GetEditMode,这样就会出错,你可以在GetEditMode前一句用IsOpen()看看记录集是不是打开的。 void CAdoRecordSet::Close(){ try { if (m_pRecordset != NULL && m_pRecordset->State != adStateClosed) { if (GetEditMode() != adEditNone) CancelUpdate(); m_pRecordset->Close(); } } catch (const _com_error& e) { }}EditModeEnum CAdoRecordSet::GetEditMode(){ ASSERT(m_pRecordset != NULL); try { if (m_pRecordset != NULL) { return m_pRecordset->GetEditMode(); } } catch (_com_error e) { //这里出错,而且出错的errormessage是空字符串。 CString str=e.ErrorMessage(); return adEditNone; } return adEditNone; } 改成这样看看EditModeEnum CAdoRecordSet::GetEditMode(){ ASSERT(m_pRecordset != NULL); try { if (m_pRecordset != NULL && m_pRecordset->IsOpen()) { return m_pRecordset->GetEditMode(); } } catch (_com_error e) { //这里出错,而且出错的errormessage是空字符串。 CString str=e.ErrorMessage(); return adEditNone; } return adEditNone; } m_pRecordset->IsOpen()没哟这个方法吧? 哦,你用的是ADO啊,那就改成m_pRecordset->State == adStateOpen 不用吧,前面已经判断了阿在void CAdoRecordSet::Close()里if (m_pRecordset != NULL && m_pRecordset->State != adStateClosed) 你不会只在那里调用了GetEditMode吧,我怀疑是别的地方Colse了记录集,然后又调用GetEditMode函数,不妨一试? 1.stdafx.h中加入#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 2。app文件的InitInstance中加入if(S_OK!=OleInitialize(NULL)) //或者CoInitialize(){AfxMessageBox("初始化COM组件库错误");}下面就是数据库操作_ConnectionPtr pConn;_RecordsetPtr pRs;CString strSQL;pConn.CreateInstance(__uuidof(Connection));pConn->CursorLocation=adUseClient;strSQL="Provider=SQLOLEDB;Server=Gooyan;DataBase=SkillsBox;UID=sa;PWD=aaaaaaaa";pConn->Open(_bstr_t(strSQL),"","",-1);pRs.CreateInstance(__uuidof(Recordset));pRs->CursorLocation=adUseClient;pRs->PutActiveConnection(pConn.GetInterfacePtr());pRs1.CreateInstance(__uuidof(Recordset));pRs1->CursorLocation=adUseClient;pRs1->PutActiveConnection(pConn.GetInterfacePtr());strSQL="select * from catalog order by cataid";pRs->Open(_bstr_t(strSQL),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText); 我的是Access 2000,出现的问题是一样的。 估计代码出在这一段: while(!recordset->AdoEOF()) { recordset->MoveNext(); } // recordset.MoveFirst(); 将上面的一句加上去就不会出错了。 GetEditMode() != adEditNone MFC基于对话空编程中 列表视图控件怎么添加 如何删除listbox中选中的多行记录 怎样在CFormView中添加按钮等控件? [原创&交流]略论图像的分块读写策略 我做的聊天程序为什么 一次聊天只能发送 100个汉字 急!!!如何得到当前程序正在运行的目录!!! 如何获取像素点颜色的饱和度和明亮度? 几个问题(vc++高手请进) 请大虾指点:英文版VC6安装出错 ctoolbar的一个奇怪问题 如何判断某个线程是否已经执行完 在函数内部定义的 static 变量 编译后是存在 数据段 还是代码段啊?
正常调用GetEditMode是不会有错误的,我想你是不是已经把记录集Close了再调用GetEditMode,这样就会出错,你可以在GetEditMode前一句用IsOpen()看看记录集是不是打开的。
{
try
{
if (m_pRecordset != NULL && m_pRecordset->State != adStateClosed)
{
if (GetEditMode() != adEditNone) CancelUpdate();
m_pRecordset->Close();
}
}
catch (const _com_error& e)
{
}
}
EditModeEnum CAdoRecordSet::GetEditMode()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return m_pRecordset->GetEditMode();
}
}
catch (_com_error e)
{
//这里出错,而且出错的errormessage是空字符串。
CString str=e.ErrorMessage();
return adEditNone;
}
return adEditNone;
}
EditModeEnum CAdoRecordSet::GetEditMode()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL && m_pRecordset->IsOpen())
{
return m_pRecordset->GetEditMode();
}
}
catch (_com_error e)
{
//这里出错,而且出错的errormessage是空字符串。
CString str=e.ErrorMessage();
return adEditNone;
}
return adEditNone;
}
if (m_pRecordset != NULL && m_pRecordset->State != adStateClosed)
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
2。app文件的InitInstance中加入
if(S_OK!=OleInitialize(NULL)) //或者CoInitialize()
{
AfxMessageBox("初始化COM组件库错误");
}
下面就是数据库操作
_ConnectionPtr pConn;
_RecordsetPtr pRs;
CString strSQL;
pConn.CreateInstance(__uuidof(Connection));
pConn->CursorLocation=adUseClient;
strSQL="Provider=SQLOLEDB;Server=Gooyan;DataBase=SkillsBox;UID=sa;PWD=aaaaaaaa";
pConn->Open(_bstr_t(strSQL),"","",-1);pRs.CreateInstance(__uuidof(Recordset));
pRs->CursorLocation=adUseClient;
pRs->PutActiveConnection(pConn.GetInterfacePtr());pRs1.CreateInstance(__uuidof(Recordset));
pRs1->CursorLocation=adUseClient;
pRs1->PutActiveConnection(pConn.GetInterfacePtr());strSQL="select * from catalog order by cataid";
pRs->Open(_bstr_t(strSQL),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText);
while(!recordset->AdoEOF())
{
recordset->MoveNext();
} // recordset.MoveFirst();
将上面的一句加上去就不会出错了。