ImageVerifierCode 换一换
格式:DOCX , 页数:53 ,大小:588.29KB ,
资源ID:4600775      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4600775.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第6章MFC ODBC编程.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第6章MFC ODBC编程.docx

1、第6章 MFC ODBC编程第6章 MFC ODBC编程为了简化开发人员编写数据库应用程序,VC+的在其基础类库(MFC)里对ODBC API进行了封装,实现了一个面向对象的数据库编程接口,使VC+的数据库变得更加容易。本章首先对MFC ODBC的概貌进行简要介绍,然后讲述利用MFC ODBC进行数据库开发的技巧,最后将通过具体数据库开发实例,详细讲述通过MFC ODBC开发数据库应用程序的方法和过程。6.1 了解MFC ODBCMFC是Microsoft Foundation Class(微软基础类库)的缩写,它的设计目标是简化开发人员的工作。MFC使开发人员创建基于Windows的应用程序

2、,而不必掌握下层的Windows体系结构。由于数据库应用程序是管理数据的重要方面,Microsoft开发了ODBC API的封装程序,为ODBC编程提供了一个面向对象的方法。MFC对ODBC的封装主要是开发了CDatabase类和CRecordSet类。6.1.1 CDatabase类CDatabase类用于应用程序建立同数据源的连接。CDatabase类包含一个m_hdbc变量,它代表了数据源的连接句柄。如果要建立CDatabase类的实例,应先调用该类的构造函数,再调用Open函数,通过调用,初始化环境变量,并执行与数据源的连接。关闭数据源连接的函数是Close。CDatabase类提供了

3、对数据库进行操作的函数,为了执行事务操作,CDatabase类提供了BeginTrans函数,当全部数据都处理完成后,可以通过调用CommitTrans函数提交事务,或者在特殊情况下通过调用Rollback函数将处理回退。CDatabase类提供的函数可以用于返回数据源的特定信息,例如通过GetConnect函数返回在使用函数Open连接数据源时的连接字符串,通过调用IsOpen函数返回当前的CDatabase实例是否已经连接到数据源上,通过调用CanUpdate函数返回当前的CDatabase实例是否是可更新的,通过调用CanTransact函数返回当前的CDatabase实例是否支持事务操

4、作,等等。总之,CDatabase类为C+数据库开发人员提供了ODBC的面向对象的编程接口。6.1.2 CRecordSet类要实现对结果集的数据操作,就要用到CRecordSet类。CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,CRecordSet类定义的记录集可以是表的所有列,也可以是其中的一列,这是由SQL语句决定的。CRecordSet类的成员变量m_hstmt代表了定义该记录集的SQL语句句柄,m_nFields成员变量保存了记录集中字段的个数,m_nParams成员变量保存了记录集所使用的参数个数。CRecordSet的记录集通过CDatabase实例的指

5、针实现同数据源的连接,即CRecordSet的成员变量m_pDatabase。如果记录集使用了WHERE子句,m_strFilter成员变量将保存记录集的WHERE子句的内容,如果记录集使用了ORDER BY子句,m_strSort成员变量将保存记录集的ORDER BY子句的内容。由多种方法可以打开记录集,最常用的方法是使用Open函数执行一个SQL SELECT语句。有如下四种类型的记录集: CRecordset:dynaset:动态记录集,支持双向游标,并保持同所连接的数据源同步,对数据的更新操作可以通过一个fetch操作获取。 CRecordset:snapshot:静态快照,一旦形成记

6、录集,此后数据源的所有改变都不能体现在记录集里,应用程序必须重新进行查询,才能获取对数据的更新。该类型记录集也支持双向游标。 CRecordset:dynamic:同CRecordset:dynaset记录集相比,CRecordset:dynamic记录还能在fetch操作里同步其它用户对数据的重新排序。 CRecordset:forwardOnly:除了不支持逆向游标外,其它特征同CRecordset:snapshot相同。6.2 MFC ODBC数据库访问技术6.2.1 记录查询使用CRecordSet的Open()和Requery()成员函数可以实现记录查询。需要注意的是,在使用CRec

7、ordSet的类对象之前,必须使用CRecordSet的成员函数Open()来获得有效的记录集。一旦使用过Open()函数,再次查询时使用Requery()函数就可以了。在调用Open()函数时,如果已经将一个打开的CDatabase对象指针传递给CRecordSet类对象的m_pDatabase成员变量,那么,CRecordSet类对象将使用该数据库对象建立ODBC连接;否则,如果m_pDatabase为空指针,对象就需要就新建一个CDatabase类对象并使其与缺省的数据源相连,然后进行CRecordSet类对象的初始化。缺省数据源由GetDefaultConnect()函数获得。也可以通

8、过特定的SQL语句为CRecordSet类对象指定数据源,并以它来调用CRecordSet类的Open()函数,例如: myRS.Open(AFX_DATABASE_USE_DEFAULT,strSQL); 如果没有指定参数,程序则使用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语句进行操作,代码如下: CString CMyRS:GetDefaultSQL() return _T(Name,Age);对于GetDefaultSQL()函数返回的表名,对应的缺省操作是SELECT语句,例如: SELECT * FROM BasicData,MainSize 在查询过

9、程中,也可以利用CRecordSet类的成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter用于指定过滤字符串,存放着SQL语句中关键字WHERE后的条件语句;m_strSort用于指定用于排序的字符串,存放着SQL语句中关键字ORDER BY后的字符串。例如: myRS.m_strFilter=Name=刘鹏; myRS.m_strSort=Age; myRS.Requery();数据库查询中对应的SQL语句为: SELECT * FROM BasicData,MainSize WHERE Name=刘鹏 ORDER BY Age除了直接赋值给成

10、员变量m_strFilter以外,还可以通过参数化实现条件查询。利用参化可以更直观、更方便地完成条件查询任务。参数化方法的步骤如下:(1) 声明参变量,代码如下: CString strName; int nAge;(2) 在构造函数中初始化参变量如下: strName =_T(); nAge =0; m_nParams=2;(3) 将参变量与对应列绑定,代码如下: pFX-SetFieldType(CFieldExchange:param) RFX_Text(pFX,_T(Name), strName); RFX_Single(pFX,_T(Age), nAge);完成以上步骤之后就可以利用

11、参变量进行条件查询了,代码如下: m_pmyRS-m_strFilter=Name=? AND age=?; m_ pmyRS - strName =刘鹏; m_ pmyRS -nAge=26; m_ pmyRS -Requery();参变量的值按绑定的顺序替换查询字串中的“?”通配符。如果查询的结果是多条记录,可以利用CRecordSet类的成员函数Move(),MoveNext(),MovePrev(),MoveFirst()和MoveLast()来移动记录光标。6.2.2 记录添加使用AddNew()成员函数能够实现记录添加,需要注意的是,在记录添加之前必须保证数据库是以允许添加的方式打

12、开的,代码如下: m_ pmyRS -AddNew(); / 在表的末尾添加新记录 m_ pmyRS -SetFieldNull(&(m_pSet-m_type), FALSE); m_ pmyRS -m_strName=刘鹏; / 输入新的字段值 m_ pmyRS -m_nAge=26; / 输入新的字段值 m_ pmyRS - Update(); / 将新记录存入数据库 m_ pmyRS -Requery(); / 重新建立记录集6.2.3 记录删除调用Delete()成员函数能够实现记录删除,在调用Delete()函数后不需调用Update()函数,代码如下: m_ pmyRS -Del

13、ete(); if (!m_ pmyRS -IsEOF() m_ pmyRS -MoveNext(); else m_ pmyRS -MoveLast();6.2.4 记录修改调用Edit()成员函数可以实现记录修改,在修改完成后需要调用Update()将修改结果存入数据库,代码如下: m_ pmyRS -Edit(); / 修改当前记录 m_ pmyRS -m_strName=刘波; / 修改当前记录字段值 . m_ pmyRS -Update(); / 将修改结果存入数据库 m_ pmyRS -Requery();6.2.5 撤销数据库更新操作如果用户增加或者修改记录后希望放弃当前操作,可

14、以在调用Update()函数之前调 用Move()函数,就可以使数据库更新撤销了,代码如下: CRecordSet:Move(AFX_MOVE_REFRESH); 该函数用于撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中参 数AFX_MOVE_REFRESH的值为零。6.2.6 直接执行SQL语句虽然通过CRecordSet类我们可以完成大多数的数据库查询操作,而且在CRecordSet类的Open()成员函数中也可以提供SQL语句,但有的时候我们还想进行一些其他操作, 例如建立新表、删除表、建立新的字段等等,这时就需要用到CDatabase 类的直接执行SQL语句的机制。通过

15、调用CDatabase类的ExecuteSQL()成员函数就能够完成QL语句的直接执行,代码如下: BOOL CMyDB:ExecuteSQLWithReport (const CString& strSQL) TRY m_pMyDB-ExecuteSQL(strSQL); / 直接执行SQL语句 CATCH (CDBException,e) CString strMsg; strMsg.LoadString(IDS_EXECUTE_SQL_FAILED); strMsg+=strSQL; return FALSE; END_CATCH return TRUE; 需要注意的是,由于不同DBMS

16、提供的数据操作语句不尽相同,直接执行SQL语句可能会破坏软件的DBMS无关性,因此在应用中应当慎用此类操作。 6.2.7 MFC ODBC的数据库操作过程同ODBC API编程类似,MFC的ODBC编程也要先建立同ODBC数据源的连接,这个过程由一个CDatabase对象的Open函数实现。然后CDatabase对象的指针将被传递到CRecordSet对象的构造函数里,使CRecordSet对象与当前建立起来的数据源连接结合起来。完成数据源连接之后,大量的数据库编程操作将集中在记录集的操作上。CRecordSet类的丰富的成员函数可以让开发人员轻松地完成基本的数据库应用程序开发任务。当然,完成

17、了所有的操作之后,在应用程序退出运行状态的时候,需要将所有的记录集关闭,并关闭所有同数据源的连接。6.3 MFC ODBC编程实例6.3.1 实例概述需求调查与分析某贸易公司经理需要对公司日常处理的业务通过计算机进行监控,因此需要开发一个浏览数据和报表的数据库应用软件,该软件的主要功能是数据表示和报表。数据的内容包括公司日常的销售报告、产品情况、客户情况、雇员情况以及与公司合作的运货商的情况,数据报表的主要目的是能够将浏览的信息以报表的方式打印出来。数据库系统及其访问技术在本实例里,我们采用MFC的ODBC数据库访问技术,从Access数据库里读取公司销售信息、产品情况、客户信息、雇员信息以及

18、与公司合作的运货商的信息。这是一个小型的数据库应用,使用Access数据库就足够了。在这个实例里,我们借助MFC对ODBC封装类CRecordset,从该类派生应用程序里使用的CCommonRs类。以CCommonRs类为基础,实现对ODBC数据源的数据访问。实例实现效果ODBCDemo2是本书用于阐述MFC ODBC数据库编程的实例应用程序,该应用程序实现了对某销售公司日常销售业务的信息浏览和报表操作。应用程序运行界面如图6-1所示。图6-1 ODBCDemo2实例应用程序的运行界面6.3.2 实例实现过程数据库设计我们利用Microsoft Access工具设计本实例的数据库结构。在本实例

19、里,我们需要利用数据库存放销售公司的如下信息: 日常销售信息:指公司日常销售帐单中的客户信息、雇员信息、订购日期、货主信息、运货商信息。 产品信息:指公司现经营产品的产品名称、供应商信息、类别信息、单价以及库存量等信息。 客户信息:指公司客户的客户名称、联系人信息和客户的地址信息。 雇员信息:指公司雇员的雇员姓名、头衔、尊称、出生日期、雇佣日期、联系信息及其上级等信息。 供应商信息:指与公司合作的供应商的名称、地址、联系人等信息。 运货商信息:指与公司合作的运货商的名称、电话信息。 产品类别信息:指公司所经营产品的类别。我们为数据库设计了八个表,表“订单”和表“订单明细”存放公司日常销售信息,

20、表“产品”存放公司的产品信息,表“客户”存放公司的客户信息,表“雇员”存放公司的雇员信息,表“供应商”存放公司的产品供应商信息,表“运货商”存放公司的运货商信息,表“类别”存放公司经营产品的类别信息。为了便于数据访问,我们还定义了三个视图,“SalesByCustomer”视图管理着以客户为统计方式的销售信息,“SalesByEmployee”视图管理着以雇员为统计方式的销售信息,“SalesByProduct”视图管理着以产品为统计方式的销售信息。下面的表6-1列出了表“订单”的结构,表6-2列出了表“订单明细”的结构,表6-3列出了表“产品”的结构,表6-4列出了表“客户”的结构,表6-5

21、列出了表“雇员”的结构,表6-6列出了表“供应商”的结构,表6-7列出了表“运货商”的结构,表6-8列出了表“类别”的结构。表6-1 表“订单”的结构字段名称类型字段名称类型订单ID(key)自动编号运货费货币客户ID文本货主名称文本雇员ID数字货主地址文本订购日期日期/时间货主城市文本到货日期日期/时间货主地区文本发货日期日期/时间货主邮政编码文本运货商数字货主国家文本表6-2 表“订单明细”的结构字段名称类型字段名称类型订单ID自动编号数量数字产品ID数字折扣数字单价货币表6-3 表“产品”的结构字段名称类型字段名称类型产品ID(key)自动编号单价货币产品名称文本库存量数字供应商ID数字

22、订购量数字类别ID数字再订购量数字单位数量文本中止是/否表6-4 表“客户”的结构字段名称类型字段名称类型客户ID(key)自动编号地区文本公司名称文本邮政编码文本联系人姓名文本国家文本联系人头衔文本电话文本地址文本传真文本城市文本表6-5 表“雇员”的结构字段名称类型字段名称类型名字ID自动编号国家文本头衔文本邮政编码文本尊称文本家庭电话文本出生日期日期/时间分机文本雇用日期日期/时间照片OLE对象地址文本备注备注城市文本上级文本地区文本表6-6 表“供应商”的结构字段名称类型字段名称类型供应商ID(key)自动编号地区文本公司名称文本邮政编码文本联系人姓名文本国家文本联系人头衔文本电话文本

23、地址文本传真文本城市文本主页超级链接表6-7 表“运货商”的结构字段名称类型字段名称类型运货商ID(key)自动编号电话货币类型公司名称文本表6-8 表“类别”的结构字段名称类型字段名称类型类别ID自动编号说明备注类别名称文本图片OLE对象在实例光盘的Database目录下,stocks.mdb文件是存放公司销售信息的Access数据库文件,读者可以查看这个文件,了解详细信息。创建ODBCDemo2工程ODBCDemo2工程是一个基于单文档的应用程序,创建应用程序工程时需要选择基于单文档的应用程序类型。操作步骤:(1) 打开VC+的工程创建向导。从VC+的菜单中执行“FileNew”命令,将V

24、C+ 6.0工程创建向导显示出来。如果当前的选项标签不是Project,单击Project选项标签将它选中。在左边的列表里选择MFC AppWizard(exe)项,在Project Name编辑区里输入工程名称“ODBCDemo2”,并在Location编辑区里调整工程路径,如图6-2所示。图6-2 工程创建向导(2) 选择应用程序的框架类型。单击“工程创建向导”窗口的OK按钮,进入“MFC AppWizard Step 1”对话框。首先选择应用程序的框架类型。如图6-3所示。在本工程里,选择“Single document”,保持资源的语言类型为“中文”,单击“Next ”按钮。图6-3

25、选择应用程序的框架类型(3) 进入“MFC AppWizard Step 2 of 6”对话框,设置应用程序数据库特性。在对话框里选择None,如图6-4所示。(4) 设置应用程序对复杂文档的支持。在“MFC AppWizard Step 2 of 6”对话框里,单击“Next ”按钮,进入“MFC AppWizard Step 3 of 6”对话框。在对话框里选择如下两项: None ActiveX Controls图6-4 设置应用程序数据库特性如图6-5所示,单击“Next ”按钮。图6-5 设置应用程序对复杂文档的支持(5) 进入“MFC AppWizard Step 4 of 6”对

26、话框,设置应用程序的特征信息。如图6-6所示对话框是工程的特征信息,在本例中,ODBCDemo2工程有如下特征: Docking toolbar Initial statusbar Printing and print preview 3D controls Normal(6) 在“MFC AppWizard Step 4 of 6”对话框里单击“Next ”按钮,进入“MFC AppWizard Step 5 of 6”对话框,选择工程风格和MFC类库的加载方式。在对话框里设置如下三项: MFC Standard Yes, Please As shared DLL如图6-7所示,单击“Nex

27、t ”按钮,进入“MFC AppWizard Step 6 of 6” 对话框。图6-7 设置应用程序特征信息图6-8 选择工程风格和MFC类库的加载方式(7) “MFC AppWizard Step 6 of 6” 对话框显示工程创建中的类信息。ODBCDemo2工程包含了四个类: CODBCDemo2View类,工程视图类 CODBCDemo2App类,工程的应用类 CMainFrame类,工程主框架类 CODBCDemo2Doc类,工程文档类这四个类构成了应用程序工程的主要框架。我们为CODBCDemo2View类选择ClistView基类,如图6-9所示。图6-9 显示工程创建中的类信

28、息(8) 在对话框“MFC AppWizard Step 6 of 6”里单击Finish按钮,完成工程创建。工程创建向导将该次工程创建的信息显示在一个“New Project Information”对话框里,如图6-10所示。在对话框里单击“OK”按钮,ODBCDemo2工程创建完成。图6-10 工程创建信息建立数据源建立数据源的方法在6.3.2节里已经进行了介绍,这里只说明本实例在建立数据源时的不同之处。本实例用到的数据源名称是“ODBCDemo2”,其描述为“Data source for ODBC MFC programming”,创建数据源时在“配置创建的新数据源”步骤里需要同OD

29、BCDemo1数据源有所区别。另外,数据源所支持的数据库为stocks.mdb文件,我们已经在6.3.2节里完成了它的设计。设计应用程序界面在6.3.2节里,我们利用工程创建向导创建了一个基于单文档界面的工程,本节应用程序界面的设计工作主要是菜单和按钮的添加。为了为报表设置报表的内容和格式,我们还需要为应用程序设计一个报表向导,这个向导由三个步骤组成,因此我们需要设计三个对话框以实现这三个步骤的界面。1. 设计应用程序的主菜单需要为应用程序设计的菜单包括:销售报告菜单、产品信息菜单、客户信息菜单、雇员信息菜单、供应商信息菜单、运货商信息菜单、类别菜单以及报表操作菜单。这些菜单的标识、标题以及提示信息如表6-9所示。表6-9 工程的菜单资源标识标题提示信息文件ID_OPTION选项应用程序设置选项ID_APP_EXIT退出退出应用程序;提示保存文档n退出销售报告ID_SALE_PRODUCT按产品按照产品显示销售报告。n产品销售报告ID_SALE_CUSTOMER按客户按照客户显示销售报告。n客户销售报告ID_SALE_EMPLOYEE按雇员按照雇员显示销售报告。n雇员销售报告产品ID_VIEW_PRODUCT产品信息显示产品信息客户ID

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1