在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; }
推荐阅读
-
在ASP中连接MySQL数据库,最好的通过ODBC方法
-
在Ruby程序中连接数据库的详细教程
-
python中连接三大主流数据库mysql,mongodb和redis的操作教程
-
在VS2010中连接MySQL和Access数据库的教程
-
如何用Visual Studio操作MySQL?在Visual Studio中连接MySQL数据库的方法
-
在ASP中连接MySQL数据库的方法,最好的通过ODBC方法
-
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结_PHP教程
-
Php连接及读取和写入mysql数据库的常用代码,php写入mysql数据库_PHP教程
-
在现时中小型网站的实际开发中,连接MySQL数据库主要使用哪种计算
-
在ASP中连接MySQL数据库,最好的通过ODBC方法