C++使用ADO连接Access数据库方法

在程序的开始,首先导入所需要的库:#import “c:\program files\common files\system\ado\msado15.dll” no_namespace rename(“EOF”, “adoEOF”) ,这里重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数-1。
参考:https://blog.csdn.net/flywithmj/article/details/7346764

#include <sql.h>   //数据库头文件
#include <sqlext.h>
#include <odbcinst.h>
#include <iostream>
#import "c:\program files\common files\system\ado\msado15.dll"  no_namespace  rename ("EOF", "adoEOF")


BOOL bConn;
bConn=SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)", ("CREATE_DB="+mdbName+" General\0").c_str());  //创建.mdb文件
if(!bConn)
	std::cout<<"connect failed!!"<<std::endl;
Initialize(NULL);         //初始化OLE/COM库环境
	//在引入ado并初始化成功com库后,就可以使用智能指针了
	_ConnectionPtr m_pConnection;  
	_RecordsetPtr m_pRecordset;  
	HRESULT hr;
	try
	{
		hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象

		if(SUCCEEDED(hr))
		{            
			hr = m_pConnection->Open(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"数据库文件路径如C:\\yyyy\\666.mdb").c_str(),"","",adModeUnknown);          //access2003
			//			hr = m_pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.accdb","","",adModeUnknown);    //access2007
			printf("成功连接数据库\n");
		}
	}
	catch(_com_error e)///捕捉异常
	{       
		printf("连接数据库失败!\n");
		ogde::util::Log::getDefaultInstance()->addErrorInfo(mdbPath,"","连接数据库失败!");
		return 0;
	}
	m_pRecordset.CreateInstance(__uuidof(Recordset)); //实例化结果集对象   
	try  
	{   
		_variant_t ra;
		std::string sql="CREATE TABLE "+"表名"+"(";
		for(int i=0,sum=vec.size();i<sum;++i)
		{
			if(i!=0)
				sql=sql+",";
			sql=sql+vec[i].mdbField+" TEXT";
		}
		sql=sql.append(")");

		if(!m_pConnection->Execute(sql.c_str(),&ra,adCmdText)) 
		{
			std::cout<<"创建表失败";
			ogde::util::Log::getDefaultInstance()->addErrorInfo(layerName,"","创建表失败");
			return false;
		}
		
	}   
	catch(_com_error* e)   
	{   
		wprintf((const wchar_t *)(e->ErrorMessage()));   
		if(m_pConnection->State)   
		{   
			m_pConnection->Close();   
			m_pConnection= NULL;   
		}
		CoUninitialize();
		return 0;   
	} 


Access数据库不支持事务操作,可以使用ADO类来实现类似事务操作,不过效率也不高。如果需要导入或者导出大量数据可以试试

std::string sql="INSERT INTO "+"表名"+" SELECT * FROM [Text;DATABASE="+"txt路径如 C:\\yyyy"+"].文件名如Test.txt";
m_pConnection->Execute(sql.c_str(),&ra,adCmdText);	

可以将txt内容导入到数据库。 文本第一行是字段名,列之间用,分开。

猜你喜欢

转载自blog.csdn.net/qq_37243472/article/details/84029286