12数据库编程.doc_第1页
12数据库编程.doc_第2页
12数据库编程.doc_第3页
12数据库编程.doc_第4页
12数据库编程.doc_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章 数据库编程用户用户数据库(database)是存储在计算机里的结构化数据的集合,可以分为关系、层次和网络三种类型,通常由数据库管理系统(DBMS = DataBase Management System)软件(如Oracle、DB2、SQL Server等)对数据库进行管理,应用程序通过(标准)编程接口(如ODBC/JDBC、DAO/ADO.NET、DOM/SAX等)来访问数据库,参见图12-1。数据库管理系统数据库应用程序数据库管理系统编程接口数据库数据库图12-1 数据库应用系统结构Visual Studio为程序员提供了多种数据库编程的接口和类库,传统上是采用VC的MFC进行ODBC、DAO和ADO编程,现在则一般采用C# 和VB进行ADO.NET的Web应用编程。12.1 数据库与编程接口关系型数据库可以视为结构变量的集合,有专用的系统RDBMS进行管理,通过标准的查询语言SQL进行操作。微软平台中有多种数据库编程接口可供使用,早期常用ODBC和DAO,现在则多为ADO.NET。12.1.1 数据库与DBMS数据库(DataBase,DB)是一种记录(record)或数据的集合。数据库的结构按一定的数据模型来组织,最常用的是关系模型(relational model),其它还有层次模型(hierarchical model)和网络模型(network model)。DBMS(DataBase Management System,数据库管理系统)是用来维护数据库的软件。数据库模型决定访问数据库的查询语言。但是,DBMS的大量内部操作则是独立于数据模型的,它们取决于诸如性能(performance)、并发性(concurrency)、完整性(integrity)和从硬件故障中恢复等管理因素。在这些方面,不同的产品之间存在很大差异。早期的计算机数据存储在穿孔卡片和磁带上,后来有了磁盘的文件系统,然后才是数据库管理系统。DBMS所用的各种数据库模型中,最初是网络和层次型数据库的强势,后来是关系数据库一统天下,然后又时兴面向对象的数据库,现在热门的则是XML这种层次型数据库。最早的DBMS出现在1960年代,先驱者之一是(图灵奖获得者)Charles Bachman,他设计了首批DBMS之一IDS(Integrated Data Store,集成数据存储,1960年通用电气GE公司)及其后续版本IDMS(Integrated Database Management System,集成数据库管理系统,1971年推出,可在IBM大型机上运行),因其高性能,曾被业界广泛使用。1三种数据库模型依据数据组织的方式,可以将数据库划分成如下三种模型:l 网络型典型的网络数据库模型是(COBOL语言的开发者)CODASYL(Conference on Data Systems Languages,数据系统语言协会)下属的DBTG(Data Base Task Group,数据库工作组),在Charles Bachman思想的基础上开发的,于1969年发布了网络数据库模型语言规范通常称为Codasyl数据模型。上面提到的IDS和IDMS就是网络型数据库管理系统。l 层次型层次模型将数据组织成(一)父(多)子关系的树状结构,IBM公司于1968年推出的IMS(Information Management System,信息管理系统,由Vern Watts主持开发)就是一种层次型数据库管理系统,它在19701980 年代占DBMS的统治地位。现在十分热门的XML数据库也属于层次模型。l 关系型关系数据库模型(relational database model)最早由IBM公司的Edgar F. Codd于1969年提出,但最初并没有受到足够的重视,例如IBM于1970年代开发的System R也只是一个研究原型。只是到了1980年代后,关系数据库才异军突起,并迅速独霸天下。主流的商用关系数据库管理系统(RDBMS = Relational DBMS)有Oracle、DB2、SQL Server和MySQL等。网络模型可真实反映现实世界中,事物之间所存在的错综复杂的网状相互关系(如人际关系)。层次模型可以看成是网络模型的子集或特例(如家族谱系),多个层次模型可以组成一个网路模型。关系模型反映的则是事物间的链接或二元关系(如父子关系、夫妻关系等),简单且高效。层次和网络模型可以用多个二元关系来表示。2关系数据库模型关系数据库由表示二元关系的实体表(table)所组成,表中的列(column)称为字段(field)、行(row)称为记录(record)。如: 表12-1 学生信息表元数据学号姓名性别年龄身高电话记录1001张三男201.80123456781002李四女181.61234567891003王五男211.7234567890字段以程序员的观点,可以将关系数据库看成是特定结构变量的数组,数据库中的字段或列对应于结构中的字段,而数据库中的记录或行则可以看成是结构变量的一个个具体取值。如:typedef struct int num; / ?wchar_t name5;wchar_t sex;int age;float stature;int phone; / ? StInfo;StInfo st;st.num = 004; 0 = L马; 1 = L六; 2 = 0; st.sex = L男;st.age = 19; st.stature = 1.68; st.phone = 45678901;在编程中还用游标(cursor)来表示表中的当前记录、用事务(transaction)来表示封装在一起的一组表的变化(可以解决数据库的完整性问题)。虽然用户可以自己编写程序来控制数据库文件的访问,但RDBMS能给我们带来许多便利,如:l 使用标准的文件格式如含单个表的dBASE/Xbase的DBF(Data Base File数据库文件)、单个文件可含数据库的所有表和索引的Microsoft Access的MDB(Microsoft Access DataBase微软访问数据库)文件l 索引文件访问所有DBMS都包含非常高效的索引访问例程,避免(为了使用关键字来访问记录)用户自己编写二叉树等文件访问程序的麻烦l 数据完整性保护专业DBMS大多含有对数据的保护例程,如在对含一系列变化的事务处理过程中,若不能处理整个事务,则会回滚以恢复事务处理前的原始状态l 多用户访问控制大多数DBMS都提供记录加锁机制,以防止多个用户同时使用时的相互干扰。一些多用户DBMS采用C/S模型,其他采用P2P模式,都可以控制对共享文件的访问3商用RDBMS最早的商用关系型数据库管理系统是甲骨文(Oracle)公司于1979年推出的Oracle(神谕, 预言)和IBM公司于1983年推出的DB2。首个成功的微机(包括PC)上的RDBMS是C. Wayne Ratliff于1978年在(美国)国家航空和宇宙航行局NASA的喷气推进实验室JPL开发的dBase,它在DOS时代占统治地位。它最初叫Vulcan,1980年代初被Ashton-Tate公司购买后,才改名为dBase。1991年Ashton-Tate公司被Borland公司收购。dBase有许多变种,如狐狸软件公司于1984年推出的FoxBASE,后来改名为FoxPro。1992年被微软公司合并后,又改名为Visual FoxPro。其它变种还有Arago、Force、dbFast、dbXL、Quicksilver、Clipper、Xbase+、FlagShip、Recital、CodeBase、MultiBase和Harbour/xHarbour等,它们一般被统称xBase。PC上的另一个出名的RDBMS是Ansa Software 公司的Richard Schwartz和Robert Shostak于1985年开发的Paradox(悖论),1987年9月被Borland公司收购,1992年推出了其Windows版。Corel公司于1990年代中从Borland公司获得了Paradox,并于1997年发布了Corel Paradox 8,它还将Paradox集成到其WordPerfect Office专业版套件中。曾经重要的大型关系数据库还有Informix软件公司于1985年推出的Informix(2001年4月被IBM收购)和Sybase公司于1987年开发的SQL Server(1988年它与微软合作为IBM开发SQL Server for OS/2,1993年在合作协议终止后,微软推出了自己的SQL Server to Windows NT)。现在非常热门的开源Web数据库MySQL也是一种RDBMS,它是由瑞典的MySQL AB公司于1995年5月23日开始推出的,2008年2月26日MySQL AB成为Sun的子公司。目前绝大多数数据库都为关系型数据库,对应的管理软件为关系型数据库管理系统RDBMS。目前主流的RDBMS有:l 甲骨文公司的Oraclel IBM公司的DB2(和Informix)l 微软公司的SQL Server(和Visual FoxPro、Access、Excel)l MySQL AB公司的MySQL常用数据库文件的扩展名见表12-2:表12-2 数据库文件的扩展名AccessdBaseExcelFoxProParadoxSQL Server*.mdb*.dbf*.xls*.dbf*.db*.mdf、*.sdf4SQLSQL(Structured Query Language,结构化查询语言)(官方读作skju:l,也读作si:kwl)为关系数据库的通用查询语言,最初是由IBM公司San Jose实验室的Donald D. Chamberlin和Raymond F. Boyce于1972年为System R关系数据库设计的。1)标准SQL于1986年和1987年分别成为美国国家标准学会ANSI和国际标准化组织ISO标准SQL-86(SQL-87),在1989年、1992年、1999年、2003年和2006年又多次对其进行了修订SQL-89、SQL-92(SQL2)、SQL:1999(SQL3)、SQL:2003和SQL:2006 (ISO/IEC 9075)。下面是当前最新的ISO/IEC 9075标准系列:l ISO/IEC 9075-1:2003 (Ed. 2) Information technology - Database languages - SQL - Part 1: Framework (SQL/Framework),信息科学数据库语言SQL第1部分:框架(SQL/框架) l ISO/IEC 9075-2:2003 (Ed. 2) Information technology - Database languages - SQL - Part 2: Foundation (SQL/Foundation),信息科学数据库语言SQL第2部分:基础(SQL/基础)l ISO/IEC 9075-3:2003 (Ed. 3) Information technology - Database languages - SQL - Part 3: Call-Level Interface (SQL/CLI),信息科学数据库语言SQL第3部分:调用级接口(SQL/CLI)l ISO/IEC 9075-4:2003 (Ed. 3) Information technology - Database languages - SQL - Part 4: Persistent Stored Modules (SQL/PSM),信息科学数据库语言SQL第4部分:持久存储模块(SQL/PSM)l ISO/IEC 9075-9:2003 (Ed. 2) Information technology - Database languages - SQL - Part 9: Management of External Data (SQL/MED),信息科学数据库语言SQL第9部分:外部数据管理(SQL/MED)l ISO/IEC 9075-10:2003 (Ed. 2) Information technology - Database languages - SQL - Part 10: Object Language Bindings (SQL/OLB),信息科学数据库语言SQL第10部分:对象语言绑定(SQL/OLB)l ISO/IEC 9075-11:2003 (Ed. 1) Information technology - Database languages - SQL - Part 11: Information and Definition Schemas (SQL/Schemata),信息科学数据库语言SQL第11部分:信息与定义模式(SQL/模式)l ISO/IEC 9075-13:2003 (Ed. 2) Information technology - Database languages - SQL - Part 13: SQL Routines and Types Using the Java TM Programming Language (SQL/JRT),信息科学数据库语言SQL第13部分:使用Java TM编程语言的SQL例程与类型(SQL/JRT)l ISO/IEC 9075-14:2006 (Ed. 2) Information technology - Database languages - SQL - Part 14: XML-Related Specifications (SQL/XML),信息科学数据库语言SQL第13部分:XML相关规范(SQL/XML)虽然许多DBMS支持SQL,广大程序员也熟悉SQL,但SQL标准仍处于不断变化之中,而且在不同的产品之间的SQL的语法也各不相同,如一些多媒体、面向对象、分布式和XML数据库的扩展。2)语言SQL包括查询(query)、操作(Manipulation)、定义(definition)和控制(control)四种功能。SQL有三种基本的语句形式:l 数据定义语言(DDL = Data Definition Language)用于在数据库中建立数据结构和生成对象,如表(TABLE)、索引(INDEX)和视图(VIEW)。DDL是用三种动词来操作数据库中的对象:n CREAT用于产生新对象,如CREAT 表名(列名1, 列名2, .)n ALTER用于修改现成的对象,如ALTER TABLE 表名 COLUMN 列名 数据类型n DROP用于移走对象,如DROP TABLE 表名 CASCADEl 数据控制语言(DCL = Data Control Language)用于给处理的数据库对象授予用户优先权,优先权包括:n SELECT允许用户查询数据行n INSERT允许用户加入新行n DELETE允许用户删除行n UPDATE允许用户修改行n REFERENCES当表的索引涉及另一个表中的列时,允许用户修改所涉及的表用GRAND语句来授权,用REVOKE语句来取消授权,如:GRAND SELECT ON Tab1 TO ID, Name, AgeREVOKE SELECT ON Tab1 FROM Namel 数据操作语言(DML = Data Manipulation Language)用于数据处理,如添加、删除、修改和查询等。具体语句有:n SELECT语句用于从数据库中选出数据,其最简单的形式为:SELECT 选项列表 FROM 表名其中的选项列表可以是字段、文本或它们的组合;也可以用*表示全选。SELECT语句有很多附加部分,包括:从句(WHERE和ORDER BY)、表达式、谓词(LIKE、IN、BETWEEN)、关键字(DISTINCT)、集合、联合和外部联合、相关名称、ODBC SQL文本值、SQL函数、及子查询与联合查询等。其中的WHERE从句还广泛用于DELETE、UPDATE等其他语句中n INSERT语句用于把行插入表中,其基本形式为:INSERT INFO 表名 (列的列表) VALUES(值的列表)n DELETE语句用于删除表中的行:DELETE FROM 表名 WHERE范围n UPDATE语句用来修改数据库中的现行值:UPDATE 表名 SET 列名1=表达式1,列名2=表达式2,.WHERE从句12.1.2 数据库编程接口存在多种数据库编程接口,最通用的是ODBC和JDBC。可以根据自己不同的平台和需要,作出合适的选择。在Windows平台的数据库接口中,传统的是ODBC,流行的则是ADO和ADO.NET。1数据库接口Visual Studio中提供了如下数据库接口:l ODBC(Open DataBase Connectivity,开放式数据库连接)为不同的数据库资源提供一个标准接口,是目前Windows应用程序中应用最广泛的底层数据库接口,已经成为工业标准。为了方便ODBC使用,MFC对ODBC进行了封装,针对ODBC原始简单的函数型API,建立了一些抽象类:CDatabase(数据库)、CRecordset(记录集)和CRecordView(记录视图),参见图12-2。图12-2 MFC中ODBC和ADO接口的数据库支持类l DAO(Data Access Objects,数据访问对象)微软为自己的Jet (喷气式/喷射)数据库Access(*.MDB)所设计的一种专用数据库编程接口,可提供比ODBC更丰富的功能(如支持数据库定义语言DDL及可访问表与列结构)和更快捷的访问,并在MFC原有的ODBC类基础上,建立了一系列新类CDao*:CDaoDatabase(数据库)、CDaoRecordset(记录集)和CDaoRecordView(记录视图)及CDaoTableDef(表定义)、CDaoQueryDef(查询定义)、CDaoWorkspace(工作空间) ,参见图12-2。l OLE DB(Object Linking and Embedding DataBase,对象链接和嵌入数据库)是一个独立于数据源的、基于COM(Component Object Model,组件对象模型)的网络数据库底层接口,功能强大、访问灵活、使用广泛。OLE DB框架定义了三个基本类:数据提供者(data provider)、用户(consumer,消费者)和服务提供者(service provider),参见图12-3。用户应用程序与工具ADOOLE DBOLE DB服务提供者数据提供者游标引擎查询引擎制作引擎ODBCSQLISAM电子表格目录服务文件系统图12-3 ADO和OLE DB架构l ADO(ActiveX Data Object,ActiveX数据对象)由于OLE DB太过底层,不太容易使用(似COM),也不合适于做VB与JScript的接口。为了满足日常数据源开发的需要,并且作为ODBC和DAO的逻辑扩展,微软推出了建立在OLE DB基础上的高层数据库接口ADO(似ActiveX),特别适用于ASP(Active Server Page,动态服务器网页)Web应用程序的开发,参见图12-3和4。图12-4 数据库接口l ADO.NET.NET平台的数据库编程接口,主要为基于消息的Web应用程序而设计,可以访问关系数据库和XML结构,参见图12-5。其核心类是.NET框架的System.Data命名空间中的DataSet(数据集)。在ADO.NET中,可以按传统逐行(记录)访问(连接型)数据库,也可以按网络数据库中流行的数据集的方法来访问(断开型)数据库。在.NET中,对关系数据库源,一般通过.NET框架的数据提供程序(data provider)来访问。.NET框架中包含的数据提供程序(使用的命名空间)有:针对SQL Server(System.Data.SqlClient)、OLE DB(System.Data.OleDb)、ODBC(System.Data.Odbc)、Oracle(System.Data.OracleClient)等的.NET框架数据提供程序。CLR客户端应用程序DataSetRows.NET框架数据供应链XML文档DBMSWindows图12-5 ADO.NET允许.NET应用程序访问存储于DBMS和XML文档中的数据l LINQVisual Studio 2008 版和.NET框架的3.5版,引入了LINQ(Language Integrated Query,语言集成查询)功能,该功能将一组通用的标准查询运算符集成到了Visual C# 和Visual Basic的语言语法中。LINQ引入了标准易学的数据查询和更新模式,并可以扩展以支持可能的任何数据类型。Visual Studio 2008包括LINQ 提供程序的程序集,借助这些程序集,可以启用.NET框架集合 (LINQ to Objects)、SQL 数据库 (LINQ to SQL)、ADO.NET数据集 (LINQ to DataSet) 以及XML文档 (LINQ to XML) 等的语言集成查询,参见图12-6。图12-6 LINQ访问数据n 跨数据源和数据格式查询是一种从数据源检索数据的表达式。查询通常用专门的查询语言来表示。随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的SQL和用于XML的XQuery。因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言。LINQ通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。在LINQ查询中,始终会用到对象。可以使用相同的基本编码模式来查询和转换XML文档、SQL数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有LINQ提供程序可用的任何其他格式的数据。n 查询操作的三个部分所有 LINQ 查询操作都由以下三个不同的操作组成:获取数据源、创建查询、执行查询,参见图12-7。图12-7 完整的LINQ查询操作n C# 例子:class IntroToLINQ static void Main() / The Three Parts of a LINQ Query: / 1. Data source. int numbers = new int7 0, 1, 2, 3, 4, 5, 6 ; / 2. Query creation. var numQuery = / numQuery is an IEnumerable from num in numbers where (num % 2) = 0 select num; / 3. Query execution. foreach (int num in numQuery) Console.Write(0,1 , num); 2接口的选择如果你使用Java编程,不论你使用何种操作系统,JDBC都唯一的数据库接口选择。如果你使用MFC进行非.NET编程,可有多种数据库接口供选择:标准的ODBC最通用、DAO只适合于微软的Access数据库、OLE DB功能强大但是编写麻烦、ADO则不仅功能强大而且使用方便。如果你编写.NET的数据库应用程序,唯一的选择是ADO.NET接口,但是可以使用任何支持.NET的编程语言,如C+/CLI、C#、VB、JScript、J# 等。不过,如果你在VS08中使用C# 和VB编程,则还可以选择LINQ功能来访问数据库。参见图12-8。图12-8 编程语言与数据库接口由于时间有限,本课程只简单介绍ODBC的MFC编程、ADO.NET和LINQ的C# 编程。如果对DAO、OLE DB、ADO、JDBC等编程有兴趣,可以自己找资料看。12.2 ODBC的MFC编程ODBC(Open DataBase Connectivit,开放式数据库连接)是微软公司对国际标准CLI(Call-Level Interface,调用级接口)的一种商业实现,是Windows环境下,不同类型数据库的一个通用编程接口。12.2.1 ODBCODBC是国际标准的微软实现,具有基于DLL的模块化结构。可以直接在ODBC的API层次上进行C语言程序设计,但通常是利用ODBC的C+类封装,进行面向对象的MFC编程。1ODBC标准CLI是由SAG(SQL Access Group,SQL访问组)于1992年制定的数据库访问方法标准,1995年成为国际标准(1999年和2003年又分别对其进行了更新):l ISO/IEC 9075-3:1995/1999/2003 Information technology - Database languages - SQL - Part 3: Call-Level Interface (SQL/CLI),信息技术数据库语言SQL第3部分:调用级接口(SQL/CLI)。ODBC(Open DataBase Connectivity,开放式数据库连接)是微软对CLI的商业实现,推出的版本有:1.0(1992年9月)、2.0(1994)、3.0(1996)、3.5(1997?)、4.0(2001?)。微软的ODBC不仅定义了SQL的语法,而且定义了C语言同SQL数据库之间的程序设计接口,可以对任何带有ODBC驱动程序的DBMS进行访问。ODBC是不同类型数据库的一个通用接口,它们是Windows的一些简单的函数型API。利用ODBC API编写的应用程序独立于具体的RDBMS,实现了应用程序对不同DBMS的共享。这些是靠各个DBMS的ODBC驱动程序(driver)来做到的,VC+2008中提供了下列DBMS的驱动程序:SQL Server、Microsoft Access、Microsoft Excel、dBASE、Paradox、Microsoft Oracle ODBC、文本文件。2ODBC的结构ODBC是一种基于DLL的系统完全模块化的独特结构,高层为一个定义了应用程序设计接口的小DLLODBC32.DLL,在应用程序的执行过程中,ODBC32.DLL会调用特定数据库的驱动程序DLL。借助于由“控制面板/管理工具/数据源(ODBC)”管理模块所维护的Windows注册表,ODBC32.DLL可跟踪哪个数据库的驱动程序DLL可用,允许单个程序同时访问多个DBMS中的数据。32位ODBC的DLL层次结构见下图:MFC数据库应用程序ODBC32.DLL驱动程序管理器ODBCJT32.DLLJet控制器ODBCCR32.DLL游标库MSJT40.DLLJet数据库引擎SQL ServerODBC驱动程序MSXBDE40.DLLXbase驱动程序局部DBF文件局部MDB文件远程共享数据库SQL Server图12-9 ODBC结构3ODBC SDK编程如果直接在ODBC的C语言API层次上进行程序设计,必须了解通过句柄来访问的三个非常重要的ODBC元素:l 环境(enviroment)我们首先需要一个环境来建立程序与ODBC系统之间的联系。一个应用程序通常只有一个环境句柄l 连接(connection)然后我们需要有一个或多个连接来建立驱动程序与数据源之间的特定组合关系。一些特定的ODBC连接可以固定地编入程序中,也可让用户从可以获得的驱动程序及数据源列表中进行选择。如ODBC32.DLL具有一个内部对话框,它列出了在Windows注册表中(的HKEY_LOCAL_MACHINE SOFTWAREODBC目录下)定义的所有连接。l 语句(statement)一旦获得了连接,还需要SQL语句来执行各种操作,如查询、修改、添加、删除等。例如:查询:SELECT FNAME, LNAME, CITY FROM AUTHORS WHERE STATE = UT ORDER BY LNAME修改:UPDATE AUTORS SET PHONE = 801 232-5780 WHERE ID = 357-86-4343由于查询语句需要一个程序来循环地对结果进行处理,因此,程序可能需要有若干个语句同时处于活动状态。许多ODBC驱动程序都允许每个连接可由多个处于活动状态的语句来控制。ODBC允许用户将查询的结果定义成一个与SQL语句关联在一起的称为行集(rowset)的数据块,通过ODBC的SDK函数SQLExtendedFetch,用户程序可以借助于ODBC游标在所选择的若干记录之间来回移动,此游标是一个可编程的志向行集的指针。行集可以是动态的,一旦数据库发生变化(如当某个用户程序正在行集中浏览时,另一个程序却修改或删除了行集中某个记录),ODBC会立刻对数据进行更新。称动态行集为“动态集”(dynaset)。ODBC的游标库模块ODBCCR32.DLL支持称为“快照”(snapshots)的静态行集,当执行SELECT语句时,ODBC会将所选择的若干记录进行备份,并且在内存中建立指向这些记录的指针。这样在用户浏览它们时,它们不会发生任何变化;但在多用户情况下,可能需要不时对数据库进行重新查询,以便重新建立快照来反映数据库的变化。其他选择或分类更新、删除、插入第1步:建立连接SQLAllocHandle(ENV):创建环境句柄SQLSetEnvAttr:设置环境句柄属性SQLAllocHandle(DBC):创建连接句柄SQLConnect:建立连接SQLSetConnectAttr:设置连接属性第2步:初始化SQLGetInfo:获取信息SQLAllocHandle(STMT):创建语句句柄SQLSetStmtAttr:设置语句属性第3步:执行分类函数SQLExecDirect (BindParameters)语句类型?第4步(a):提取数据结果SQLNumResultColsSQLFetchSQLGetData或SQLBindCol(SQLDescribeCol)SQLCloseCursor第4步(b):获取行数SQLRowCount第5步:事务结束SQLEndTran第6步:断开连接SQLFreeHandle(STMT)SQLDisconnectSQLFreeHandle(DBC)SQLFreeHandle(ENV)图12-10 ODBC API应用程序框架12.2.2 MFC的ODBC类借助于MFC的ODBC类,可以用对象来代替连接句柄和语句句柄,但环境句柄不是由C+对象来表示的,二是被保存在一个全局变量中。两个最主要的ODBC类为:l CDatabase类其对象代表与数据源的ODBC连接,用户一般不需要从它派生类l CRecordset类其对象代表可滚动行集(通常为快照),用户一般需要从它派生自己的类,以便和数据库表中的列项匹配。为了与VB和Access保持一致,在MFC和文档中用“记录集”代替了“行集”。图12-11是MFC的ODBC类与数据库的关系图:CDatabase对象m_hdbcCRecordset派生类对象m_pDatabasem_hstmtODBC连接数据库ODBC行集动态集或快照图12-11 MFC ODBC类与数据库的关系1CDatabase类CDatabase类是MFC基类CObject的直接派生类:CObject CDatabaseCDatabase类提供了对ODBC数据库连接的抽象,一个CDatabase类的对象就代表了一个与ODBC数据源的连接(该数据源可以是本地的,也可以是网上的),一个应用程序可以拥有多个激活的CDatabase对象。表12-3为CDatabase类的成员,其中的许多成员函数都直接与ODBC的C语言API函数相对应。表12-3 CDatabase类的成员类成员功能数据成员m_hdbcODBC数据源的连接句柄,类型为HDBC构造CDatabase构造一个CDatabase空对象,必须调用OpenEx初始化Open通过驱动程序建立一个数据源的连接OpenEx通过驱动程序建立一个数据源的连接Close关闭与数据源的连接数据库属性GetConnect返回连接CDatabase对象与一数据源的ODBC连接串IsOpen若接CDatabase对象正与一数据源连接着,则返回非0GetDatabaseName返回正在使用的数据库名称CanUpdate若数据库可更新(非只读),则返回非0CanTranscat若数据源支持事务,则返回非0SetLoginTimeout设置连接数据库尝试的超时秒数SetQueryTimeout设置查询连接数据库的超时秒数,影响所有随后的对Open、AddNew、Edit、Delete等记录集操作的调用GetBookmarkPersistence确定书签是否停留在于记录集中GetCursorCommitBehavior确定提交事务对一个打开的记录集的影响GetCursorRollbackBehavior确定回滚事务对一个打开的记录集的影响数据库操作BeginTrans开始事务处理BindParameters允许你在调用CDatabase:ExecuteSQL前绑定参数CommitTrans结束事务处理Rollback回滚对事务的处理,恢复数据源先前的状态Cancel取消一个异步操作或来自第二个线程的进程ExecuteSQL执行SQL语句,但不返回数据记录数据库可覆盖成员OnSetOptions由框架调用来设置标准的连接选项,缺省实现为设置查询的超时秒数1) 建立/关闭数据库连接在使用大多数其他数据库类和方法前,必须先创建一个CDatabase对象,并用CDatabase类的成员函数OpenEx来建立到数据库的连接,完成操作后应该调用Close成员函数来释放所有相关资源。CDatabase类的构造函数为CDatabase( );Open与OpenEx的函数原型为:virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T(“ODBC;”), BOOL bUseCursorLib = TRUE );virtual BOOL OpenEx( LPCTSTR lpszConnectString, DWORD dwOptions = 0 );其中,lpszConnectString为ODBC连接串,为NULL时将弹出ODBC连接对话框,由用户选择适当数据源来打开。如class CMyDocument : public CDocument public: / Declare a CDatabase embedded in the document CDatabase m_dbCust; / .;/ ./ Initialize when neededCDatabase* CMyDocument:GetDatabase( ) / Connect the object to a data source if( !m_dbCust.IsOpen( ) & !m_dbCust.OpenEx( NULL ) ) return NULL; return &m_dbCust;lpszConnectString也可以是以分号分隔的一组标准ODBC选项,这些选项在打开数据库时有用的。常用的ODBC选项有:l DSN = 数据源名(Data Source Name),定义在ODBC控制面板上l UID = 用户标识(User IDentifier)l PWD = 口令(PassWorD)l DBQ = 数据库限定符(DataBase Qualifier),如数据库文件的路径或网络地址l Driver = ODBC驱动程序名,如Microsoft Access Driver(*.mdb)dwOptions是一组可以用或|连在一起的标志,用来设置OpenEx的行为,如:l CDatabase:openReadOnly规定数据库按只读方式打开l CDatabase:noOdbcDialog不显示ODBC连接对话框l CDatabase:forceOdbcDialog强制显示ODBC连接对话框l CDatabase:useCursorLib装载ODBC游标库l CDatabase:openExclusive以独占方式打开,本版本的MFC不支持,数据源总是以共享资源方式打开例如m_dbCust.OpenEx( _T( DSN=MYDATASOURCE;UID=JOES ), CDatabase:openReadOnly | CDatabase:noOdbcDialog );在完成对连接的数据库的操作后,应该调用Close成员函数:virtual void Close( );来关闭所有未关闭的记录集,并释放所有相关资源。2) 设置超时时间如果是连接一个网络数据库,耗时一般比本机的长,而且在连接期间可能发生会错误。可以调用CDatabase类的成员函数:void SetLoginTimeout( DWORD dwSeconds );来设置应用程序等待用OpenEx建立连接的超时时间,其中dwSeconds为超时的秒数。还可以调用CDatabase类的另一个成员函数:void SetQueryTimeout( DWORD dwSeconds );来设置应用程序对数据库的其他操作所等待的超时时间。3) 获取连接信息可以随时调用CDatabase类的成员函数BOOL IsOpen( ) const;来查看CDatabase对象是否已经连接到数据源上(已经连接返回非0),用成员函数const CString& GetConnect( ) const;获得连接数据库的ODBC连接串(没有连接时返回空串),还可以用成员函数CString GetDatabaseName( ) const;来获取数据源的数据库名称(没有数据源时返回空串)。(4) 执行SQL语句虽然我们一般用CRecordset类来查询数据库并返回查询结果,但也可以调用CDatabase类的成员函数void ExecuteSQL( LPCSTR lpszSQL );来执行SQL语句而不返回查询结果,其中lpszSQL为带SQL语句串的指针。MFC在将SQL语句发送给数据库之前,会先调用CDatabase类的唯一可重载成员函数virtual void OnSetOptions( HSTMT hstmt );来做一些SQL语句的选项设置,所以可以重载此函数来为自己的SQL语句作一些选项设置。另外,还可以使用CDatabase类的另一成员函数virtual void BindParameters( HSTMT hstmt );来把参数绑定到执行的SQL语句上,其中hstmt为ODBC语句的句柄,不过得派生自己的CDatabase类,并在派生类中重载BindParameters函数。5) 进行事务处理事务允许把一系列SQL语句作为一个单独的操作来处理,如果在处理过程中,有一个SQL语句出错,则会自动停止其他语句的执行,并会回滚以恢复事务处理前的原始状态。并非所有的ODBC驱动程序都支持事务,所以在进行事务处理之前应该先调用CDatabase类的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论