首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

ADO连接SQL Server出错。请来帮帮忙,该如何解决

2012-01-21 
ADO连接SQL Server出错。。。请来帮帮忙我用MFC做一个对话框,想用ADO方式连接数据库,以访问数据库中的数据,我

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;} 

热点排行