VC++6.0连接ACCESS2007中的一个问题(ConnectionPtr, CreateInstance, CoInitialize(NULL))

最近按照一本书的指导打算做一个VC++访问数据库的小程序,大致如下:

1.先新建一个基于对话框的VC++程序,取名Reg,然后在程序目录里面新建一个文件夹,取名Database,在文件夹里面新建一个Access2007数据库,取名test.accdb。

2.在Reg.h中加入:#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")

3.在CRegApp::InitInstance()中加入:CoInitialize(NULL);在CRegApp::ExitInstance()中加入CoUninitialize();

4.在CRegDlg类中定义protected成员。代码如下:

_ConnectionPtr cn;
CString strPath;
CBitmap m_Bitmap;

5.在CRegDlg::OnInitDialog()中加入

_bstr_t connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\C++\\Reg\\Database\\test.accdb;Persist Security Info=False";
try
{
cn->CursorLocation = adUseClient;
cn->Open(connStr, "", "", adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox((char*)e.Description());
}

到此连接数据库的工作算是做完了,一运行,结果弹出一个对话框,没有什么提示内容,郁闷的调了半天,也没弄明白,总之就是连不上。

于是我查看了一下e的内容,结果显示空指针,再一调试发现cn.CreateInstance(_uuidof(Connection));执行过后的cn仍然是0x00000000,也就是说,ConnectionPtr创建失败,于是开始上网上查原因,功夫不负有心人,找了一天,终于找到了,原因就是要求CoInitialize(NULL)和CreateInstance(_uuidof(Connection))必须在同一个线程中,于是我要第5步的代码前面加上了CoInitialize(NULL),结果顺利的连上了,大功告成。最后别忘了在CRegDlg的析构函数中加入CoUninitialize();。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值