资源描述
个人收集整理 勿做商业用途
第14章 数据库编程
用户
用户
数据库(database)是存储在计算机里的结构化数据的集合,可以分为关系、层次和网络三种类型,通常由数据库管理系统(DBMS = DataBase Management System)软件(如Oracle、DB2、SQL Server等)对数据库进行管理,应用程序通过(标准)编程接口(如ODBC/JDBC、DAO/ADO。NET、DOM/SAX等)来访问数据库,参见图14-1.
数据库管理系统
……
图14-1 数据库应用系统结构
Visual Studio为程序员提供了多种数据库编程的接口和类库,传统上是采用MFC进行ODBC、DAO和ADO编程,现在则一般采用C# 和VB进行ADO。NET的Web应用编程。
14。1 数据库与编程接口
关系型数据库可以视为结构变量的集合,有专用的系统RDBMS进行管理,通过标准的查询语言SQL进行操作.微软平台中有多种数据库编程接口可供使用,早期常用ODBC和DAO,现在则多为ADO.NET。
14。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主持开发)就是一种层次型数据库管理系统,它在1970~1980 年代占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
张三
男
20
1.80
12345678
→
1002
李四
女
18
1.61
23456789
→
1003
王五
男
21
1.72
34567890
↑
↑
↑
↑
↑
↑
字段
以程序员的观点,可以将关系数据库看成是特定结构变量的数组,数据库中的字段或列对应于结构中的字段,而数据库中的记录或行则可以看成是结构变量的一个个具体取值.如:
typedef struct {
int num; // ?
wchar_t name[5];
wchar_t sex;
int age;
float stature;
int phone; // ?
} StInfo;
StInfo st;
st.num = 004;
st。name[0] = L'马';
st.name[1] = L'六';
st。name[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 甲骨文公司的Oracle
l IBM公司的DB2(和Informix)
l 微软公司的SQL Server(和Visual FoxPro、Access、Excel)
l MySQL AB公司的MySQL
常用数据库文件的扩展名见表12—2:
表12—2 数据库文件的扩展名
Access
DB2
dBase
Excel
FoxPro
Oracle
Paradox
SQL Server
*。mdb
*。dbf
*.xls
*.dbf
*。db
*。mdf、*。sdf
4.SQL
SQL(Structured Query Language,结构化查询语言)(官方读作[ɛskju:’ɛl],也读作['si:kwəl])为关系数据库的通用查询语言,最初是由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 表名 CASCADE
l 数据控制语言(DCL = Data Control Language)--用于给处理的数据库对象授予用户优先权,优先权包括:
n SELECT允许用户查询数据行
n INSERT允许用户加入新行
n DELETE允许用户删除行
n UPDATE允许用户修改行
n REFERENCES当表的索引涉及另一个表中的列时,允许用户修改所涉及的表
用GRAND语句来授权,用REVOKE语句来取消授权,如:
GRAND SELECT ON Tab1 TO ID, Name, Age
REVOKE SELECT ON Tab1 FROM Name
l 数据操作语言(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从句]
14。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(记录视图),参见图14-2.
图14—2 MFC中ODBC和ADO接口的数据库支持类
l DAO(Data Access Objects,数据访问对象)——微软为自己的Jet (喷气式/喷射)数据库Access(*.MDB)所设计的一种专用数据库编程接口,可提供比ODBC更丰富的功能(如支持数据库定义语言DDL及可访问表与列结构)和更快捷的访问,并在MFC原有的ODBC类基础上,建立了一系列新类CDao*:CDaoDatabase(数据库)、CDaoRecordset(记录集)和CDaoRecordView(记录视图)及CDaoTableDef(表定义)、CDaoQueryDef(查询定义)、CDaoWorkspace(工作空间) ,参见图14-2。
l OLE DB(Object Linking and Embedding DataBase,对象链接和嵌入数据库)-—是一个独立于数据源的、基于COM(Component Object Model,组件对象模型)的网络数据库底层接口,功能强大、访问灵活、使用广泛。OLE DB框架定义了三个基本类:数据提供者(data provider)、用户(consumer,消费者)和服务提供者(service provider),参见图14—3。
用户
应用程序与工具
ADO
OLE DB
OLE DB
服务提供者
数据提供者
游标
引擎
查询
引擎
制作
引擎
ODBC
SQL
ISAM
电子
表格
目录
服务
文件
系统
图14—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应用程序的开发,参见图14—3和4。
图14—4 数据库接口
l ADO。NET——.NET平台的数据库编程接口,主要为基于消息的Web应用程序而设计,可以访问关系数据库和XML结构,参见图14—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
客户端应用程序
DataSet
Rows
.NET框架
数据供应链
XML
文档
DBMS
Windows
图14-5 ADO.NET允许.NET应用程序访问
存储于DBMS和XML文档中的数据
l LINQ——Visual 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) 等的语言集成查询,参见图14—6。
图14-6 LINQ访问数据
n 跨数据源和数据格式—-查询是一种从数据源检索数据的表达式。查询通常用专门的查询语言来表示.随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的SQL和用于XML的XQuery。因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言。LINQ通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。在LINQ查询中,始终会用到对象。可以使用相同的基本编码模式来查询和转换XML文档、SQL数据库、ADO.NET 数据集、。NET 集合中的数据以及对其有LINQ提供程序可用的任何其他格式的数据。
n 查询操作的三个部分——所有 LINQ 查询操作都由以下三个不同的操作组成:获取数据源、创建查询、执行查询,参见图14-7。
图14-7 完整的LINQ查询操作
n C# 例子:
class IntroToLINQ {
static void Main() { // The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation。
var numQuery = // numQuery is an IEnumerable〈int〉
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功能来访问数据库。
参见图14—8。
图14—8 编程语言与数据库接口
由于时间有限,本课程只简单介绍ODBC的MFC编程、ADO.NET和LINQ的C# 编程。如果对DAO、OLE DB、ADO、JDBC等编程有兴趣,可以自己找资料看。
14.2 ODBC的MFC编程
ODBC(Open DataBase Connectivit,开放式数据库连接)是微软公司对国际标准CLI(Call-Level Interface,调用级接口)的一种商业实现,是Windows环境下,不同类型数据库的一个通用编程接口.
14。2.1 ODBC
ODBC是国际标准的微软实现,具有基于DLL的模块化结构.可以直接在ODBC的API层次上进行C语言程序设计,但通常是利用ODBC的C++类封装,进行面向对象的MFC编程.
1.ODBC标准
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、文本文件。
2.ODBC的结构
ODBC是一种基于DLL的系统完全模块化的独特结构,高层为一个定义了应用程序设计接口的小DLL——ODBC32。DLL,在应用程序的执行过程中,ODBC32。DLL会调用特定数据库的驱动程序DLL。借助于[由“控制面板/管理工具/数据源(ODBC)”管理模块所维护的]Windows注册表,ODBC32。DLL可跟踪哪个数据库的驱动程序DLL可用,允许单个程序同时访问多个DBMS中的数据。32位ODBC的DLL层次结构见下图:
MFC数据库应用程序
ODBC32.DLL
驱动程序管理器
ODBCJT32.DLL
Jet控制器
ODBCCR32.DLL
游标库
MSJT40.DLL
Jet数据库引擎
SQL Server
ODBC驱动程序
MSXBDE40.DLL
Xbase驱动程序
局部DBF文件
局部MDB文件
远程共享数据库
SQL Server
图14-9 ODBC结构
3.ODBC SDK编程
如果直接在ODBC的C语言API层次上进行程序设计,必须了解通过句柄来访问的三个非常重要的ODBC元素:
l 环境(enviroment)——我们首先需要一个环境来建立程序与ODBC系统之间的联系.一个应用程序通常只有一个环境句柄
l 连接(connection)——然后我们需要有一个或多个连接来建立驱动程序与数据源之间的特定组合关系.一些特定的ODBC连接可以固定地编入程序中,也可让用户从可以获得的驱动程序及数据源列表中进行选择.如ODBC32.DLL具有一个内部对话框,它列出了在Windows注册表中(的HKEY_LOCAL_MACHINE\ SOFTWARE\ODBC目录下)定义的所有连接。
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):提取数据结果
SQLNumResultCols
SQLFetch
SQLGetData或
SQLBindCol(SQLDescribeCol)
SQLCloseCursor
第4步(b):获取行数
SQLRowCount
第5步:事务结束
SQLEndTran
第6步:断开连接
SQLFreeHandle(STMT)
SQLDisconnect
SQLFreeHandle(DBC)
SQLFreeHandle(ENV)
图14-10 ODBC API应用程序框架
14.2。2 MFC的ODBC类
借助于MFC的ODBC类,可以用对象来代替连接句柄和语句句柄,但环境句柄不是由C++对象来表示的,二是被保存在一个全局变量中。
两个最主要的ODBC类为:
l CDatabase类-—其对象代表与数据源的ODBC连接,用户一般不需要从它派生类
l CRecordset类-—其对象代表可滚动行集(通常为快照),用户一般需要从它派生自己的类,以便和数据库表中的列项匹配.
为了与VB和Access保持一致,在MFC和文档中用“记录集”代替了“行集”。图14—11是MFC的ODBC类与数据库的关系图:
CDatabase对象
m_hdbc
CRecordset派生类对象
m_pDatabase
m_hstmt
ODBC连接
数据库
ODBC行集
动态集或快照
图14-11 MFC ODBC类与数据库的关系
1.CDatabase类
CDatabase类是MFC基类CObject的直接派生类:
CObject → CDatabase
CDatabase类提供了对ODBC数据库连接的抽象,一个CDatabase类的对象就代表了一个与ODBC数据源的连接(该数据源可以是本地的,也可以是网上的),一个应用程序可以拥有多个激活的CDatabase对象.
表12—3为CDatabase类的成员,其中的许多成员函数都直接与ODBC的C语言API函数相对应。
表12—3 CDatabase类的成员
类成员
功能
数据成员
m_hdbc
ODBC数据源的连接句柄,类型为HDBC
构造
CDatabase
构造一个CDatabase空对象,必须调用Open[Ex]初始化
Open
通过驱动程序建立一个数据源的连接
OpenEx
通过驱动程序建立一个数据源的连接
Close
关闭与数据源的连接
数据库属性
GetConnect
返回连接CDatabase对象与一数据源的ODBC连接串
IsOpen
若接CDatabase对象正与一数据源连接着,则返回非0
GetDatabaseName
返回正在使用的数据库名称
CanUpdate
若数据库可更新(非只读),则返回非0
CanTranscat
若数据源支持事务,则返回非0
SetLoginTimeout
设置连接数据库尝试的超时秒数
SetQueryTimeout
设置查询连接数据库的超时秒数,影响所有随后的对Open、AddNew、Edit、Delete等记录集操作的调用
GetBookmarkPersistence
确定书签是否停留在于记录集中
GetCursorCommitBehavior
确定提交事务对一个打开的记录集的影响
GetCurs
展开阅读全文