MFC下ADO连接MYSQL数据库

2023-11-02

一.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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC下ADO连接MYSQL数据库 的相关文章

  • 根据 MySQL 列内容的长度创建索引?

    如何根据值的长度在 MySQL v 5 0 myisam 数据库引擎 中的列上创建索引 它是文本数据类型 最多 7000 个字符 我是否必须添加具有第一列长度的另一列 是的 因为 MySQL 不支持基于函数的索引 例如ADD INDEX m
  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • MySQL获取最后10条记录中的第一条记录

    在Mysql中 我试图获取最后10条记录中最旧的记录 为了得到最后 10 个我会简单地做SELECT FROM table ORDER BY id DESC LIMIT 10 为了获得最旧的 我只需使用 ASC 顺序 我需要首先按 DESC
  • PHP:使用输入和输出参数(不是“INOUT”)调用 MySQL 存储过程

    我想从 PHP 调用 MySQL 中的存储过程 该过程需要输入and输出参数 not INOUT 参数 举一个简单的例子 假设我在 MySQL 中有以下存储过程 DELIMITER DROP PROCEDURE IF EXISTS test
  • 按 MAX(time) WHERE time <= x 选择最近的 MySQL 行

    我正在选择 MySQL 表的最新条目 SELECT MAX time as most recent userID FROM TableName GROUP BY userID ORDER BY most recent DESC 我的问题是
  • PDO::commit 之后使用 PDOStatement::rowCount 结果?

    在 MySQL 文档中 有一个关于使用的注释mysql affected rows事务提交后 http php net manual en function mysql affected rows php http php net manu
  • 如何在MySQL中查找上周的数据

    我想显示来自 Q1 每个学生只有最后一周 Q2 每个学生只有最后一个月 我怎样才能实现这个目标 一周演示 http sqlfiddle com 2 f1fbb 3 当月演示 http sqlfiddle com 2 f1fbb 4 CREA
  • 显示过去 7 天 PHP 的结果

    我想做的是显示过去 30 天的文章 但我现有的代码不断给我一个 mysql fetch assoc 错误 然后追溯到我的查询 这是代码 sql mysql query SELECT FROM table WHERE DATE datetim
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • 从数据库生成 XML 时出现 PHP 编码错误 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试获取一个简单的 PHP 服
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • 更新重复密钥上的复合密钥 [重复]

    这个问题在这里已经有答案了 我需要更新新行 如果两者都满足 date dat and empId who 作为复合键 但如果其中之一或两者不同 则插入 sql INSERT INTO history SET endtimestamp now
  • 本地数据库缓存的最佳实践?

    我正在开发一个应用程序 该应用程序的部分内容依赖于 MySQL 数据库 在某些情况下 应用程序将在互联网连接 UMTS 有限的环境中运行 特别是延迟较高的环境 应用程序的用户能够登录 并且应用程序用户界面的大部分内容都是从 MySQL 数据
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • Laravel Group By 和 Order By 不起作用

    我尝试制作一个Laravel 5 8项目 项目中的数据是这样的 id purch name prcvalue 1 10234 Nabila 100 2 10234 Nadeera 450 3 10234 Nabila 540 4 10234
  • 如何解决 MySQL innodb 在 TRUNCATE TABLE 上“等待表元数据锁”?

    在 GitLab CI 服务器中运行包含数百个应用程序单元测试的测试套件 运行 10 次测试后 不知怎的 它总是卡在等待 TRUNCATE TABLE 上的表元数据锁上 这是一个拆卸步骤 我知道SHOW ENGINE INNODB STAT

随机推荐

  • 最大二叉树(分治)

    给定一个不含重复元素的整数数组 以此数组直接递归构建的最大二叉树 最大二叉树定义如下 二叉树的根是数组中的最大元素 左子树是通过数组中最大值左边部分递归构造出的最大二叉树 右子树是通过数组中最大值右边部分递归构造出的最大二叉树 返回有给定数
  • fopen和fopen_s用法的比较

    在定义FILE fp 之后 fopen的用法是 fp fopen filename w 而对于fopen s来说 还得定义另外一个变量errno t err 然后err fopen s fp filename w 返回值的话 对于fopen
  • 高可用方案之脑裂问题探讨

    关于脑裂我们先来看看红帽的文档是如何解释的 What does split brain mean Split brain is a condition whereby two or more computers or groups of c
  • 【C 练习】分开打印一个数的每一位数字

    例 输入1234 输出1 2 3 4 我们可以通过下面这种方法得到每一位 int num 0 scanf d num while num gt 9 当数字大于9就不进入循环 直接在最后打印 printf d num 10 取到最后一位 nu
  • java测试数据库的连接,java怎么测试数据库连接数量

    import java sql public class DatabaseOrcale public DatabaseOrcale public static void main String args String OrcaleDrive
  • Object.defineProperty、Proxy、Reflect、vue2/vue3的响应式原理

    Object defineProperty const obj name 小黑 age 18 Object keys obj forEach key gt let value obj key Object defineProperty ob
  • vscode配置C++和Opencv(ubuntu18.04)

    安装opencv参考 Ubuntu18 04安装Opencv4 5 最新最详细 配置vscode参考 Ubuntu20 04 Ubuntu22 04 配置VScode Opencv cmake C Ubuntu环境下VScode配置Open
  • Java反射机制详解——框架的灵魂所在

    反射作为框架的核心 在Java中处于一个极为重要的地位 而且反射在Java中属于比较高级的技术 需要有对Java一定的理解才可以掌握好 反射可以在程序运行过程中修改程序的行为 但是与此同时反射也是极其危险的 需要谨慎使用 Class Cla
  • 【CTF】Crypto Writeup【思路已经告诉你了】

    题目 标题 思路已经告诉你了 THERE IS A WORD len WORD 4 md5 WORD key cf9c6242ecfbc924842c8a2095e44c5a SHA256 SHA256 WORD FLAG KEY SHA2
  • Android项目中运行main方法,进行测试,配置方法

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到教程 在高版本的Android Studio中 在Android项目中 直接运行main方法会报错 配置方法如下 1 找到 idea文件夹 2
  • idea中如何清除大量无用的废弃代码呢

    如何便捷的找到整个工程中废弃无用的私有方法 类以及变量呢 类似于 这样的 就说明该类没有任何地方引用 此时这样的类留在我们工程中 白白占用空间 拖慢启动速度 增大读代码的代价 如何轻松快速的把这些无用的代码一次抓出来呢 这里给出一种很简便的
  • DINO 论文笔记

    DINO DETR with Improved DeNoising Anchor Boxes for End to End Object Detection DINO通过使用对比方法 混合查询选择方法的anchor初始化的和盒子预测的loo
  • 【看后必会】一步步教你用React写一个markdown实时编辑器!

    1 实现效果 最近在用React写一个博客管理系统 有一个功能是添加新文章 在新建文章的页面 我希望做到像CSDN这样 左边是编辑区 markdown格式 右边是预览区 实时更新 编辑文本的同时 在预览区就能看到效果 就自己动手实现了一个这
  • 华为OD 机试3题(通过率60%,80%,75%)

    import java util List import java util Scanner import java util class Points int x int y public Points int x int y this
  • uni-app:刷新当前页面

    var pages getCurrentPages 获取所有页面的数组对象 var currPage pages pages length 1 当前页面 uni redirectTo url currPage page fullPath 执
  • [javascript] 深入理解js闭包

    闭包 closure 是Javascript语言的一个难点 也是它的特色 很多高级应用都要依靠闭包实现 一 变量的作用域 要理解闭包 首先必须理解Javascript特殊的变量作用域 变量的作用域无非就是两种 全局变量和局部变量 Javas
  • MULTI-CHANNEL SPEECH ENHANCEMENT USING GRAPH NEURAL NETWORKS 文献翻译

    MULTI CHANNEL SPEECH ENHANCEMENT USING GRAPH NEURAL NETWORKS 文献翻译 来自于脸书实验室的一篇文章 将图神经网络用在了多通道语音增强上面 思路比较新奇 下面可以通篇看一下翻译的中文
  • [整理]Linux配置开启SSH服务

    查看SSH是否已经安装 系统一般自带 rpm qa grep ssh 安装SSH yum install ssh 启动SSH service sshd start 停止SSH service sshd stop 重启SSH service
  • Windows下cmd命令,进入指定目录,创建查看目录

    Windows的cmd如何进入指定目录 1 进入指定盘 盘符 不区分大小写 只有盘符不区分 其下的一级到多级目录需要区分大小写 gt c gt d 2 进入D盘下的文件夹中 D盘下的一级目录可以使用下面三种进入 必须是在D gt 下键入 二
  • MFC下ADO连接MYSQL数据库

    一 ADO简介 MFC下最常见的两种连接数据库的方式就ODBC和ADO 而ADO是在OLEDB之上的高层数据库访问技术 其最大的优势就进行了封装 这样可以使我们在程序中控制对数据库的操作更加方便 而且当单独封装成类后 符合模块化的思想 二