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();。

你可能感兴趣的:(数据库,Security,null,database,Access,vc++)