ADO连接SQL Server出错。。。请来帮帮忙
我用MFC做一个对话框,想用ADO方式连接数据库,以访问数据库中的数据,
我安的是sql server 2005,
我本想单击“确定”后在一个list控件显示表中的ID字段,请大家看一下:
void CMyDlg::OnBtnShow()
{
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_bstr_t sConn;
sConn="Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=userman;Data Source=localhost;";
m_pConnection->Open(sConn,"","",adModeUnknown);//打开连接
m_pRecordset->Open(_variant_t("select *from info_student"),_variant_t((IDispatch*)m_pConnection),
adOpenDynamic,adLockOptimistic,-1);//打开记录集
if(m_pRecordset->State==adStateClosed)
AfxMessageBox("linking error!");
m_pRecordset->MoveFirst();
while(!m_pRecordset->adoEOF)
{
_bstr_t rst;
rst=m_pRecordset->GetCollect(_variant_t("ID"));
m_list.AddString(rst);
m_pRecordset->MoveNext();
}
}
连接运行还可以,单击确定时,提示出错,提示:Runtime error!
请高手看一下,这是什么原因。
[解决办法]
单步执行,看错在那句话上了,或者加上try catch异常处理,让它报出出错信息。
另外,连接数据库,open数据库的代码放在对话框初始化的函数中,
把close数据库的代码放在对话框的关闭事件中,
你这样,每点一次按钮就连一次数据库,而且只open没有close。
这都是不对的。
[解决办法]
try-catch + GetLastError + debug
m_pConnection->Open, m_pRecordset->Open 以及
while(!m_pRecordset->adoEOF)
{
_bstr_t rst;
rst=m_pRecordset->GetCollect(_variant_t("ID"));
m_list.AddString(rst);
m_pRecordset->MoveNext();
}
都加到try catch 中, 直接在catch中就能看到异常 如果没有再用GetLastError
[解决办法]
try
{
你的数据库代码
}
catch(_com_error e)
{
MessageBox(NULL, e.Description(), _T("CDialog"), MB_OK);
}
看看有什么异常消息没有??
[解决办法]
- C/C++ code
std::vector<std::vector<CString> > SelectCMD(CString SQL){ CString Data; //::CoInitialize(NULL); std::vector<std::vector<CString> > table; try { _RecordsetPtr PRs("ADODB.Recordset"); _ConnectionPtr PConn("ADODB.Connection"); PConn->Open((_bstr_t)LocalConnStr,"","",adModeUnknown); if(PConn!=NULL) { _variant_t RecordsAffected; _variant_t str_val; PRs=PConn->Execute((_bstr_t)SQL,&RecordsAffected,adCmdText); while(PRs!=NULL&&!PRs->adoEOF) { std::vector<CString> rs; int cols=PRs->GetFields()->Count; for(int i=0;i<cols;i++) { CString val; str_val = PRs->GetCollect(long(i)); val= CString((char *)(_bstr_t)str_val); rs.push_back(val); } table.push_back(rs); PRs->MoveNext(); } PRs->Close(); PConn->Close(); } } catch(_com_error e) //异常 { // CString Data; // Data.Format("SelectCMD connect database error,error catagory is %s\n",(char *)e.ErrorMessage()); // Debug(Data); } catch(...) { // Debug("SelectCMD error"); }//::CoUninitialize(); return table;}