读书人

MFC连接ADO数据库access,编译没有异常

发布时间: 2012-09-07 10:38:15 作者: rapoo

MFC连接ADO数据库access,编译没有错误,运行报错Runtime error!
第一次操作数据库,求指点,谢谢[code=C/C++][/code]void CRecordDialog::OnRecordView()
{
// TODO: Add your control notification handler code here
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command));

pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB4.0;Data Source=INFO.MDB";
pConn->Open("","","",adConnectUnspecified);

pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText="select * from Contact";
pRst=pCmd->Execute(NULL,NULL,adCmdText);
while(!pRst->adoEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
(_bstr_t)pRst->GetCollect("Name"));
pRst->MoveNext();
}

pRst->Close();
pConn->Close();
pCmd.Release();
pRst.Release();
pConn.Release();
CoUninitialize();


}


[解决办法]
尝试下面的代码
[code=C/C++]
_ConnectionPtr m_ptrConnection;

_RecordsetPtr m_ptrRecordset;

_CommandPtr m_ptrCommand;

m_ptrConnection.CreateInstance(__uuidof(Connection));

m_pRecordset.CreateInstance(__uuidof(Recordset));

m_pCommand.CreateInstance(__uuidof(Command));

TCHAR currentDir[1024]={0};

GetCurrentDirectory(1024,currentDir); //获取当前工作目录

CString connectStr;

connectStr.Format(L "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=%s\\db2.mdb ",currentDir);//在当前工作目录下,我的数据库名为db2.mdb

m_ptrConnection-> ConnectionString=(_bstr_t)connectStr;

if(m_ptrConnection-> Open(_bstr_t(connectStr), " ", " ",adConnectUnspecified) != S_OK) //成功连接数据库

{

return false;

}
m_ptrRecordset-> CursorLocation = adUseClient;
HRESULT hr = m_ptrRecordset-> Open(_bstr_t(L "select* from Main "), _variant_t((IDispatch*)m_ptrConnection, TRUE),adOpenStatic,adLockBatchOptimistic,adCmdUnknown);

//以上可以直接复制,以下的就记不太清了,恐怕你要查下MSDN了
m_ptrRecordset-> AddNew();
…………//这里代码根据根据字符名,设置数据库中新增的数据中各字段的值
m_ptrRecordset-> Update(updatebeatch);//参数应该写对了,这个参数是指批量写入数据库,这句非常重要,如果没有,程序是不会将更新写入数据库的
然后就是release()和CoUninitialize()了

因为不在自己电脑上,MSDN和以前的项目都不在身边,也只能记起这些了,你试一下,如果不行,再问吧



[/code]
[解决办法]
加上 try catch 看看

C/C++ code
try{_ConnectionPtr pConn(__uuidof(Connection));_RecordsetPtr pRst(__uuidof(Recordset));_CommandPtr pCmd(__uuidof(Command));pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB4.0;Data Source=INFO.MDB";pConn->Open("","","",adConnectUnspecified);pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));pCmd->CommandText="select * from Contact";pRst=pCmd->Execute(NULL,NULL,adCmdText);while(!pRst->adoEOF){((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Name"));pRst->MoveNext();}}catch (_com_error &e){AfxMessageBox(e.ErrorMessage());AfxMessageBox((LPCTSTR)e.Description());} 

读书人网 >VC/MFC

热点推荐