现在的位置: 首页 > 综合 > 正文

win32控制台程序读取access

2014年04月05日 ⁄ 综合 ⁄ 共 2649字 ⁄ 字号 评论关闭

因为自己觉得新建一个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

抱歉!评论已关闭.