MFC下ADO连接MYSQL数据库

一.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;
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页