VC学习资料收集(16):Visual C++中的ODBC编程实例

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情


                                      Visual C++中的ODBC编程实例


Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式,则需要安装相应的ODBC驱动器及DBMS。

  用户使用自己的DBMS数据库管理功能生成新的数据库模式后,就可以使用ODBC来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC的联机帮助。

  一、MFC提供的ODBC数据库类

  Visual C++的MFC基类库定义了几个数据库类。在利用ODBC编程时,经常要使用到 CDatabase(数据库类)、CRecordSet(记录集类)和CRecordView(可视记录集类)。

  CDatabase类对象提供了对数据源的连接,通过它可以对数据源进行操作。

  CRecordSet类对象提供了从数据源中提取出的记录集。CRecordSet对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图。每种形式在记录集被打开时都提供一组记录,所不同的是,当在一个动态行集里滚动到一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来。

  CRecordView类对象能以控件的形式显示数据库记录,这个视图是直接连到一个CRecordSet对象的表视图。

  二、应用ODBC编程

  应用Visual C++的AppWizard可以自动生成一个ODBC应用程序框架,步骤是:打开File菜单的New选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard的提示进行操作。

  当AppWizard询问是否包含数据库支持时,如果想读写数据库,那么选定Database view with file support;如果想访问数据库的信息而不想写回所做的改变,那么选定Database view without file support。

  选好数据库支持之后,Database Source 按钮会被激活,选中它去调用Data Options对话框。在Database Options对话框中会显示出已向ODBC注册的数据库资源,选定所要操作的数据库,如:Super_ES,单击OK后出现Select Database Tables对话框,其中列举了选中的数据库包含的全部表;选择要操作的表后,单击OK。在选定了数据库和数据表之后,就可以按照惯例继续进行AppWizard操作。

  特别需要指出的是:在生成的应用程序框架View类(如:CSuper_ESView)中,包含一个指向CSuper_ESSet对象的指针m_pSet,该指针由AppWizard建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。

  要使程序与数据源建立联系,需用CDateBase::OpenEx()或CDatabase::Open()函数来进行初始化。数据库对象必须在使用它构造记录集对象之前初始化。

三、实例

  1.查询记录

  查询记录使用CRecordSet::Open()和CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open()函数,再次查询时就可以应用CRecordSet::Requery()函数。

  在调用CRecordSet::Open()函数时,如果将一个已经打开的CDatabase对象指针传给CRecordSet类对象的m_pDatabase成员变量,则使用该数据库对象建立ODBC连接;否则如果m_pDatabase为空指针,就新建一个CDatabase类对象,并使其与缺省的数据源相连,然后进行CRecordSet类对象的初始化。缺省数据源由GetDefaultConnect()函数获得。也可以提供所需要的SQL语句,并以它来调用CRecordSet::Open()函数,例如:Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);

  如果没有指定参数,程序则使用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语句进行操作:

  CString CSuper_ESSet::GetDefaultSQL()
  {return _T(″[BsicData],[MinSize]″);}

  对于GetDefaultSQL()函数返回的表名,对应的缺省操作是SELECT语句,即:

  SELECT *FROM BasicData,MainSize

  在查询过程中,也可以利用CRecordSet的成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter为过滤字符串,存放着SQL语句中WHERE后的条件串;m_strSort为排序字符串,存放着SQL语句中ORDER BY后的字符串。如:

  Super_ESSet.m_strFilter=″TYPE=‘电动机’″;
  Super_ESSet.m_strSort=″VOLTAGE″;
  Super_ESSet.Requery();

  对应的SQL语句为:

  SELECT *FROM BasicData,MainSize
  WHERE TYPE=‘电动机’
  ORDER BY VOLTAGE

  除了直接赋值给m_strFilter以外,还可以使用参数化。利用参数化可以更直观、更方便地完成条件查询任务。使用参数化的步骤如下:

  S声明参变量:



  CString p1;
  float p2;

  S在构造函数中初始化参变量:

  p1=_T(″″);
  p2=0.0f;
  m_nParams=2;

  S将参变量与对应列绑定:

  pFX->SetFieldType(CFieldExchange::param)

  RFX_Text(pFX,_T(″P1″),p1);
  RFX_Single(pFX,_T(″P2″),p2);

  完成以上步骤后就可以利用参变量进行条件查询:

  m_pSet->m_strFilter=″TYPE=? AND VOLTAGE=?″;m_pSet->p1=″电动机″;
  m_pSet->p2=60.0;
  m_pSet->Requery();

  参变量的值按绑定的顺序替换查询字串中的“?”通配符。

  如果查询的结果是多条记录,可以用CRecordSet类的函数Move()、MoveNext()、MovePrev()、MoveFirst()和MoveLast()来移动光标。

  2.增加记录

  增加记录使用AddNew()函数,要求数据库必须是以允许增加的方式打开:

  m_pSet->AddNew(); //在表的末尾增加新记录
  m_pSet->SetFieldNull(&(m_pSet->m_type), FALSE);
  m_pSet->m_type=″电动机″;
  ……
  //输入新的字段值
  m_pSet->Update();
  //将新记录存入数据库
  m_pSet->Requery();
  //重建记录集

  3.删除记录

  可以直接使用Delete()函数来删除记录,并且在调用Delete()函数之后不需调用Update()函数:

  m_pSet->Delete();
  if (!m_pSet->IsEOF())
  m_pSet->MoveNext();
  else
  m_pSet->MoveLast();

  4.修改记录

  修改记录使用Edit()函数:

  m_pSet->Edit();
  //修改当前记录
  m_pSet->m_type=″发电机″;
  //修改当前记录字段值
   ……
  m_pSet->Update(); //将修改结果存入数据库
  m_pSet->Requery();

  5.撤消操作

  如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update()函数之前调用:

  CRecordSet::Move(AFX_MOVE_REFRESH)来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中,参数AFX_MOVE_REFRESH的值为零。

  6.数据库连接的复用

  在CRecordSet类中定义了一个成员变量m_pDatabase:

  CDatabase* m_pDatabase;

  它是指向对象数据库类的指针。如果在CRecordSet类对象调用Open()函数之前,将一个已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同的CDatabase类对象。如:

  CDatabase m_db;
  CRecordSet m_set1,m_set2;
  m_db.Open(_T(″Super_ES″)); //建立ODBC连接
  m_set1.m_pDatabase=&m_db;
  //m_set1复用m_db对象
  m_set2.m_pDatabse=&m_db;
  // m_set2复用m_db对象

  7.SQL语句的直接执行

  虽然我们可以通过CRecordSet类完成大多数的查询操作,而且在CRecordSet::Open()函数中也可以提供SQL语句,但是有时候我们还是希望进行一些其他操作,例如建立新表、删除表、建立新的字段等,这时就需要使用CDatabase类直接执行SQL语句的机制。通过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行:

  BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
  {TRY
  {m_pdb->ExecuteSQL(strSQL);
  //直接执行SQL语句}
  CATCH (CDBException,e)
  {CString strMsg;
  strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
  strMsg+=strSQL;
  return FALSE;}
  END_CATCH
  return TRUE;}

  应当指出的是,由于不同的DBMS提供的数据操作语句不尽相同,直接执行SQL语句可能会破坏软件的DBMS无关性,因此在应用中应当慎用此类操作。

  8.动态连接表

  表的动态连接可以利用在调用CRecordSet::Open()函数时指定SQL语句来实现。同一个记录集对象只能访问具有相同结构的表,否则查询结果将无法与变量相对应。

  void CDB::ChangeTable()
  {
  if (m_pSet->IsOpen()) m_pSet->Close();
  switch (m_id)
  {
  case 0:
  m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,
  ″SELECT * FROM SLOT0″);
  //连接表SLOT0
  m_id=1;
  break;
  case 1:
  m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,
  ″SELECT * FROM SLOT1″); //连接表SLOT1
  m_id=0;
  break; }}

  9.动态连接数据库

  可以通过赋与CRecordSet类对象参数m_pDatabase来连接不同数据库的CDatabase对象指针,从而实现动态连接数据库。

  void CDB::ChangeConnect()
  {CDatabase* pdb=m_pSet->m_pDatabase;
  pdb->Close();
  switch (m_id)
  {
  case 0:
  if (!pdb->Open(_T(″Super_ES″)))
  //连接数据源Super_ES
  {
  AfxMessageBox(″数据源Super_ES打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);
  exit(0);
  }
  m_id=1;
  break;
  case 1:
  if (!pdb->Open(_T(″Motor″)))
  //连接数据源Motor
  {
  AfxMessageBox(″数据源Motor打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);
  exit(0);
  }
  m_id=0;
  break; }}

  总结:Visual C++中的ODBC类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC技术使得程序员从具体的DBMS中解脱出来,从而可以减少软件开发的工作量,缩短开发周期,并提高效率和软件的可靠性。


Visual C++ 6.0编程实战:从MFC消息机制到Windows桌面开发核心原理 Windows桌面开发的核心在于理解底层消息循环图形设备接口(GDI)等基础概念。消息映射机制作为Windows程序的事件驱动基础,通过将用户操作转化为系统消息并分发给对应处理函数,构成了GUI应用的交互骨架。GDI绘图原理则提供了图形渲染的底层支持,涉及设备上下文、坐标变换等关键技术。这些原理不仅是MFC框架的基石,更是现代Qt、WPF等GUI框架共同依赖的技术内核。掌握消息循环GDI编程,能帮助开发者深入理解Windows桌面应用的运行机制,为维护遗留系统和学习现代框架打下坚实基础。本文通过Visu 阅读详情

相关推荐

Visual C++经典项目源码的现代化改造运行指南

C++开发领域,理解Windows桌面应用的底层机制是进阶的关键。从消息循环、GDI绘图到COM组件,这些核心概念构成了传统Windows编程的基石。其技术价值在于,通过剖析经典项目源码,开发者能深入掌握系统级编程的原理资源管理策略。在应用场景上,无论是维护遗留系统还是学习软件架构演变,处理早期Visual C++项目都是宝贵的实践机会。本文聚焦于Visual C++开发实例的现代化改造,详细解析如何解决**MSB3428**编译错误及部署**Visual C++ Redistributable**运行

weixin_30457551的博客 326

Visual C++中的ODBC编程实例

Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式,则需要安装相应的ODBC驱动器及DBMS。  用户使用自己的DBMS数据库管理功能生成新的数据库模式后,就

wangjy1981的专栏 1910

TeeChart在VC中实时曲线绘制的应用

一:TeeChart介绍TeeChart Pro是一款提供上百种2D和3D图形风格、40种数学和统计功能、加上无限制的轴和22种调色板组件供选择。提供上百种2D和3D图形风格、40种数学和统计功能、加上无限制的轴和22种调色板组件供您选择。提供上百种2D和3D图形风格、40种数学和统计功能、加上无限制的轴和22种调色板组件供选择,TeeChart还包括一个强大的、完整的编辑对话框,几乎可用于每

scollins的专栏 2874

CRecordSet使用详解

一、CRecordSet类中有一个成员变量m_pDatabase,它是指向数据库类的指针。可以通过以下方式将数据集关联到相应的数据库上: 1.CRecordSet rs;    rs.m_pDatabase=&m_database; 2.CRecordSet rs(&m_database); 二、可以定义一个类,例如crs类,继承于CRecordSet,在 DoFieldE

MFC_tgz的专栏 5054

数据库编程

本次实验主要进行存储过程和触发器的编写,在PL/SQL Developer中创建存储过程和触发器都有特定的代码编写窗口

qq_61166620的博客 1266

MFC的ODBC类简介(一)

<br />记录集在用完之后需要关闭。<br />概括地讲,CDatabase针对某个数据库,它负责连接数据源;CRecordset针对数据源中的记录集,它负责对记录的操作;CRecordView负责界面,而CFieldExchange负责CRecordset数据源的数据交换。<br />快照需要光标库,动态集不需要光标库。<br />在CRecordView的定义中有:<br />public:<br />virtual CRecordset* OnGetRecordset() = 0;<br />因此

panjean的专栏 568

MFC ODBC 用法

主要内容: ? MFC ODBCODBC API封装在类CDatabase、CRecordSet、CFieldExchange、CRecordView和CDBException中 ? 使用MFC ODBC开发数据库应用程序的一般步骤 ? 使用AppWizard访问数据库 ? 使用类CDatabase连接数据库 ? 使用类CRecordSet打开记录集、获取数据

g8gerrard的专栏 2736

Visual C++数据库开发实战:MFC ODBC核心技术性能优化指南

数据库连接技术是构建企业级应用的核心基础,其原理在于通过标准接口实现应用程序数据存储系统之间的高效通信。在Windows平台开发中,ODBC(开放数据库互连)作为广泛采用的数据库访问标准,提供了跨数据库的统一API层,确保了代码的可移植性和维护性。Visual C++结合MFC框架对ODBC进行了深度封装,通过CDatabase和CRecordset等类,显著降低了数据库操作的复杂度,其技术价值体现在对系统资源的精细控制和接近底层的执行效率上。这种组合尤其适用于对性能有严苛要求的桌面应用、工业控制系统及遗

weixin_33978044的博客 374

VC 数据库编程 ADO和ODBC区别

有很多种使用数据库的方法,对大多数数据库来说,选择C++这种产品也许并不适宜。我们知道,像dBASE IV,FoxPro,Oracle和Access这样的产品是完全以数据库管理为中心的。事实上,这些产品非常善于创建数据库管理器,以至于它们确实并不善于做太多其它的工作。即使要用更通用化而非更专用化的数据库产品来执行一些类型的工作,在使程序设计更容易这一方面,像VisualBasic和Delphi这样

小_鱼的专栏 1025

Visual C++经典实例源码:从环境配置到现代化改造的实战指南

C++作为系统级编程的核心语言,其开发环境配置项目迁移是开发者常遇的工程实践难题。理解编译原理、链接机制和运行时库依赖,是解决跨版本兼容性问题的关键。在Windows平台开发中,Visual Studio IDEMSVC编译器构成了主流技术生态,掌握其项目属性配置、平台工具集和字符集设置,能有效提升开发效率代码可移植性。这些技术价值在维护遗留系统、学习经典设计模式时尤为突出,例如在桌面应用开发中处理MFC消息映射、数据库访问等场景。本文聚焦于《Visual C++开发实例大全》源码的**环境搭建**

weixin_30448603的博客 352

解决mysql connection ODBC安装系统代码126错误 VC2013安装

PowerDesigner 16.5 32bit 目的:解决mysql connection ODBC安装系统代码126错误。需要安装VC2013。MYSQL CONNECTION ODBC 版本是5.3.9 搜索关键字:Visual C++ Redistributable Packages for Visual Studio 2013 官网地址:https://www.microsoft.

ly8951677的博客 9364

回顾Microsoft Visual C++ MFC的历史

Microsoft Visual C++(简称Visual C++、MSVCVC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软窗口程序设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual C++

Chinamming的专栏 1130

Visual C++实现自动配置ODBC数据源

为了使ODBC数据库一起工作,必须把数据库注册到ODBC驱动程序管理器,这项工作可以通过定义一个DSN或数据源名字来完成。通常,我们只能手动打开系统控制面板,运行其中的ODBC数据源管理器,手工配置数据源,但是这项工作对用户而言过于复杂,我们必须考虑用程序替用户完成这些配置工作。  1. SQLConfigDataSource 函数说明  ODBC API提供了动态创建数据源的函数SQLCon

丰空岛主(Vega Prime,Android,LabWindows,ThreeJS,Python,OpenCV) 1138

Microsoft Visual C++

Microsoft Visual C++,(简称Visual C++、MSVCVC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual...

jandroid 425

VC6到现代VS:经典MFC项目现代化改造实战解析

在软件开发和系统维护领域,遗留代码的现代化改造是一个常见且关键的工程实践。其核心原理在于通过兼容性适配、代码重构和架构升级,让基于旧技术栈(如Visual C++ 6.0和MFC框架)的程序能在现代开发环境中运行并融入新生态。这项技术的价值不仅在于保护历史代码资产,更在于深入理解Windows编程的底层机制、软件设计模式的演变,以及将经典问题解决方案迁移到现代技术栈的能力。典型的应用场景包括对历史项目进行维护升级、学习经典框架设计思想,以及将成熟的业务逻辑从过时的界面框架中剥离并复用。本文将以一本经典编程

HJ921004的博客 442

VC的若干实用小技巧

Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意。作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助。 1:使用vc开发项目时,常会遇到这种情况: 即明明只改动了一个文件,却要把整个项目全部重新编译连接一次。刚刚连接好,一运行,又提示重新编译连接一次,非常讨厌。这是因为出现了未来文件的缘故。 解决方法: 找出对应文件夹下的debug目录,

mrby的专栏 874
上一篇: VC学习资料收集(15):用VC++6.0开发多表联接的数据库应用程序
下一篇: VC学习资料收集(17):实战VC时间控制函数
CNBT
博客等级 码龄22年 6粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值