请教:使用ado查询数据库的问题 我使用m_pRecordset->Open("SELECT * FROM users",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);查询数据库,VC编译没问题,可每次执行程序时,总是弹出一个 Rumtime Error! 错误,这是怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有啊!用command 方法也是出现这样的错误 前面用m_pConnection->Open("....);连接数据库都没有错,就是m_pRecordset->Open("..);查询时出错了. 我用过的一个函数,仅供参考。BOOL CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption){ Close(); if(strcmp(lpstrExec, _T("")) != 0) m_strQuery = lpstrExec;ASSERT(!m_strQuery.IsEmpty());if(m_pConnection == NULL) m_pConnection = mpdb;m_strQuery.TrimLeft();BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0 && nOption == openUnknown;try{ m_pRecordset->CursorType = adOpenStatic; m_pRecordset->CursorLocation = adUseClient; if(bIsSelect || nOption == openQuery || nOption == openUnknown) m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*mpdb, TRUE), adOpenStatic, adLockOptimistic, adCmdUnknown); else if(nOption == openTable) m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE), adOpenKeyset, adLockOptimistic, adCmdTable); else if(nOption == openStoredProc) { m_pCmd->ActiveConnection = mpdb; m_pCmd->CommandText = _bstr_t(m_strQuery); m_pCmd->CommandType = adCmdStoredProc; m_pConnection->CursorLocation = adUseClient; m_pRecordset = m_pCmd->Execute(NULL, NULL, adCmdText); } else { TRACE( "Unknown parameter. %d", nOption); return FALSE; }}catch(_com_error &e){dump_com_error(e);return FALSE;}return m_pRecordset != NULL;} 在你open之前,判断m_pRecordset是否有效还有,在编译的时候,是否有warning出现 是不是忘了初始化m_pRecordset,或者是m_pRecordset在前面已经open了。如果已经open了没close的时候是不能在open的 我前面用HRESULT hr=m_pRecordset.CreateInstance("ADODB.Recordset");if(SUCCEEDED(hr)){AfxMessageBox("asdf");m_pRecordset->Close();//1....}进行判断,确实运行到1就出错,可能真的是m_pRecordset无效,但为什么SUCCEEDED(hr)是真的呢? to: greatest(成吉思汗) 请问m_pRecordset要怎么初始化? 初始化:m_pRecordset.CreateInstance(__uuidof(Recordset)); 推荐你一个经典的ADO类,保证你用ADO不在有困难:)http://www.codeproject.com/database/caaadoclass1.asp 如何自动关闭下拉框的列表框 com的本质是什么呀?是不是以dll的形式体现出来呀?还以什么形式体现呀?现在说com技术面临淘汰是指什么呀?为何要淘汰? 怎么控制ctrl+ scroll lock不能触发事件 关于CreateFile的另一中实现? 如何知道机器COM口(RS232)接口号 如何实现跨网关搜索共享资源? 菜鸟,请各位大侠指教 如何提高我的处理速度!指教 高手在吗?如何让DLL中的函数能处理消息?? 请教高手:如何从当前的IE窗口中获得其中的内容,如Html或Text? 如何调试DLL内的代码 图形刷新问题
BOOL CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption)
{
Close();
if(strcmp(lpstrExec, _T("")) != 0)
m_strQuery = lpstrExec;ASSERT(!m_strQuery.IsEmpty());if(m_pConnection == NULL)
m_pConnection = mpdb;m_strQuery.TrimLeft();
BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0 && nOption == openUnknown;try
{
m_pRecordset->CursorType = adOpenStatic;
m_pRecordset->CursorLocation = adUseClient;
if(bIsSelect || nOption == openQuery || nOption == openUnknown)
m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*mpdb, TRUE), adOpenStatic, adLockOptimistic, adCmdUnknown);
else if(nOption == openTable)
m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE), adOpenKeyset, adLockOptimistic, adCmdTable);
else if(nOption == openStoredProc)
{
m_pCmd->ActiveConnection = mpdb;
m_pCmd->CommandText = _bstr_t(m_strQuery);
m_pCmd->CommandType = adCmdStoredProc;
m_pConnection->CursorLocation = adUseClient;
m_pRecordset = m_pCmd->Execute(NULL, NULL, adCmdText);
}
else
{
TRACE( "Unknown parameter. %d", nOption);
return FALSE;
}
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
}return m_pRecordset != NULL;
}
HRESULT hr=m_pRecordset.CreateInstance("ADODB.Recordset");
if(SUCCEEDED(hr))
{
AfxMessageBox("asdf");
m_pRecordset->Close();//1
....
}
进行判断,确实运行到1就出错,可能真的是m_pRecordset无效,但为什么SUCCEEDED(hr)
是真的呢?
请问m_pRecordset要怎么初始化?
m_pRecordset.CreateInstance(__uuidof(Recordset));
http://www.codeproject.com/database/caaadoclass1.asp