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

news2024/12/24 10:09:40

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 once

class 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 _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
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"
// CMFC10View

IMPLEMENT_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只适用于比较简单是数据库操作,复杂的数据库操作实现起来并不容易。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解js在事件中,如何传递复杂数据类型(数组,对象,函数)

文章目录 前言一、何谓预编译&#xff0c;变量提升&#xff1f;二、复杂数据类型的传递 1.数组2.对象3.函数总结前言 在JavaScript这门编程语言学习中&#xff0c;如何传参&#xff0c;什么是变量提升&#xff0c;js代码预编译等等。要想成为一名优秀的js高手&#xff0c;这些内…

一个页面分成几块展示

每一项占用一个div,里面展示的是具体的图文内容,页面底部展示的是当前页码和总数,实现效果如下: 代码如下: <div class"header"></div><div class"main-content"><divclass"equipment-item"v-for"item in equipmentL…

OpenCV-PyQT项目实战(8)项目案例03:鼠标定位

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …

信创引领丨呼叫中心加速适配国产化

随着信创产业的高速发展&#xff0c;企业服务软件高度适配国产操作系统成为大势所趋。早在2020年&#xff0c;佳信客服平台就正式通过“华为云鲲鹏云服务”平台系统的兼容性测试与认证&#xff0c;成为鲲鹏凌云伙伴&#xff0c;也意味着佳信客服平台正式与国产硬件平台及操作系…

【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(下)

目录 一、istio 核心资源解读 1.1 Gateway 总结&#xff1a; 1.2 VirtualService 1.2.1 VirtualService 主要由以下部分组成 1.2.2 virtualservice 配置路由规则 1.2.3 路由规则优先级 1.2.4 多路由规则解读 1.3 DestinationRule 二、istio 核心功能演示 2.1 断路器…

【离散数学】1. 数理逻辑

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学&#xff1a;研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑&#xff1a;研究推理的科学 数学方法&#xff1a;引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学&#xff0c;即使用符号化…

vue环境总结

因将node.js升级后&#xff0c;打包运行出错了。后来加班重新改好。 一、用nvm管理可以用命令将node和npm对应安装 1.首先在控制台输入where node查看之前本地安装的node的路径 2.将node目录删除或者卸载 二、1.安装nvm 从官网下载安装包 https://github.com/coreybutler/nvm…

JDK定时器Timer原理

前言 前些时间想到利用redis实现延时队列&#xff0c;但是底层的定时器不止如何实现好些&#xff0c;故此研究了一下jdk的Timer。 Timer是一个用于执行定时任务的类&#xff0c;可以单次执行或按指定时间间隔循环执行&#xff08;直到主动cancel或线程被杀掉&#xff09;。Ti…

大数据之---Nifi-Nifi模板_具体使用方法---大数据之Nifi工作笔记0009

然后我们来看看,如果好不容易设计了一个流程,那么是可以通过 使用模板来让流程复用的 可以看到可以创建模板,一会说怎么用具体,上面已经 写清楚了,如何创建模板 我们看一下左侧的operate,这里可以看到这里就可以创建模板 可以看到小手那个地方,点击就可以创建模板了 可以看到…

python k8s库,read_namespaced_config_map:maximum recursion depth exceeded

使用背景 在python中&#xff0c;调用了gevent库&#xff0c;同时引用了官方的k8s库接口&#xff1a; GitHub - kubernetes-client/python: Official Python client library for kubernetesOfficial Python client library for kubernetes. Contribute to kubernetes-client/…

Node.js安装配置及Angular CLI的安装

NodeJS的安装node.js官网下载地址: https://nodejs.org/en/download/在node.js的官网上面下载适合自己机型的&#xff0c;如果是Windows系统的话&#xff0c;建议下载对应的 Windows Installer (.msi) 。下载完成后&#xff0c;双击打开安装&#xff0c;安装路径最好自定义&…

Melis4.0[D1s]:1.启动流程(与adc按键初始化相关部分)跟踪笔记

文章目录1.启动流程1.1 最先进入的文件&#xff1a;head_s.S1.2 start_kernel()函数所在的文件&#xff1a;init.c1.3 input_init()函数所在文件&#xff1a;sys_input.c1.4 INPUT_LKeyDevInit()所在文件&#xff1a;keyboarddev.c1.5 esINPUT_RegLdev()所在文件&#xff1a;in…

LVS负载均衡

文章目录前言一、LVS模式-DR二、ipvsadm配置参数三、DR模式的部署server1:调度器&#xff08;VS&#xff09;server2:真实服务器&#xff08;RS&#xff09;server3:真实服务器&#xff08;RS&#xff09;真实服务器(server2和server3)屏蔽客户端测试&#xff1a;纯代码步骤演示…

SpringCloud保姆级搭建教程六---ElasticSearch

es下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 最新版本或者 https://github.com/elastic/elasticsearch 7.17.9kibana下载地址&#xff1a;https://github.com/elastic/kibana 各个版本jdk8 对应的es应该是7.*版本&#xff0c;最新的es应该对应的…

【论文及代码详解】BEIT: BERT Pre-Training of Image Transformers

记录下论文《BEIT: BERT Pre-Training of Image Transformers》&#xff0c;这是一篇将Transformer应用于图像领域&#xff0c;并使用自监督方法进行参数初始化的文章。 论文链接 整体概要 由于网络整体流程图没有标注好模型的运行过程&#xff0c;结合论文的描述&#xff1a…

收藏,核心期刊的投稿、审稿、出刊流程详解

学术期刊论文&#xff08;核心和普刊&#xff09;的发表流程总的来说其实是一样的&#xff0c;整个流程包括&#xff1a;1写作-2选择刊物-3投稿-4审稿-5返修或拒稿-6录用-7出刊-8上网检索。 其中1和2其实顺序是可以调换的&#xff0c;可以选择好刊物再写作&#xff0c;根据刊物…

麦克风阵列波束基本概念理解

波束形成 本质上是设计合适的滤波器&#xff0c;对于一类固定滤波器系数的阵列来说&#xff0c;无论输入信号或者噪声信号的统计特征如何&#xff0c;其滤波器系数固定不变&#xff0c;此类波束形成叫Fixed Beamforming&#xff0c;固定波束形成好比传统数字信号处理里面的经典…

TCP并发服务器(多进程与多线程)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 TCP并发服务器&#xff08;多进程与多线程&#xff09;1. 多进程并发服务器&#xff08;1&#xff09;…

NPDP认证|2023年,0基础转行产品经理可以吗?

2023年&#xff0c;告别了疫情&#xff0c;各个行业正在快速回暖&#xff0c;很多企业都在高薪招聘产品经理岗位&#xff0c;这让很多其他岗位的朋友也想转行做产品经理&#xff0c;那没有基础&#xff0c;没有经验能转行做产品经理吗&#xff1f; 0基础转行产品经理是可能的&a…

Redis 删除策略

过期数据Redis中的数据特征 Redis是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态XX &#xff1a;具有时效性的数据-1 &#xff1a;永久有效的数据-2 &#xff1a;已经过期的数据 或 被删除的数据 或 未定义的数据数…