因为自己觉得新建一个MFC工程太复杂,就在win32控制台下,读取access数据库,这篇主要是记录自己在写这个程序时,遇见的问题:
(vs2010 + access2007)
(1)首先在stdafx.h文件后面加上#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF"),【7】的问题应该这个写正确的话,就不会出现,这句貌似就相当于头文件吧。
(2)就是下面的代码:
#include "stdafx.h" #include <string> #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { _ConnectionPtr pConnection; _RecordsetPtr pRecordset; CoInitialize(NULL);//这里面竟然也有学问,需要初始化这个com,CoInitialize()和AfxOleInit()都可以初始化,但这个AfxOleInit()常用在MFC中,可以参考【3,4】。但在【4】加上头文件后会产生其他的问题 HRESULT hr; try { hr = pConnection.CreateInstance("ADODB.Connection");///创建Connection对象,是不是因为在前面没有写using namespace ADODB的缘故,参考【8】,但这里并没有用::作用域解析符 if(SUCCEEDED(hr)) { hr = pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=data.accdb","","",adModeUnknown);///连接数据库 ///上面一句中连接字串中的Provider是针对ACCESS2007环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; ACCESS2000环境为Microsoft.Jet.OLEDB.4.0,这个data文件应该和.vcxproj文件放在同一个文件夹下 } } catch(_com_error e)///捕捉异常 { //CString errormessage = e.ErrorMessage(); ///*errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage()); //AfxMessageBox(errormessage);///显示错误信息*/ //errormessage = (std::string)e.ErrorMessage(); std::cout << "error in data base" << std::endl; std::cout << e.ErrorMessage() << std::endl;//不知道不用MFC,怎么用这个CString类,貌似照着【5】加入头文件会产生其他的问题。 } pRecordset.CreateInstance("ADODB.Recordset"); try { pRecordset->Open("SELECT * FROM chart", _variant_t((IDispatch*)pConnection, TRUE),adOpenStatic,adLockOptimistic,adCmdText); } catch (_com_error e) { std::cout << "error in the data base" <<std::endl; } while(!pRecordset->adoEOF)//将查询到的数据加到列表框 { _variant_t var; var = pRecordset->GetCollect("st"); /*std::string st; st = std::string(LPCSTR(_bstr_t(var))); std::cout << st << std::endl;*/ double dd; dd = atof(LPCSTR(_bstr_t(var))); std::cout << dd << std::endl; pRecordset->MoveNext(); } pRecordset->Close(); // 需要关闭一下 pConnection->Close(); CoUninitialize(); //这个是和上面的初始化com是成对出现的 std::cin.get(); std::cin.get(); return 0; }
参考:
【1】 c++ 纯API利用ADO连接,读取access数据库! http://hi.baidu.com/uduixjsuhcbjrwq/item/6a91283bce2b5dbc134b141f【2】 VC++6.0连接ACCESS2007中的一个问题(ConnectionPtr, CreateInstance, CoInitialize(NULL)) http://blog.csdn.net/jverson2009/article/details/7795070
【3】为什么用AfxOleInit()能成功初始化COM环境,用CoInitialize()函数却提示我初始化失败 http://bbs.csdn.net/topics/120088738
【4】用VS2003建一win32项目想通过ADO连接数据库,但调用AfxOleInit()函数一直无法通过编译 http://bbs.csdn.net/topics/80291531
【5】使用CString要包含什么头文件吗 http://bbs.csdn.net/topics/40234235
【6】ado连接access 数据库 编译错误 如:“_ConnectionPtr”: 未声明的标识符等 http://bbs.csdn.net/topics/310210096
【7】VC用ADO打开和关闭数据库 http://www.2cto.com/kf/201202/118441.html
【8】使用VC连接Access数据库的两种方法 http://blog.csdn.net/wanshi131/article/details/1758790
【9】vc++ ADO连接access(摘)详解+实例 http://www.lewensky.cn/read.php/216.htm