ADO为什么不能建立access连接?

alan118 2003-10-18 12:29:40

代码: CString strConn=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Spring.mdb");
CString strSql=_T("");
strSql.Format("select * from User where UserName=%s",(LPCTSTR) m_UserName);
::CoInitialize(NULL);
_ConnectionPtr pConn=NULL;
_RecordsetPtr pRecordSet=NULL;
try
{
pConn.CreateInstance(__uuidof (Connection));
pConn->Open((_bstr_t)strConn,"","",adConnectUnspecified);
pConn->Close();

}
catch(_com_error& e)
{
AfxMessageBox("not right");
return ;
}
::CoUninitialize();
第一次用ado,不知道哪里出问题了,debug 的时候发现pConn在CreateInstance后仍然是0,导致总是抛出异常
到底是什么问题呢?
...全文
64 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyuan_01 2003-10-18
  • 打赏
  • 举报
回复
用这个试一下吧,返回0不一定是错误
HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
if(FAILED(hr))
AfxMessageBox("Failed");
如果失败那是你的COM环境没初始化好
然后做
try
{
pConn->Open((_bstr_t)strConn,"","",adConnectUnspecified);

}
catch(_com_error& e)
{
AfxMessageBox("not right");
return ;
}
smch 2003-10-18
  • 打赏
  • 举报
回复
参考一下
smch 2003-10-18
  • 打赏
  • 举报
回复
try
{
m_pAccessConnection.CreateInstance(__uuidof(Connection));
_bstr_t bstrConnectionString="driver={Microsoft Access Driver (*.mdb)};dbq=db.mdb;";
m_pAccessConnection->Open(bstrConnectionString,_bstr_t("管理员"),_bstr_t("aaa"),adConnectUnspecified);
}
catch ( _com_error &e )
{
_bstr_t bstrSource (e.Source());
_bstr_t bstrDescription (e.Description());
CString strError;
strError.Format("无法连接Access数据库。\r\n错误代码是:%08lx\r\n错误的原因是:%s\r\n错误源是:%s\r\n错误的描述是:%s\r\n", e.Error (), e.ErrorMessage (), (LPCTSTR) bstrSource, (LPCTSTR) bstrDescription);
MessageBox (strError, bstrDescription,MB_OK);
return false;
}
catch(CException &e)
{
e.ReportError();
e.Delete();
return false;
}
catch (...)
{
TRACE ( "*** 无法解决的错误 ***" );
return false;
}
return true;
xushinhwa2003 2003-10-18
  • 打赏
  • 举报
回复
用这个试一下吧,返回0不一定是错误
HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
if(FAILED(hr))
AfxMessageBox("Failed");
如果失败那是你的COM环境没初始化好
然后做
try
{
pConn->Open((_bstr_t)strConn,"","",adConnectUnspecified);

}
catch(_com_error& e)
{
AfxMessageBox("not right");
return ;
}
ufox 2003-10-18
  • 打赏
  • 举报
回复
::CoInitialize(NULL);
_ConnectionPtr pConn=NULL;
_RecordsetPtr pRecordSet=NULL;

好象是你自己把pConn给清空了,为什么?去掉该行即可
_ConnectionPtr pConn=NULL;
_RecordsetPtr pRecordSet=NULL;
AkiraChing 2003-10-18
  • 打赏
  • 举报
回复
你是在单线程里调用吗
smch 2003-10-18
  • 打赏
  • 举报
回复
你的初始化是对的,一般来说::CoInitialize(NULL)是没什么错误的,你可以判断返回值。
alan118 2003-10-18
  • 打赏
  • 举报
回复
我是在单线程中调用

FAILED()我试过,失败,com环境怎么初始化??要作什么设置?
首先新建一个工程名称为ADO的基本对话框工程。然后: 1.在头文件stdafx.h 中加入 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF") 2.在ADODLG.cpp中加入 void CADODlg::OnBtnQuery() { CoInitialize(NULL); // 初始化COM环境 _ConnectionPtr conn(__uuidof(Connection)); // 创建连接对象 _RecordsetPtr rst(__uuidof(Recordset)); // 创建记录集 try { conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb;Persist Security Info=False;Jet OLEDB:Database Password=691126" ,"", "", adModeUnknown); // 打开数据库并建立连接(有密码) //conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb;" ,"", "", adModeUnknown); // 打开数据库并建立连接(没有密码) rst->Open(_variant_t("select * from sheet1"), _variant_t((IDispatch*) conn), adOpenDynamic, adLockOptimistic, -1); // 读取数据表 while(!rst->rsEOF) { ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)rst->GetCollect("姓名")); // 查询"姓名"字段 rst->MoveNext(); } } catch(_com_error e) { CString errormessage; // 保存错误信息 errormessage.Format("Error: %s", e.ErrorMessage()); // 设置错误信息的格式 //AfxMessageBox(errormessage); // 以对话框的形式输出错误信息 MessageBox(errormessage,"错误提示"); } //MessageBox("查询结束!","提示",0); rst->Close(); conn->Close(); rst.Release(); // 释放相应COM接口上的引用计数 conn.Release(); CoUninitialize(); // 卸载COM环境库 }

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧