欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在VS2010中连接MySQL和Access数据库的教程

程序员文章站 2022-03-23 20:33:12
1 基本介绍 本文采用ADO来进行数据库的连接,ADO(ActiveX Data Objects)是ActiveX数据对象的简称,是一个访问数据库中数据的编程接口。利用ADO技术...

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;
}