本文采用ADO来进行数据库的连接,ADO(ActiveX Data Objects)是ActiveX数据对象的简称,是一个访问数据库中数据的编程接口。利用ADO技术实现数据库操作主要分为以下步骤:
①引入ADO库,
②定义连接对象指针和记录集指针;
③初始化COM库;
④通过连接对象指针连接数据库;
⑤通过记录集指针访问数据库;
⑥关闭数据库连接。
⑦释放COM环境
本文将以ACCESS数据库和MySQL数据库为例,详细介绍通过ADO进行数据库访问的步骤和常见问题。
这一步在#include语句后面,通过#import语句实现,代码固定,对于Win7系统,代码如下:
#import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
连接对象指针用来创建和数据库的连接;记录集指针用来执行SQL语句,并对SQL语句返回的数据进行操作,这两个指针是ADO技术的关键,但其定义语句固定,代码如下:
_RecordsetPtr m_pRecordset; //定义连接对象指针
_ConnectionPtr m_pConnection; //定义记录集指针
在使用COM库之前,必须对其进行初始化操作,代码固定,如下所示:
::CoInitialize(NULL);
这一步是ADO操作数据库的难点,分为两步进行,第一步是实例化连接对象指针,第二步是通过连接对象指针的Open方法建立与数据库的连接。
实例化连接对象指针有以下两种方法:
1)m_pConnection.CreateInstance("ADODB.Connection");
2)m_pConnection.CreateInstance(__uuidof(Connection));
本文针对的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。
本文连接的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驱动。
这部分代码相对固定,具体代码如下:
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();
}
//关闭数据库连接
if (m_pRecordset->GetState() == adStateOpen)
{
m_pRecordset->Close();
}
m_pConnection->Close();
m_pConnection.Release();
::CoUninitialize();
#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;
}