如何在VS2010中连接MySQL和Access数据库

1 基本介绍

本文采用ADO来进行数据库的连接,ADO(ActiveX Data Objects)是ActiveX数据对象的简称,是一个访问数据库中数据的编程接口。利用ADO技术实现数据库操作主要分为以下步骤:

①引入ADO库,

②定义连接对象指针和记录集指针;

③初始化COM库;

④通过连接对象指针连接数据库;

⑤通过记录集指针访问数据库;

⑥关闭数据库连接。

⑦释放COM环境

本文将以ACCESS数据库和MySQL数据库为例,详细介绍通过ADO进行数据库访问的步骤和常见问题。

2 引入ADO库

这一步在#include语句后面,通过#import语句实现,代码固定,对于Win7系统,代码如下:

#import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

3 定义连接对象指针和记录集指针

连接对象指针用来创建和数据库的连接;记录集指针用来执行SQL语句,并对SQL语句返回的数据进行操作,这两个指针是ADO技术的关键,但其定义语句固定,代码如下:

	_RecordsetPtr  m_pRecordset;	//定义连接对象指针
	_ConnectionPtr  m_pConnection;  //定义记录集指针

4 初始化COM组件

在使用COM库之前,必须对其进行初始化操作,代码固定,如下所示:

::CoInitialize(NULL);

5 通过连接对象指针连接数据库

这一步是ADO操作数据库的难点,分为两步进行,第一步是实例化连接对象指针,第二步是通过连接对象指针的Open方法建立与数据库的连接。

5.1 实例化连接对象指针

实例化连接对象指针有以下两种方法:

	1)m_pConnection.CreateInstance("ADODB.Connection");
	2)m_pConnection.CreateInstance(__uuidof(Connection));

5.2 建立与数据库的连接

5.2.1 连接ACCESS数据库

本文针对的ACCESS数据库是Win7系统自带的Microsoft Office Access 2007数据库,需要特别注意的是因为其版本为32位,因此必须将VS 2010工程的解决方案平台设置为Win32,否则如果解决方案平台为x64,采用ADO技术将无法连接ACCESS数据库。

连接ACCESS数据库共有一下三种方法:


		1)m_pConnection -> Open("Provider = Microsoft. Jet.OLEDB. 4.0;Data Source=D:\\test.mdb","","",adModeUnknown);
		2)m_pConnection-> Open("Provider=Microsoft. ACE.OLEDB.12.0; Data Source=D:\\test.accdb","","",adModeUnknown);
		3)m_pConnection->Open("DSN=TestAccess;","", "",  adModeUnknown ); //这种方法是用32位ODBC建一个数据源,起名TestAccess

第一种方法采用Jet引擎访问数据库,第二种方法采用的是ACE引擎,第二种方法既可以访问Office2007也可以访问Office97-2003。本文在D盘下存放了一个名为test的Access数据库,Access数据库的2003版本文件格式后缀为.mdb,2007版本文件格式后缀为. accdb。

第三种方法采用ODBC技术进行连接,需要注意的是,对于64位的电脑,直接通过控制面板-系统和安全-管理工具-数据源(ODBC)是无法添加Access数据源的,因为Access版本是32位,而控制面板-系统和安全-管理工具-数据源(ODBC)调用的是64位的驱动(详见补充说明),需要通过C:\Windows\systemWOW64\odbcad32.exe建立Access数据源。

补充说明:

64位win 7操作系统中,ODBC有两个:

1、C:\Windows\system32\odbcad32.exe——调用64位驱动建立数据源

2、C:\Windows\systemWOW64\odbcad32.exe——调用32位驱动建立数据源

默认控制面板-系统和安全-管理工具-数据源(ODBC)打开的是C:\Windows\system32 \odbcad32.exe。

5.2.2 连接MySQL数据库

本文连接的MySQL数据库的版本为5.6.15,64位,采用的ODBC为mysql-connector-odbc-5.2.6-winx64。

同样需要注意的是,由于MySQL数据库的版本为64位,必须将VS 2010工程的解决方案平台设置为x64,否则如果解决方案平台为Win32,将无法连接MySQL数据库。

连接MySQL数据库共有一下三种方法:

		1)m_pConnection->Open("DSN=MYSQL-ODBC; server=localhost; database= cntipm;" ,"Hector", "7777", adModeUnknown);  
		2)m_pConnection->Open("DSN=MYSQL-ODBC;server=localhost;","Hector", "7777", adModeUnknown);  
		3)m_pConnection->Open("Driver=MySQL ODBC 5.2 ANSI Driver; DATABASE=cntipm; server=localhost", "Hector", "7777",adModeUnknown);

第一二中方法基本相同,将第一种方法中的“database= cntipm”省略就是第二种方法,cntipm指的是数据库的名称,这两种方法都是通过设置ODBC建立连接的,因为在设置ODBC时指定了数据库的名称,因此“database= cntipm”可以省略。

第三种方法是参考网上的方法。

说明:

MYSQL-ODBC指的是本文建立的ODBC数据源的名称,Hector是用户名,7777是密码,MySQLODBC 5.2 ANSI Driver指的是本文所安装的mysql-connector- odbc-5.2.6-winx64驱动。

6 通过记录集指针访问数据库

这部分代码相对固定,具体代码如下:

		m_pRecordset.CreateInstance(_uuidof(Recordset));
		m_pRecordset->Open(_bstr_t("SELECT * FROM School"),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

如果想进一步输出查到的数据,可以进行如下操作:

	while (!m_pRecordset->adoEOF)
	{
		_variant_t NameVal = m_pRecordset->GetCollect("SchoolName");
		//m_pRecordset->PutCollect("Number",77);//设置Number列的每一个数都是77
		string strTemp = (char*)(_bstr_t)NameVal;
		cout<MoveNext();
	}

7 关闭数据库连接

	//关闭数据库连接
	if (m_pRecordset->GetState() == adStateOpen)
	{
		m_pRecordset->Close();
	}
	m_pConnection->Close();
	m_pConnection.Release();

8 释放COM环境

::CoUninitialize();

9 完整代码示范

#include 
#include 
#import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

using namespace std;

int main(void)
{
	_RecordsetPtr  m_pRecordset;	//定义连接对象指针
	_ConnectionPtr  m_pConnection;  //定义记录集指针
	
	::MessageBox(NULL,_T("准备连接数据库"),_T("提示"),MB_OK|MB_ICONWARNING);

	//COM初始化
	::CoInitialize(NULL);
	m_pConnection.CreateInstance("ADODB.Connection");
	//m_pConnection.CreateInstance(__uuidof(Connection));//Connection用于与数据库服务器的链接另一种方式
	try
	{
		//以下两句代码用来连接ACCESS数据库,前提是配置管理器只能是Win32
		//m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\test.accdb","","",adModeUnknown);
		//m_pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\test.accdb","","",adModeUnknown);
		//m_pConnection->Open("DSN=TestAccess;","", "", adModeUnknown);//这种方法是用32位ODBC建一个数据源,起名TestAccess

		//以下三种连接方式均可连接MySQL数据库,通过ODBC连接,前提是配置管理器只能是x64
		m_pConnection->Open("DSN=MYSQL-ODBC;server=localhost;database=cntipm;","Hector", "7777", adModeUnknown);  
		//m_pConnection->Open("DSN=MYSQL-ODBC;server=localhost;","Hector", "7777", adModeUnknown);  
		//m_pConnection->Open("Driver=MySQL ODBC 5.2 ANSI Driver;DATABASE=cntipm;server=localhost","Hector", "7777",adModeUnknown);
	}
	catch (_com_error e)
	{
		cout << e.Description() << endl;
		::MessageBox(NULL,e.Description(),_T("提示"),MB_OK|MB_ICONWARNING);
		::MessageBox(NULL,_T("数据库初始化错误"),_T("提示"),MB_OK|MB_ICONWARNING);
	}
	//执行SQL语句实现数据对象的操作
	try
	{
		m_pRecordset.CreateInstance(_uuidof(Recordset));
		m_pRecordset->Open(_bstr_t("SELECT * FROM School"),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
	}
	catch (_com_error e)
	{
		::MessageBox(NULL,_T("打开记录集错误"),_T("提示"),MB_OK|MB_ICONWARNING);
		return 0;
	}
	//读取数据库表中的数据
	while (!m_pRecordset->adoEOF)
	{
		_variant_t NameVal = m_pRecordset->GetCollect("SchoolName");
		//m_pRecordset->PutCollect("Number",77);//设置Number列的每一个数都是77
		string strTemp = (char*)(_bstr_t)NameVal;
		cout<MoveNext();
	}
	//关闭数据库连接
	if (m_pRecordset->GetState() == adStateOpen)
	{
		m_pRecordset->Close();
	}
	m_pConnection->Close();
	m_pConnection.Release();

	::CoUninitialize();
	
	return 0;
}





你可能感兴趣的:(C++)