一.ADO简介
MFC下最常见的两种连接数据库的方式就ODBC和ADO,而ADO是在OLEDB之上的高层数据库访问技术,其最大的优势就进行了封装,这样可以使我们在程序中控制对数据库的操作更加方便,而且当单独封装成类后,符合模块化的思想。
二.ADO类的实现
首先声明,本程序的ADO可能参照了某个人写过的,但自己实在记不清了,特此致歉。
ADO是一种高层的数据库访问计数,那么必须要有底层的驱动与之对应。在我们平时使用Oracle和SQL Server时,一般程序安装包会直接安装好数据库的驱动。而我们平时使用Mysql时则大不一样,很少人用mysql的安装包进行安装,大多时候都是使用下载压缩包然后命令行的方式进行安装,这样导致的就是根本没有mysql的OLEDB驱动。所以我们就不得不自己去官网去下载对应的驱动程序 https://dev.mysql.com/downloads/connector/odbc/ 选择与自己系统相符合的就可。
三.ADO中的两种方式
1.非ODBC方式
如图所示我下载安装的是这个
当安装完毕后,打开控制面板->系统和安全->管理工具->ODBC数据源->打开后点击“添加”按钮->向下滑发现“MySQL ODBC 5.3 Unicode Driver”然后关闭这些。
连接字符串这样写
m_pConnection->Open("Driver=MySQL ODBC 5.3 Unicode Driver;Server= 127.0.0.1;Database=mystock", "root", "123456", adModeUnknown);
2.ODBC方式
同样按照上面的方法,打开ODBC数据源(32)位,按照如下所示
这种方式连接字符串这样写
m_pConnection->Open("DSN=MYSQL_ADO;Server= 127.0.0.1;Database=db_student", "root", "123456", adModeUnknown)
附录
ADO.h
#pragma once
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
#include "string.h"
class ADO
{
public:
_ConnectionPtr m_pConnection; //链接对象指针
_RecordsetPtr m_pRecordset; // 记录集对象指针
ADO(void);
~ADO(void);
void OnInitADOconn(); //链接数据库
_RecordsetPtr & OpenRecordset(CString orcale);//打开记录集
void CloseRecodset(); //关闭记录集
void CloseConn(); //关闭数据库
UINT GetRecordCount(_RecordsetPtr pRecordset); //获得记录数
BOOL ExecuteSQL(_bstr_t bstrSQL);
};
ADO.cpp
#include "stdafx.h"
#include "ADO.h"
ADO::ADO(void)
{
}
ADO::~ADO(void)
{
}
void ADO::OnInitADOconn()
{
::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");//创建链接对象
//m_pConnection->Open("DSN=MYSQL;Server= 127.0.0.1;Database=db_student", "root", "123456", adModeUnknown);//链接语句方法一
m_pConnection->Open("Driver=MySQL ODBC 5.3 Unicode Driver;Server= 127.0.0.1;Database=mystock", "root", "123456", adModeUnknown);//链接语句方法二
}
catch (_com_error e)
{
AfxMessageBox(e.Description()); //弹出错误
}
}
_RecordsetPtr & ADO::OpenRecordset(CString orcale)
{
ASSERT(!orcale.IsEmpty()); //orcale语句不能为空
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset));//穿件记录对象
m_pRecordset->Open(_bstr_t(orcale), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);//执行orcale得到记录集
}
catch (_com_error e)//捕捉异常
{
AfxMessageBox(e.Description());
}
return m_pRecordset;//返回记录指针
}
void ADO::CloseRecodset()
{
if (m_pRecordset->GetState() == adStateOpen)//判断当前记录集状态
m_pRecordset->Close();//关闭记录集
}
void ADO::CloseConn()
{
m_pConnection->Close();//关闭数据库连接
::CoUninitialize();
}
UINT ADO::GetRecordCount(_RecordsetPtr pRecordset)
{
int nCount = 0;
try
{
pRecordset->MoveFirst(); //将记录指针移动到第一条记录上
}
catch (...)
{
return 0; //出错返回0
}
if (pRecordset->adoEOF)
return 0; //无记录返回0
while (!pRecordset->adoEOF)//指针未到最后一条记录
{
pRecordset->MoveNext();
nCount = nCount + 1;
}
pRecordset->MoveFirst();//将记录指针移到第一条
return nCount;
}
BOOL ADO::ExecuteSQL(_bstr_t bstrSQL)
{
_variant_t RecordsAffected;
try
{
m_pConnection->Execute(bstrSQL, NULL, adCmdText);//adCmdText文本命令
return true;
}
catch (_com_error e)
{
e.Description();
return false;
}
}