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数据库 的相关文章

  • Hibernate 可以使用 MySQL 的“ON DUPLICATE KEY UPDATE”语法吗?

    MySQL 支持 INSERT ON DUPLICATE KEY UPDATE 语法允许您 盲目 插入数据库 并回退到更新现有记录 如果存在 当您想要快速事务隔离并且想要更新的值取决于数据库中已有的值时 这非常有用 作为一个人为的示例 假设
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 调试器忽略动态加载的 DLL 中的错误

    我有一个与自编码 DLL 的调试相关的非常奇怪的问题 我有一个 MFC 驱动的基于对话框的应用程序 几个静态链接的项目和几个在运行时加载的 DLL 项目 我在调试中构建解决方案 运行应用程序 然后我可以轻松调试这些 DLL 项目 现在问题来
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • SQL 检查一组日期是否在指定的日期范围内

    我有一个表 其中保存架构中房间不可用的日期 ROOM ID DATE UNAVAILABLE 我需要一个 sql 查询来检查两个日期范围内是否有可用房间 类似于 Select All rooms that are constantly av
  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • 将 UPDATE 转换为 INSERT INTO ON DUPLICATE KEY UPDATE 语句

    我有这个 UPDATE MySQL 语句 效果很好 UPDATE table1 Inner Join table2 ON table2 id table1 gw id SET table1 field1 1 table1 field2 2
  • MySQL 全文搜索不适用于某些单词,例如“house”

    我已经在 3 个字段中的一小部分记录上设置了全文索引 也尝试了 3 个字段的组合 并得到了相同的结果 有些单词返回结果很好 但某些单词如 house 和 澳大利亚 不这样做 有趣的是 澳大利亚 和 家乡 这样做 这似乎是奇怪的行为 如果我添
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • ActiveRecord3死锁重试

    Rails 3 或 ActiveRecord 3 是否有任何插件可以复制旧版本死锁重试 http agilewebdevelopment com plugins deadlock retry插入 或者 该插件仍然适用于 Rails 3 吗
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int

随机推荐

  • 最大二叉树(分治)

    给定一个不含重复元素的整数数组 以此数组直接递归构建的最大二叉树 最大二叉树定义如下 二叉树的根是数组中的最大元素 左子树是通过数组中最大值左边部分递归构造出的最大二叉树 右子树是通过数组中最大值右边部分递归构造出的最大二叉树 返回有给定数
  • 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之上的高层数据库访问技术 其最大的优势就进行了封装 这样可以使我们在程序中控制对数据库的操作更加方便 而且当单独封装成类后 符合模块化的思想 二