当前位置: 首页 > news >正文

【MFC】数据库操作——ODBC(20)

ODBC:开放式数据库连接,是为解决异构数据库(不同数据库采用的数据存储方法不同)共享而产生的。ODBC API相对来说非常复杂,这里介绍MFC的ODBC类。

添加ODBC用户DSN

首先,在计算机中添加用户DSN:(WIN10下,搜索ODBC)

 点添加,以SQL Server为例,其他类似(MYSQL需要安装对应的ODBC驱动):

 填写DSN名称、描述,IP地址(本机用127.0.0.1)

 本机用windows用户登录,其他电脑可以使用用户名+密码登录:

 选择对应的数据库(要注意!)

 点完成后,测试一下数据源:

在ODBC中出现用户DSN,表明添加成功。

使用MFC ODBC类

创建工程-》单文档-》在数据库支持步,选择数据库:

 点击数据源,选择上面添加的test :

 点确定后,选择数据库中的表格(只能选择一张表):

 点确定后,创建完工程,打开资源视图,在主视图中添加一些控件,用于显示数据库中数据:

 注意控件与数据库中表格进行对应:(示例中显示数据库表中的四列)

修改视图代码,直接完成控件与数据库列的绑定:

在视图类中响应工具栏中的四个命令:

 代码如下:

 运行程序即可以看到数据库中数据(有一个安全警告,删除代码即可)

添加排序、搜索功能:

通过设置RecordSet的排序字段 m_strSort  重新查询数据库即可以完成按该关键字排序

通过设置RecordSet的排序字段 m_strFilter 则可以根据该字段对数据库进行搜索(其实就是where子句)

代码如下:

视图头文件:


// MFC10View.h : CMFC10View 类的接口
//#pragma onceclass CMFC10Set;class CMFC10View : public CRecordView
{
protected: // 仅从序列化创建CMFC10View();DECLARE_DYNCREATE(CMFC10View)public:enum{ IDD = IDD_MFC10_FORM };CMFC10Set* m_pSet;// 特性
public:CMFC10Doc* GetDocument() const;// 操作
public:// 重写
public:virtual CRecordset* OnGetRecordset();virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持virtual void OnInitialUpdate(); // 构造后第一次调用virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);// 实现
public:virtual ~CMFC10View();
#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;
#endifprotected:// 生成的消息映射函数
protected:DECLARE_MESSAGE_MAP()
public:afx_msg void OnRecordFirst();afx_msg void OnRecordLast();afx_msg void OnRecordNext();afx_msg void OnRecordPrev();afx_msg void OnBnClickedButton1();afx_msg void OnClickedTagnames();CString m_strSel;CString m_filter;void Query();afx_msg void OnBnClickedButton2();
};#ifndef _DEBUG  // MFC10View.cpp 中的调试版本
inline CMFC10Doc* CMFC10View::GetDocument() const{ return reinterpret_cast<CMFC10Doc*>(m_pDocument); }
#endif

CPP文件


// MFC10View.cpp : CMFC10View 类的实现
//#include "stdafx.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MFC10.h"
#endif#include "MFC10Set.h"
#include "MFC10Doc.h"
#include "MFC10View.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "resource.h"
#include "DevicesTable.h"
// CMFC10ViewIMPLEMENT_DYNCREATE(CMFC10View, CRecordView)BEGIN_MESSAGE_MAP(CMFC10View, CRecordView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CRecordView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CRecordView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CRecordView::OnFilePrintPreview)ON_COMMAND(ID_RECORD_FIRST, &CMFC10View::OnRecordFirst)ON_COMMAND(ID_RECORD_LAST, &CMFC10View::OnRecordLast)ON_COMMAND(ID_RECORD_NEXT, &CMFC10View::OnRecordNext)ON_COMMAND(ID_RECORD_PREV, &CMFC10View::OnRecordPrev)ON_BN_CLICKED(IDC_BUTTON1, &CMFC10View::OnBnClickedButton1)ON_BN_CLICKED(IDC_TagNames, &CMFC10View::OnClickedTagnames)ON_BN_CLICKED(IDC_KKSCode, &CMFC10View::OnClickedTagnames)ON_BN_CLICKED(IDC_Descriptors, &CMFC10View::OnClickedTagnames)ON_BN_CLICKED(IDC_PointType, &CMFC10View::OnClickedTagnames)ON_BN_CLICKED(IDC_BUTTON2, &CMFC10View::OnBnClickedButton2)
END_MESSAGE_MAP()// CMFC10View 构造/析构CMFC10View::CMFC10View(): CRecordView(CMFC10View::IDD), m_filter(_T(""))
{m_pSet = NULL;// TODO: 在此处添加构造代码}CMFC10View::~CMFC10View()
{
}void CMFC10View::DoDataExchange(CDataExchange* pDX)
{CRecordView::DoDataExchange(pDX);// 可以在此处插入 DDX_Field* 函数以将控件“连接”到数据库字段,例如// DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet);// DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet);// 有关详细信息,请参阅 MSDN 和 ODBC 示例DDX_FieldText(pDX, IDC_EDIT1, (CString)m_pSet->m_TagNames, m_pSet);DDX_FieldText(pDX, IDC_EDIT2, (CString)m_pSet->m_KKSCode, m_pSet);DDX_FieldText(pDX, IDC_EDIT3, (CString)m_pSet->m_Descriptors, m_pSet);DDX_FieldText(pDX, IDC_EDIT4, (CString)m_pSet->m_PointType, m_pSet);//  DDX_Radio(pDX, IDC_TagNames, m_select);DDX_Text(pDX, IDC_FILTER, m_filter);
}BOOL CMFC10View::PreCreateWindow(CREATESTRUCT& cs)
{// TODO: 在此处通过修改//  CREATESTRUCT cs 来修改窗口类或样式return CRecordView::PreCreateWindow(cs);
}void CMFC10View::OnInitialUpdate()
{m_pSet = &GetDocument()->m_MFC10Set;CheckRadioButton(IDC_TagNames,IDC_PointType,IDC_TagNames);m_strSel="TagNames";CRecordView::OnInitialUpdate();}
void CMFC10View::Query()
{// 默认准备m_pSet->m_strSort=m_strSel;if(m_filter!="")m_pSet->m_strFilter=m_strSel+"="+m_filter;m_pSet->Requery();OnRecordFirst();
}// CMFC10View 打印BOOL CMFC10View::OnPreparePrinting(CPrintInfo* pInfo)
{// 默认准备return DoPreparePrinting(pInfo);
}void CMFC10View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: 添加额外的打印前进行的初始化过程
}void CMFC10View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: 添加打印后进行的清理过程
}// CMFC10View 诊断#ifdef _DEBUG
void CMFC10View::AssertValid() const
{CRecordView::AssertValid();
}void CMFC10View::Dump(CDumpContext& dc) const
{CRecordView::Dump(dc);
}CMFC10Doc* CMFC10View::GetDocument() const // 非调试版本是内联的
{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC10Doc)));return (CMFC10Doc*)m_pDocument;
}
#endif //_DEBUG// CMFC10View 数据库支持
CRecordset* CMFC10View::OnGetRecordset()
{return m_pSet;
}// CMFC10View 消息处理程序void CMFC10View::OnRecordFirst()
{// TODO: 在此添加命令处理程序代码if(m_pSet->IsOpen()){m_pSet->MoveFirst();	this->UpdateData(false);}	
}
void CMFC10View::OnRecordLast()
{// TODO: 在此添加命令处理程序代码if(m_pSet->IsOpen()){m_pSet->MoveLast();this->UpdateData(false);}	
}
void CMFC10View::OnRecordNext()
{// TODO: 在此添加命令处理程序代码if(m_pSet->IsOpen()){m_pSet->MoveNext();this->UpdateData(false);}}void CMFC10View::OnRecordPrev()
{// TODO: 在此添加命令处理程序代码if(m_pSet->IsOpen()){m_pSet->MovePrev();this->UpdateData(false);}}void CMFC10View::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码Query();
}void CMFC10View::OnClickedTagnames()
{// TODO: 在此添加控件通知处理程序代码if(IsDlgButtonChecked(IDC_TagNames))m_strSel="TagNames";if(IsDlgButtonChecked(IDC_KKSCode))m_strSel="KKSCode";if(IsDlgButtonChecked(IDC_Descriptors))m_strSel="Descriptors";if(IsDlgButtonChecked(IDC_PointType))m_strSel="PointType";}void CMFC10View::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码Query();
}

结论:

1、MFC ODBC使用起来比较简单,很容易就可以完成数据库类的生成,捆绑的数据表为CRecordSet的派生类(自动生成),并且嵌在文档类中:

对数据库中指定表的操作就是通过该对象来完成(增删查改),示例中视图通过获取文档类指针来获得记录集对象:

 2、MFC ODBC创建工程时只能添加一张表,生成对应的记录集类(选择多张表会合并成一个类,很明显不对)。如果需要对数据库中多张表格的操作,可以通过类向导中选择添加ODBC类:

 注意使用的时候需要先Open:

	CDevicesTable devSet; //新增的另外一张表devSet.Open();devSet.Requery();devSet.MoveFirst();

3、可以用表生成对应的集合类,也可以用视图生成(解决左右连接等跨表查询等);

4、可以利用代码动态生成DSN(否则在其他电脑上运行程序需要手动先创建DSN);

5、很显然,MFC ODBC只适用于比较简单是数据库操作,复杂的数据库操作实现起来并不容易。

相关文章:

【MFC】数据库操作——ODBC(20)

ODBC:开放式数据库连接&#xff0c;是为解决异构数据库&#xff08;不同数据库采用的数据存储方法不同&#xff09;共享而产生的。ODBC API相对来说非常复杂&#xff0c;这里介绍MFC的ODBC类。 添加ODBC用户DSN 首先&#xff0c;在计算机中添加用户DSN&#xff1a;(WIN10下&a…...

旺店通与金蝶云星空对接集成采购入库单接口

旺店通旗舰奇门与金蝶云星空对接集成采购入库单查询连通销售退货新增V1(12-采购入库单集成方案-P)数据源系统:旺店通旗舰奇门旺店通是北京掌上先机网络科技有限公司旗下品牌&#xff0c;国内的零售云服务提供商&#xff0c;基于云计算SaaS服务模式&#xff0c;以体系化解决方案…...

Linux基础-学会使用命令帮助

概述使用 whatis使用 man查看命令程序路径 which总结参考资料概述Linux 命令及其参数繁多&#xff0c;大多数人都是无法记住全部功能和具体参数意思的。在 linux 终端&#xff0c;面对命令不知道怎么用&#xff0c;或不记得命令的拼写及参数时&#xff0c;我们需要求助于系统的…...

MyBatis 之四(动态SQL之 if、trim、where、set、foreach 标签)

文章目录动态 SQL1. if 标签2. trim 标签3. where 标签4. set 标签5. foreach 标签回顾一下&#xff0c;在上一篇 MyBatis 之三&#xff08;查询操作 占位符#{} 与 ${}、like查询、resultMap、association、collection&#xff09;中&#xff0c;学习了针对查询操作的相关知识点…...

PAT (Advanced Level) Practice 1006 Sign In and Sign Out

1006 Sign In and Sign Out题目翻译代码分数 25作者 CHEN, Yue单位 浙江大学At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in’…...

Android入门第64天-MVVM下瀑布流界面的完美实现-使用RecyclerView

前言 网上充满着不完善的基于RecyclerView的瀑布流实现&#xff0c;要么根本是错的、要么就是只知其一不知其二、要么就是一充诉了一堆无用代码、要么用的是古老的MVC设计模式。 一个真正的、用户体验类似于淘宝、抖音的瀑布流怎么实现目前基本为无解。因为本人正好自己空闲时也…...

Windows PowerShell中成功进入conda虚拟环境

本人操作系统是Windows10&#xff08;输入命令cmd或在运运行中输入winver查看&#xff09;在cmd命令行中大家都很熟悉&#xff0c;很方便进入到指定创建了的虚拟环境中&#xff0c;那么在PowerShell中怎么进入呢&#xff1f;比如在VSCode中的TERMINAL使用的是PowerShell&#x…...

【C++】类与对象理解和学习(中)

专栏放在【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持&#x1f339;六大默认成员函数前言每个类中都含有六大默认成员函数&#xff0c;也就是说&#xff0c;即使这个类是个空类&#xff0c;里面什么都没有写&#xff0c;但是编译器依然会自动生成六个默认成员函数…...

每日英语学习(11)大英复习单词和翻译

2023.2.20 单词 1.contemplate 思考、沉思 2.spark 激起 3.venture 冒险 4.stunning 极好的 5.dictate 影响 6.diplomatic 外交的 7.vicious 恶性的 8.premier 首要的 9.endeavor 努力 10.bypass 绕过 11.handicaps 不利因素 12.vulnerable 脆弱的 13.temperament 气质、性格…...

x79主板M.2无法识别固态硬盘

问题描述: 这几天在装电脑&#xff0c;买了块M.2接口固态硬盘。装上去始终无法读取到硬盘&#xff0c;一开始以为是寨板Bios问题不支持M.2的设备。更新了最新的BIOS然后还是没有识别出来&#xff0c;然而将日常用的电脑PM510硬盘装上发现可以识别&#xff0c;而且日常用电脑也…...

配置Tomcat性能优化

配置Tomcat性能优化 &#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f4…...

Hive3 安装方式详解,datagrid自定义驱动连接hive

1 Hive的安装方式 hive的安装一共有三种方式:内嵌模式、本地模式、远程模式。 元数据服务(metastore&#xff09;作用是&#xff1a;客户端连接metastore服务&#xff0c;metastore再去连接MySQL数据库来存取元数据。有了metastore服务&#xff0c;就可以有多个客户端同时连接…...

约束优化:约束优化的三种序列无约束优化方法(罚函数法)

文章目录约束优化&#xff1a;约束优化的三种序列无约束优化方法&#xff08;罚函数法&#xff09;外点罚函数法L2-罚函数法&#xff1a;非精确算法对于等式约束对于不等式约束L1-罚函数法&#xff1a;精确算法内点罚函数法&#xff1a;障碍函数法参考文献约束优化&#xff1a;…...

你真的会做APP UI自动化测试吗?我敢打赌百分之九十的人都不知道这个思路

目录 前言 一&#xff0c;开发语言选择 二&#xff0c;UI测试框架选择 1&#xff0c;Appium 2&#xff0c;Airtest 3&#xff0c;选择框架 三&#xff0c;单元测试框架选择 四&#xff0c;测试环境搭建 1&#xff0c;测试电脑选择 2&#xff0c;测试手机选择 3&#…...

GIT:【基础三】Git工作核心原理

目录 一、Git本地四个工作区域 二、Git提交文件流程 一、Git本地四个工作区域 工作目录(Working Directory)&#xff1a;电脑上存放开发代码的地方。暂存区(Stage/Index)&#xff1a;用于l临时存放改动的文件&#xff0c;本质上只是一个文件&#xff0c;保存即将提交到文件列…...

【1.12 golang中的指针】

1. 指针 区别于C/C中的指针&#xff0c;Go语言中的指针不能进行偏移和运算&#xff0c;是安全指针。 要搞明白Go语言中的指针需要先知道3个概念&#xff1a;指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝&#xff0c;当我们想要修改某…...

十五.程序环境和预处理

文章目录一.程序翻译环境和执行环境1.ANSI C 标准2.程序的翻译环境和执行环境二.程序编译和链接1.翻译环境2.编译本身的几个阶段3.运行环境三.预处理1.预定义符号2.#define&#xff08;1&#xff09;#define定义标识符&#xff08;2&#xff09;#define定义宏&#xff08;3&…...

高并发系统设计之负载均衡

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录DNS负载均衡Nginx负载均衡负载均衡算法负载均衡配置超时配置被动健康检查与主动健康检查LVS/F5Nginx当我们的应用单实例不能支撑用户请求时&#xff0c;此时就需要扩容&#xff0c;从一台服务器扩容到…...

嵌入式Linux从入门到精通之第十四节:Linux IO控制技术

目录 设备控制概述 操作设备文件函数 监听文件描述符 示例 设备控制概述 对于硬件设备,Linux采用了与裸机完全不同的机制进行管理。 Linux下的所有硬件(IO、键盘、鼠标等)均是以文件的形式进行统一管理的,每个设备在/dev/目录下都有一个设备文件与之对应。操作相应的文件…...

/etc/fstab文件

文件/etc/fstab存放的是系统中的文件系统信息&#xff0c;当系统启动的时候&#xff0c;系统会自动地从这个文件读取信息&#xff0c;并且会自动将此文件中指定的文件系统挂载到指定的目录。当正确的设置了该文件&#xff0c;则可以通过mount /directoryname命令来加载一个文件…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...