第1篇基础篇 数据库技术作为计算机应用领域的重要组成部分,已经渗透到社会生活的方方面面。小到基木的公司日常 管理,大到互联网的电子商务,都刻着数据库的印记。电子时代的到来,使数据库技术逐渐走进每个人的生 数据库技术,小到基本的桌面应用,大到企业级的大型事务处理,它已经无所不在,无所不及。数据库技术为 软件行业带来了巨大的生机和活力,数据厍编程已经成为世界软件生产的重要内容。 为了使您快速了解数据库技术,掌握C++数据库编程的基本知识,本篇介纽如下内容 第1章数据库原理与访问 第2章COM与数据库访问 第3章数据库开发过程 第4章VC++数据厍开发基础 附录A数据库访问的错误代码 第1章数据库原理与访问 11数据库基本原理 11概述 数据库技术的发展历程 数据斥是现代计算机应用的个重要组成部分,是人们有效地进行数据存储、共享和处理的工具。 数据厍技术的发展经过了40多年的历程。1963年, C W Bachman设计开发的IDS( Integrated Data Store 系统开始投入运行,使多个 COBOL程序可以共享数据库。1968年,网状数据库系统 TOTAL岀现。1969年, McGee开发层次式数据厍系统,发布了IBM的IMs系统。1970年,IBM公司 San jose研究所的 E F Code发表 了题为“人型共享数椐库数据的关系模型”的著名论文,树立了关系型数据库的新的里稈碑,E. F Code因此获 得1981年度的ACM图灵奖, IBM San jose研究所也在1976年研制出在IBM370机器上运行的 SYSTEM R关 系型数据厍管理系统。1979年, ORACLE公司推出了第一个商品化的关系犁数据库系统 ORACLE2.0。80年代 至今,是数据库技术发展的成熟时期,这个时期出现了众多的大型数据库系统,包括IBM的DB2、微软的SQL Server、 Sybase以及 fornix相继岀现,使数据库系统呈现岀夺目的光彩。 数据库系统的优势 数据厍同文件相比,有以下优势: 首先,数据库中的数据是高度结构化的,不仅考虑数据项之间的关系,还考虑了记录类型之间的关系,从 而反映出现实中的信息实体。 其次,数据厍中的数据是面向系统而不是面向应用的,因比数据库的数据比文件系统的共享程度高,面向 系统的另一个好处是信息结构稳定,易于扩展。 第三,数据库系统比文件系统有更高的独立性。为了实现这种独立性,数据库系统往往拥有比特定应用更 多的数据,对于特定的应用只提供局部的逻辑结构,保持应用的逻辑独立性。 第四,数据库系统具有较好的数据安全性和一致性维扩措施。数据库系统都具有特定的授杈机制,防止非 法用户的使用。在多用户操作的情况下,薮据库可以进行良好的数据并发处理,维护数据的一致性。 最后,数据库对数据的存取不是以记录为单位的,可以仅操作记录的某些字段,方便了外部应用对数据的 操纵。 数据库管理系统 数据厍系统是一个多级结构,需要定义各级上的模式,这就需要一组软件提供相应的定义工只;数据库为 了保证其中的数据安全和一致性,必须有一套软件来完成相应的控制和管理仟务,这样的软件称为数据库管理 系统,即DBMS。 DBMS的功能随着系统而异,但是通常情况下都包括如下几个方面的功能 ·数据厍措述功能:定乂数据库的全局逻辑结枃(概念模式)、局部逻辑结构(外模式)以及其它各种数 据库对象。 334 附录A数据库访问的错误代码 ·数据斥管理功能:包括系统控制、数据饣储以及更新管理、数据安全性与·致性维护。 数据厍查询和操作功能:能从数据库中检索信息或者改变信息 数据库建立与维护功能:包括数据写入、数据库重建、数据库结构维护、恢复以及系统性能监视等。 如果以内容来划分DBMS的组成,它应该包括下面三个部分 数据描述语言(DDL)以及它的解释稈序 数据操纵语言(DML)以及它的解释程序。 ·数据厍管理例行程序 11.2桌面数据库 桌面薮据库是一类数据库软件,这些数据库有时又被称为“ISAM数据库”,因为这些数据库都采用了ISAM ( Indexed Sequential Access Method)文件。日前市场上的桌面数据库包括 Microsoft access microsoft Fox pro 和 Borland paradox 桌面薮据库将元数据存放在自凵的ISAM数据文件里,血这些数据文件都是可自描述的,使各种应用程序 能够访问桌面数据库里的数据。桌面数据库一般都拥有自己的操作语言和数据类型,包括运行以其操作语言编 写的程序的解释程序。可以采用桌面薮据库语言來建立数据库应用程序,但是这些经过解释的数据库语言具有 极大的局限性,难以建立完整的商业应用。 桌面数据库一般能够提供标准的数据库管理(DBMS)功能,例如数据定义、查询、安全以及维扩等,为 了提高记录査询速度,桌面数据库要数据增加索引,并使用ISAM。桌面数据库的ISAM文件叮以通过局域网 (LAN)供网终上的计算机访问,这统称为客户机/服务器(C/S)模式,但是通过LAN访问ISAM文件的能力 和效率是有限的,当ISAM数据文件被通过LAN访问时,数据要在客户机上进行处理,所有数据和索引都必 须从服务器端传送到客户机,造成了应用环境里数据吞吐量的急剧增长。因此说,桌面数据厍是专门为个人计 算机设计的,是个人计算机数据库应用软件开发的首选数据库。 1.13对象数据库 最原始的数据库技术仅仅在数据文件里存储初始数据,即比特和字节,没有元数据的概念。桌面数据库和 对象数据斥则同吋存放数据和元数据,使数据文件成为可自解释的。对象数据则进步在数据文件里存放操 作数据的代码。 对象数据庠一般都捆绑在特定的编程语言上。CH的对象数据库直接支持CHH语言的类型系统,可以使用 C-+对象数据库在数据库中存储C艹类的实例。卜面的代码使用C++对象数据库存放商品信息 #include Header file for the object database / Management Group object model #include Derive product class from d object l so that the product can persist itself in the database class Product: public d object public int tYpenUmber char szPName[96]; double pirce. -335 附录A数据库访问的错误代码 dRef< Product> next;"用于遍历数据中 Product实例的指针 d database db;∥/全局的对象数据库实例 const char db name[l="Product" db.open( db name);〃打开 Product对象数据厍 d transaction tx;∥创建一个处理事务并启动 begin(; ∥/在数据库里创建一个新的实例 Product*product-new(&db, Product )Product product-> iType Number=2 Refrigerator”); product-> dPirce =2000 Lx. Commi(Q,∥将新创建的实例提交到对象数据库 db. close(;∥关闭对象数据厍 代码廾始部分包含一个 odmg. h的头文件,该文件中包含了 d Database类的定义 d object使一个C++基类, 可以从该类派生新的类,实现特定数据的操作, Product类即 d object类的派类。类 Product具有dRef< Product next成员,dRef是对象数据库供应商提供的一个指针类,通过这个指针类实现对象的引用 main函数实现了对象数据库打开、 Product实例的创建与数据赋值、对象提交和对象数据库关闭等操作, 这些代码都不难理解。 C++类使我们能够对复杂实伓及其关系进行建模,能够在数据库里存放复杂的C←类的实例。但是,对象 数据厍也有其局限忙,山于对象数据库同特定的语言紧密集成,所以不便于其它应用程序的访问。另外,在客 户机/服务器环境中,对象数据库同桌面数据库一样,只冇效率和吞吐量的限制,不能充分利用服务器的处理能 力 1.14关系数据库服务器 关系数据库服务器在某些方面冋桌血数据库类似,有自己的编程语言、解释程序和数据类型,也集成数据 和元数据。但是关系数捱库服务器提供了桌面数据库无法比拟的丰富功能、数据开放性、处理能力以及吞吐能 力,同桌面数据库和对象数据库相比,关系数据服务器更适合于客户机服务器体系结构。 关系数据库服务器可以充分利用高性能服务器的硬件资源,例如人量的RAM和高性能的磁盘子系统,将 关系数据库服务器安装在RAID磁盘系统上,它会充分利用RAID驱动程序,提供较大的吞吐能力和可靠性。 关系数据库服务器也有自己的点。首先它要比桌面数据库和对象数据库昂贵,与特定商业应用的集成更 难;同时可能对硬件有苛刻的要求,还要求数据库管理员定期对系统进行协调和维护 尽管如此,大型的关系数据斥服务器因为其高性能、稳定可靠等优势,成为当前大型商业应用的首选薮据 库。目前流行的关系数据库服务器有 Oracle、 SQL Server、DB2,这些系统各有千秋,需要根据不同的需求进行 相应选择。 336 附录A数据库访问的错误代码 1.1.5选择适用的数据库 如何在众多的数据库中选择适合自己应用需求的一个呢?下面的指标佰得参考 数据廾放性 其它过稈或者应用程序在不访问数椐库的源代码时,理解数据文作的能力 复杂数据类型 处理只有复杂数据实体和关系的应用程序的能力。 支持的用户数量 多个线程、应用程序和用户同时访问数据的能力 性能 读写数据速度 可伸缩性与能力 随着数据量的增长,数据库依然保持良好性能的能力 提供基」集合的操作的能力 是否在其编程模型中提供了基于集合的操作 服务器对基于集合操作的支持 在服务器端处理数据,而不必将数据传送到客户端进行处理的能力 ·商业集成的方便性 是否便于同商业应用程序的集成。 数据校验与完整性 数据库校验数据、确保数据完整性的能力。 代码功能比 所编写的程序代码量与通过执行这些代码所能够获得的数据库能力之比 12数据库访问技术 121概述 数据厍是非常复杂的软件,编写程序通过某种数据厍专用接口与其通信是非常复杂的工作,为此,产生了 数据库的客户访问技术,即数据库访问技术。 数据厍访问技术将数据库外部与其通信的过程抽象化,通过提供访问接口,简化了客户端访问数据库的过 程。一个好的数据库访问接口就好象程序代码的放大镜,如图1-1所示。 调用的数据库代码 数据岸接口 客代码 图1-1数据厍接口的放大镜作用 目前供应商提供的数据库接口分专用和通用两种。专用数据库接口具有很大的局限性,可伸缩性也比较差。 通用的数据库接口提供了与不同的、异构的数据库系统通信的统一接口,采用这种数据库接口可以通过编写 段代码实现对多种类型数据库的复杂操作,如图1-2所示。 -337 附录A数据库访问的错误代码 数据接口 客户代码 RIES款据庳服务器 主机系统 I8A文件 图1-2道用数据库接凵 日前 Windows系统上常见的数据库接口包括 ·ODBC(廾放数据库互连 MFC( Microsoft基础类)ODBC类 ·DAO(数据访问对象) RDO(远程数据对象) OLE DE(对象链接嵌入数据库) ADO( Active X数据对象) 以下对这些数据库接口作简单介绍 1.22 ODBC AP ODBC是80年代木90年代初出现的技术,它为编写关系数据库的客户软件提供了统一的接口。ODBC只 提供单一的API,可用于处理不同数据库的客户应用稈序。使用 ODBC API的应用样序可以与任何具有ODBC 驱动程序的关系数据库进行通信。 与其它数据库接口相比, ODBC API是比较低层的数据库接口,它在相对较低的层次上使客户应用程序可 以配置并操作数据库。 由于ODBC为关系数据库提供了统一的接口,现在凵经被广泛应用,并逐渐成为关系数据库接口的标准。 ODBC仅限于关系数据库,由于ODBC的关系型特性,很难使用ODBC与非关系数据源进行通信,例如 对象数据库、网络目录服务、电子邮件存储等。 ODBC提供了ODBC驱动程序管理器(ODBC32DLL)、一个输入库(ODBC32LIB)和 ODBC API函数 说明的头文件。客户应用程序与输入库连接,以使用ODBC驱动程序管理器提供的函数。在运行时,ODBC驱 动程序管理器调用ODBC驱动程序中的函数,实现对数据库的操作, ODBC API的体系结构如图1-3所示。 通过 ODBC API操作数据厍的数据库访问方法将在后面详细叙述。 -338 附录A数据库访问的错误代码 驱动程序管理器驱动 客户代码 IDS数据序服务器 主机系铳 TSAM文件 图1-3ODBC体系结构 123oDBc的MFc类 ODBC为关系数据厍提供了统一的接口,但是 ODBC API十分复杂。在 Visual o++中,MFC提供了一些类, 对ODBC进行了封装,以简化 ODBC AP的调用,这些 MFC ODBC类使ODBC编程的复杂型大大降低。 MFC ODBO类在使用上比 ODBC API容易,但是损失了 ODBC API对低层的灵活控制,因此, MFC ODBC 类属于高级数据库接口。 通过 MFC ODBC类操作数据斥的数据斥访问方法将在后面详绌叙述。 124DAo与RDo DAO,即 Data Access Object的缩写,是组 Microsoft accessjet数据库引擎的COM自动化接冂。DAO直 接与 Access!Jet数据库通信,通过Jet数据厍引擎,DAO也可以冋其它数据库进行通信,如图1-4所小 驱动程序管珥器驱劲序 自动 方务器戴辑釋f 客尸代码 RDBIST据库服多器 IS文件 文亻 图1-4DAO体系结构 DAO的基于COM的自动化接口提供了比基于函数的AP更多的功能,DAO提供了一和数据库编程的对 象模型。DAO的对象模型比·般的API更适合于面向对象的程序丌发,将组不关联的API函数集成到·个 面向对象的应用稈序里,一般憂求开发人员必须编写自己的一组类来封装这些API函数。除了提供一组函数外, DAO还提供了连接数据库并对数据库进行操作的对象,这些DAO对象很容易集成到面向对象应用程序的源代 码里。 此外,DAO还封装了Acss数据库的结构单元,例如表、査询、索引等,这样,通过DAO,可以直接修 收 Access数据库的结构,而不必使用SQL的数据定义语言(DDL)的语句。 DAO提供了一种非常有用的数据库编程的对象模型,但是,从佟1-4可以看出,操作涉及到了许多层的软 339 附录A数据库访问的错误代码 件。DAO也提供了访问 Oracle、 SOL Server等大型数据库,当我们利用DAO访问这些数据库时,对数据库的 所有调用以及输岀的数据都必须经过 Access/jet数据库引擎,这对于使用数据库服务器的应用程序说,无疑 是个严重的瓶颈。 DAO同ODBC相比更容易使用,但不能提供 ODBC API所提供的低层控制,因此DAO也属于高层的数 据库接口。 MFC对DAO的自动化接口做了进一步的封装,叫做 MFC DAO类。这些 MFC DAO类都使用前缀CDao 在后面,我们将详细介绍如何使用DAO自动化接口和 MFC DAO类对数据库进行操作 RDO是 Remote Data Object的缩写,最初是作为 ODBC API的抽象,为 Visual basic程序员提供的编程对 象,因此RDO与 Visual basic密切相关。由于RDO直接使用Oυ BC API对远程数据源进行操作,而不像DAO 要经过Jet引擎,所以,RDO可以为使用关系数据库服务器的应用程序提供很好的性能。 通过在应用程序插入 Remotedata控件,RDO就可以与 Visual c+一起配合使用。 Remotedata控件是 个 OLE Control,可以被约束到应用程序的界面上,可以通过使用 RemoteData控件的方法实现对RDO函数的 调用 125 OLE DB与ADo OLE DB对ODBC进行了两个方血的扩展:一是提供了一个数据库编程的OLE接口,即COM;二是提供 了一个可用于关系型和非关系型数据源的接口 OLE DB提供了COM接口。OLE是COM的最初的名字,即使出现了 OLE DE,OLE仍然被认为是COM 而COM是微软组件技术的基础。 COM接凵同传统的数据库接凵相比,例如ODBC,有更好的健壮性和灵活性,具有很强的错误处理能力, 能够冋非关系型数据源进行通信 与 ODBC API一样, OLE DB也属于低层的数据库编程接口, OLE DB结合了ODBC对关系型数据库的操 作功能,并进行了扩展,可以访问非关系型数据库源。 利用 OLE DB进行软件开发应该包括两类软件: OLE DB客户程序( Consumer)和 OLE DB供应程序 ( Provider),如图1-5所示为 OLE DB客户程序与供应程序之间的关系。 客尸程, 供应程序 MDB文件 MSDASOL DLL 使用ADO的 LE 片程序 DB OLOLEDB DLL 服务器 使 辛应 用程序 ISJTOR35 DLL MDR 件 图1-5 OLE DB的客户程序和供应程序 OLE DB客户程序是使用 OLE DB接口的应用程序,例如,采用C++编写的使用 OLE DB连接数据厍服务 器的所有应用程序都是 OLE DB客户程序。 OLE DB供应稈序是实现 OLE DE接口并实际与数据库服务器通信 的DLL,在功能上, OLE DB同ODBC驱动程序相同,不过 OLE DB实现的是COM接凵,而不是API接凵。 OLE DB使我们可以访问任何带有 OLE DB供应程序的数据源,这些数据源包括电子邮件存储、对象数据 库、网络目录及其它非关系数据存储。 OLE DB是 Windows操作系统上数据库客户开发的未来发展模式,微软自山的廾发也集中在 OLE DB上, 340