




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 应用程序在存储数据时,除了使用前面介绍过的文件和串行化外,另一种有效地的方法是通过数据库存储。由于数据库不仅具有数据存储功能,还可以方便地对数据进行管理。因此,现在的大多数机构已经将其有价值的数据保存在数据库中,这对开发人员而言,就要求所开发的应用程序具有对数据库的访问能力。l 了解传统的数据库访问技术l MFC ODBC数据库类l 记录集类,以及记录集到数据库的连接l 记录视图如何显示记录集中的数据l 创建数据库项目l 多记录集视图的切换l 为项目添加多记录集l 通过记录集更数数据库第21章使用 ODBC数据源 数据库是非常复杂的软件,程序在访问数据库时需要通过某种数据库专用接口与其通信,
2、另外,不同的数据库厂商都提供了自己专用的接口。这使得在程序中对数据库的操作变得非常复杂。为此,产生了数据库的客户访问技术,即数据库访问技术。目前Windows系统上常见的数据库接口包括:l ODBC API(开放数据库互连)l MFC(Microsoft基础类)ODBC类l DAO(数据访问对象)l RDO(远程数据对象)l OLE DB(对象链接嵌入数据库)l ADO和ADO.NET(ActiveX数据对象) ODBC是80年代末90年代初出现的技术,它为编写关系数据库的客户软件提供了统一的接口。ODBC只提供单一的API,可用于处理不同数据库的客户应用程序。使用ODBC API的应用程序可
3、以与任何具有ODBC驱动程序的关系数据库进行通信。 与其它数据库接口相比,ODBC API是比较低层的数据库接口,它在相对较低的层次上使客户应用程序可以配置并操作数据库。由于ODBC为关系数据库提供了统一的接口,现在已经被广泛应用,并逐渐成为关系数据库接口的标准。 ODBC为关系数据库提供了统一的接口,但是ODBC API十分复杂。在Visual C+中,MFC提供了一些类,对ODBC进行了封装,以简化ODBC API的调用,这些MFC ODBC类使ODBC编程的复杂型大大降低。 MFC ODBC类在使用上比ODBC API容易,但是损失了ODBC API对低层的灵活控制,因此,MFC ODB
4、C类属于高级数据库接口。 DAO,即Data Access Object的缩写,它是一组Microsoft Access/Jet数据库引擎的COM自动化接口。DAO直接与Access/Jet数据库通信,通过Jet数据库引擎,DAO也可以同其它数据库进行通信。 RDO是Remote Data Object的缩写,最初是作为ODBC API的抽象,为Visual Basic程序员提供的编程对象,因此RDO与Visual Basic密切相关。由于RDO直接使用ODBC API对远程数据源进行操作,而不像DAO要经过Jet引擎,所以,RDO可以为使用关系数据库服务器的应用程序提供很好的性能。 OLE
5、DB对ODBC进行了两个方面的扩展:一是提供了一个数据库编程的COM接口,;二是提供了一个可用于关系型和非关系型数据源的接口。而COM是微软组件技术的基础,与传统的数据库接口相比,例如ODBC,有更好的健壮性和灵活性,具有很强的错误处理能力,能够同非关系型数据源进行通信。 ADO是ActiveX Data Object的缩写,它是建立在OLE DB之上。ADO是OLE DB客户程序,使用ADO的应用程序要间接地使用OLE DB。ADO简化了OLE DB,属于高层的数据库接口。另外同OLE DB相比,能够使用ADO的编程语言更多。ADO提供一个自动化接口,使得像VBScript和JavaScri
6、pt等脚本语言也可以使用ADO。 MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。开发人员不必了解ODBC API和SQL的具体细节,利用ODBC类即可完成对数据库的大部分操作。 MFC的ODBC类主要包括:lCDatabase类 主要功能是建立与数据源的连接。lCRecordset类 该类代表从数据源选择的一组记录集。通过该类可对记录集中的记录进行滚动、修改、增加和删除等操作。lCRecordView类 提供了一个表单视图与某个记录集直接相连,利用对话框数据交换机制(DDX)在记录集与表单视图的控件之间传输数据。该类支持对记录
7、的浏览和更新,在撤销时会自动关闭与之相联系的记录集。lCFieldExchange类 支持记录字段数据交换(DFX),即记录集字段数据成员与相应的数据库的表的字段之间的数据交换。该类的功能与CDataExchange类的对话框数据交换功能类似。lCDBException类 代表ODBC类产生的异常 CDatabase类用于建立应用程序同数据源的连接。CDatabase类包含一个m_hdbc变量,它代表了数据源的连接句柄。如果要建立与数据源的连接,首先应构造一个CDatabase对象,然后再调用CDatabase的Open成员函数。Open函数负责建立连接,其声明为: virtual BOOL
8、Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = “ODBC;”, BOOL bUseCursorLib = TRUE ); 参数lpszDSN指定了数据源名,在lpszConnect参数中也可包括数据源名,此时lpszDSN必需为NULL,若在函数中未提供数据源名且使lpszDSN为NULL,则会显示一个数据源对话框,用户可以在该对话框中选择一个数据源。 参数bExclusive说明是否独占数据源,由于目前版本的类库还不支持独占方式,故该参数的值应该是FA
9、LSE,这说明数据源是被共享的。参数bReadOnly若为TRUE则对数据源的连接是只读的。参数lpszConnect指定了一个连接字符串,连接字符串中可以包括数据源名、用户帐号(ID)和密码等信息,字符串中的“ODBC”表示要连接到一个ODBC数据源参数bUseCursorLib若为TRUE,则会装载光标库,否则不装载,快照需要光标库,动态集不需要光标库。若连接成功,函数返回TRUE,若返回FALSE。 要实现对结果集的数据操作,就要用到CRecordSet类。CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,CRecordSet类定义的记录集可以是表的所有列,也可以是
10、其中的一列,这是取决于生成记录集的SQL语句。 记录集主要可以分为快照Snapshot和动态集Dynaset两种,CRecordset类对这两者都支持。快照型记录集提供了对数据的静态视图。快照记录集很形象照像机,就好象对数据源的某些记录照了一张照片一样当别的用户改变了记录时(包括修改、添加和删除),快照中的记录不受影响,也就是说,快照不会反映别出用户对数据源记录的改变直到调用了CRecordset:Requery重新查询后,快照才会反映变化。 理解数据库操作和MFC如何一起工作的最好方法是创建一个示例。因此本节将创建一个数据库,并通过ODBC管理器进行注册。 假设ATG公司需要对公司日常处理的
11、业务通过计算机进行处理,数据的内容包括公司日常的销售报告、产品情况、客户情况、雇员情况以及与公司合作的运货商的情况。这是一个小型的数据库应用,因此使用Access数据库,其他数据库也与此类似。 本节将使用MFC应用程序向导创建一个数据库应用程序ODBCDemo。在选择应用程序类型时选择单文件应用程序,对于数据库程序而言,文档对象并不重要,因为大部分工作都是由记录集和记录视图对象管理的。随后可以看到,这个文档的主要用途就是存储记录集对象。 记录集的视图类是从CRecordView类派生的。基类CRecordView包括了管理与记录集进行通信时需要的所有功能,开发人员现在需要做的仅仅是调整记录视图
12、类,使其适合应用程序。 默认情况下,CProductsView的构造函数为protected,这是因为希望通过串行化创建这个类的对象。在添加其他的记录视图类到应用程序中时,需要把它们的构造函数的默认访问方式修改为public,以便创建视图。 由前面介绍可知,对话框的数据交换是由DoDataExchange()函数完成。对于记录视图而言,它提供了一种更加强大的功能DDX_Field可以将控件与记录集的字段绑定在一起。MFC在全局作用域中定义了大量的DDX_Field函数,它们专门用于在记录视图和记录集之间交换数据。 常用的DDX_FieldText()函数具有多重版本,它可以实现int、shor
13、t、long、DWORD、CString、float、double、BOO和BYTE类型的数据在控件与记录集之间传输。 记录集中的数据是使用SOL SELECT语句从数据库只检索的,该语句由架构调用GetDefaultSQL()成员生成。在SOL SELECT语句中,可以使用ORDER BY子句对检索的结果进行排序。对于CRecordSet类,它提供了一个m_strSort变量可以生成ORDER BY子句。只需要将m_strSort成员设置成一个字符串,它包含要进行排序的字段名,架构将自动生成对该字段进行排序的ORDER BY语句。如果有多个字段名,它们之间要用逗号隔开。 在数据库中的表并不是
14、孤立存在,表与表之间或多或少都存在一个的关联关系,在实际的使用过程中,经常要使用这种关联关系查看多个表中的数据。例如,在数据库中的产品Products表与订单表Order就存在关联关系,用户可能想要查看某产品的所有订单。为此,需要添加一个记录集类,处理数据库的订单信息。21.5.1 添加记录集添加记录集21.5.2 添加记录视图类添加记录视图类21.5.3 过滤数据21.5.4 显示多个记录视图显示多个记录视图 前面编写的代码仅实现了查看数据库中的信息时,对于一个数据库用应程序而言,它更多是功能是输入数据。当编写代码更新数据库时,需要注意所进行的修改可能会破坏数据库的完整性,使表中的内容失去意
15、义,基至使数据库无法使用。在实际的数据库中使用编写的代码之前,始终要利用一个测试数据库对代码进行正确的测试。 数据库更新通常包括更新现有表中某行的一个或多个字段。如修改订单数量或者添加新订单,更新操作的结果可能使数据库记录一些无意义的数据。在多用户数据库的应用中,对数据库更新操作所产生的大多数问题变得很明显。 要修改当前记录,应该按下列步骤进行: (1)调用Edit()成员函数。 调用该函数后记录集就进入了编辑模式,程序可以修改字段数据成员。注意不要在一个空的记录集中调用Edit(),否则会产生CDBException异常。Edit()函数会把当前字段数据成员的内容保存在一个缓冲区中,这样做有
16、两个目的,一是可以与字段数据成员作比较以判断哪些字段被改变了;二是在必要的时侯可以恢复字段数据成员原来的值。若再次调用Edit(),则将从缓冲区中恢复字段数据成员,调用后程序仍处于编辑模式。 (2)设置字段数据成员的新值。 (3)调用Update()函数完成编辑。Update()函数将把变化后的记录写入数据源并结束编辑模式。 向记录集中添加新的记录时,应该按下列步骤进行: (1)调用AddNew()成员函数。调用该函数后就进入了添加模式,该函数把所有的字段数据成员都设置成NULL。 (2)设置字段数据成员 (3)调用Update()函数更新数据源。 在数据库中,事务是为了确保一些操作的完整性而
17、提出的。事务把对数据库的一系列操作定义单个操作,如果出现错误,那么在事务完成之前的任何时间点,都可以撤消所有更改。例如,如果一个用户在对数据库进行一系列的更新时失败,那么它对数据库的完整性可能会有灾难性的影响。如果将这一系列的操作定义为一个事务,则在完成更新前某个操作失败,数据库就可以撤销这一系列的操作。大部分的商业数据库系统都支持事务,MFC的CDatabase类也提供了对事务的支持。 MFC中的数据库类不支持需要连接两个或多个表的记录集的更新。如果记录集中包含多个表中的数据,则该记录集将自动具有只读属性。这就带来一个问题,在数据库中订单本身并不是简单的表记录,它涉及到两个表,基本的订单数据
18、在Orders表中,该表存储与与客户有关的信息。对于每份订单,需要一条或多条Order Details表中的记录,以记录客户所订购的各种产品。 为了方便管理,我们计划将所有对订单信息进行管理的功能放置在同一个菜单中。因此,为应用程序添加一个菜单项“订单管理”,以及一个子菜单项“添加订单”。当用户选择“添加订单”菜单项,程序将显示一个雇员对话框进行身份验证;通过身份验证后显示另一个对话框要求输入处理订单的客户,以及要求的交货日期;最后还需要一个对话框提供产品信息。身份验证对话框与数据库的Employees表相对应,选择客户的对话框与Customers表有关,选择产品的对话框与Products表有
19、关。基本的逻辑处理如下图所示。 通过在“资源视图”中右击Dialog文件夹,并从弹出菜单中选择“插入Dialog”命令分别创建三个对话框窗体,修改其属性ID分别为:IDD_USER_LOGIN、IDD_CUSTOMER_DLG和IDD_PRODUCT_DLG。三个对话框的Style属性均设为Child,Border属性为的None。 为数据库中的Employeest和Customers表创建对应用的记录集类:CEmployeeSet和CCustomerSet,将在文档类中添加它们的实例成员。 在在前已经了解该程序中切换对话框的基本逻辑。按钮单击是从一个对话框切换到另一个的机制因此按钮处理程序应该包含使切换发生的代码。也就是调用主框架对象的SwitchView()函数,并传递希望显示的对话框的ID值。现在要做的是扩展主框架中的SwitchView()函数,创建相应的对话框。 要创建新订单的编号,需要获取Orders表中最大的订单编号,然后使最大订单编号加1获取新订单号。在IDD_CUSTOMER_DLG对话框窗体上,右击对应订单编号的编辑控件,为其添加一个long类型的变量m_NewOrder。 当显示选择产品的视图时,希望显示订单ID和客户名称的控件所对应的变量已经被设置为适当的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 推动县域医疗资源共享与区域合作机制建设
- 生物技术发展与生物医药应用试题
- 建立教育家精神的跨学科整合与人才培养新路径
- 建立农村流行病监测与快速响应体系
- 公司股东股份转让协议细节条款说明
- 光伏发电系统对能源结构转型的影响
- 高新科技成果转化应用合同协议书
- 医疗器械采购合同书细节
- 2025年艺术与文化传承考试试卷及答案分享
- 2025年视觉艺术作品鉴赏考试试卷及答案
- 2024年03月安徽省农业信贷融资担保有限公司2024年招考笔试历年参考题库附带答案详解
- DB12T 692-2016 天津市文书类电子文件元数据规范
- T-ACEF 148-2024 危险废物物联网智能监控设备技术要求
- 门店规章制度守则范本
- 【MOOC】多媒体技术与应用-同济大学 中国大学慕课MOOC答案
- 大模型原理与技术-课件 chap10 多模态大模型
- 基于PLC的物料分拣系统设计
- 国开(内蒙古)2024年《创新创业教育基础》形考任务1-3终考任务答案
- 妇幼保健机构绩效考核评分细则
- 【高分复习资料】山东大学《244德语》历年考研真题汇编
- (新版)山东省物流工程师职称考试参考试题库-下(多选、判断题)
评论
0/150
提交评论