《轻松学VisualC之数据库编程.pptx》由会员分享,可在线阅读,更多相关《轻松学VisualC之数据库编程.pptx(58页珍藏版)》请在三一办公上搜索。
1、第14章 数据库编程,当前正处于信息高速发展的时代,对数据的处理和研究已经成为计算机最活跃的领域之一。使用数据库对数据进行管理有很明显的优点,不仅减少了数据的冗余性,而且还实现了数据的一致和统一性。因此数据库管理系统在不同领域都得到了广泛的应用。现在,对于大中型应用程序来说,几乎都离不开数据库,所以数据库编程是一种基本而且重要的技能。,14.1 数据库系统概述,数据库技术诞生于20世纪60年代,是计算机应用领域中非常重要的技术,也是数据管理的最新技术。本节简要介绍一下数据库技术中的基本术语,以及关系数据库模型。,14.1.1 数据库的基本术语,数据库技术是信息系统的一个核心技术。是一种计算机辅
2、助管理数据的方法,它研究如何组织和存储数据,如何高效地获取和处理数据。是通过研究数据库的结构、存储、设计、管理以及应用的基本理论和实现方法,并利用这些理论来实现对数据库中的数据进行处理、分析和理解的技术。,14.1.1 数据库的基本术语,1数据数据(Data)是对客观事物的数学描述,在现实生活中,人们利用语言对事物进行描述,而计算机中,这种自然语言不可能进行直接存储。因此,人们在自然事物中抽象抽来一些信息对事物进行描述,这些信息就是数据。,14.1.1 数据库的基本术语,2.数据模型为了用计算机处理现实世界中的具体事物,往往需要对客观的事务进行抽象处理,从而把它归纳成一个简单清晰易于处理的模型
3、。数据模型就是一种对客观事务抽象化的表现形式。数据模型通常由数据结构、数据操作和完整性约束三个基本要素组成。,14.1.1 数据库的基本术语,3数据库数据库(Database,DB)实际上就是对事物的特征等进行抽象之后得到数据,在计算机中把这些数据进行保存。随着数据存储技术的发展,人们对数据保存的方法也越来越先进,现在数据库是数据存储的最佳场所。数据的安全性、数据的完整性和数据的独立性是数据库技术的三大优点。,14.1.1 数据库的基本术语,4数据库管理系统数据库管理系统(Database Management System,DBMS)是一种数据管理软件,它是位于用户和计算机系统之间的管理软件
4、。它对数据统一进行管理,用户不必关心物理上的数据库的模式,而仅仅是逻辑上进行数据库的定义,对数据库进行操作等。,14.1.1 数据库的基本术语,5数据库系统数据库系统(Database System,DBS)是只引入了数据库系统以后所构成的一个系统。它一般由数据库、数据库管理系统、应用系统、数据库管理员和用户组成。例如,一个完整的学校选课系统就是一个数据库系统。当然,人们也常把除人以外与数据库有关的硬件和软件系统统称为数据库系统。,关系数据库模型,市场上的数据库产品绝大部分都是关系数据库管理系统(RDBMS),虽然基于新的数据模型(如对象数据模型)的数据库产品已经面市,但RDBMS 在市场上的
5、主导地位并没有改变。,关系数据库模型,1.数据结构所谓的关系,就是一张表。表的各列以属性开始,属性是列的入口;各行是由多种属性组成的多元组。表中所有的元组必须是必须是各不相同,列值必须是不可分割的,所有数组和集合不能作为列值。,关系数据库模型,2.完整性规则如果根据关系中某个属性或属性集能唯一确定一个元组,则把这个属性称为关系的键码。例如,上面例子学生的学号各不相同,那么学号就可以是学生信息表中的键码。反之,一个老师有可能带两门课,所以给定老师编号并不能确定课号,所以在课程表中教师编号就不能作为键码。如果表中不知一个键码,则选定一个作为该关系的主键。在关系数据库管理系统中,若插入行的主关键字不
6、唯一,该行将被拒绝接受,并返回错误信息。关系模型要求主关键的属性不能为空,这就是实体的完整性。因为主键用来标识表中的行,而带有空值的主键无法标识行。,关系数据库模型,3.数据操作关系数据库之所以发展如此之快,是因为关系模型简明,便于用户理解。同时,关系模型有着坚实的数学基础,操作表达能力很强大,这也给关系数据库的发展提供了保证。,14.1.3 数据库设计方法,数据库设计(Database Design)是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。一般情况下,数据库的设计过程大致可分为5个步骤:需求分析、概念设计、逻辑设计、物理设计和验证设计。,14.2
7、 SQL语言,SQL是结构化查询语言(Structured Query Language)的英文缩写,英文中读作Sequel。它是一种最常用的关系数据库语言,通过它可以对数据库进行查询和更新等操作。,14.2.1 SQL语言的特点,SQL语言是集数据定义、数据查询、数据操作以及数据控制于一身的语言,是一种功能强大、通用性好但又简单易学的语言。其主要特点如下:1.综合统一2.高度非过程化3.面向集合的操作方式4.以同一种语法结构提供多种使用方式5.简单易学,灵活易用,14.2.2 数据定义语言,数据定义语言DDL(Data Definition Language),主要是用于定义关系模式、视图或
8、索引。在SQL中,一般将关系称做表(Table)。数据定义语言主要包括CREATE、ALTER、DROP等命令。,14.2.3 数据查询语言,数据查询语言DQL(Data Query Language),主要是用于从数据库中检索数据。数据查询语言主要包括SELECT等命令。数据库查询是数据库的核心操作。,14.2.3 数据查询语言,1.简单查询SQL中最简单的查询就是从某个关系中查找满足某种条件的元组,这类似于关系代数中的选择运算。,14.2.3 数据查询语言,2.选择条件的构成SQL语句中WHERE子句后的表达式即选择条件,这个表达式可以使用6种通用的比较运算符对值进行比较:=(等于)、(不
9、等于)、(大于)、=(不小于)。对于字符串,还可一用连接运算符或运算符(|)进行连接。例如,A|BC=ABC。逻辑运算符包括AND(与)、OR(或)、NOT(非)。,14.2.3 数据查询语言,3.字符串模糊查询我们常常有这样的需求,比如查询所有姓张的学生信息,或者查询名字中包含某一个字的学生。SQL语言也给我提供了极为方便的解决方案。用LIKE和NOT LIKE关键字可以轻松实现上面需求,不过还得配合百分号(%)和下划线(_)使用。百分号(%)是任意字符组成任意长度的字符通配符,下划线(_)是只能代表一个任意字符的通配符。,14.2.3 数据查询语言,4.输出查询结果排序有时候我们希望查询的
10、结果按照一定的顺序显示出来,也就是对输出的结果进行排序。排序可以给予某个属性的值,若相等也可以根据第二个属性的值。要想实现对结果进行排序,只要在WHERE子句的选择条件后面添加如下子句即可。,14.2.3 数据查询语言,5.聚合运算符查询SQL提供了5种使用与关系表中属性列的运算符,这些运算符可以产生该列的聚合信息。这些聚合运算符有:SUM:求某列所有值的和;AVG:求某列所有值的平均值;MIN:求某列中的最小值;MAX:求某列中的最大值;COUNT:求某列中值的个数。,14.2.3 数据查询语言,6.分组查询有时候,我们需要的并不是某一列值的某种聚合,而是将这一列值根据其他某列或某几列划分成
11、组后的聚合。这是我们可以在WHERE子句后添加GROUP BY关键字,在GROUP BY关键字后面给出分组属性列名。,14.2.4 数据更新语言,数据操纵语言DML(Data Manipulation Language),主要是用于添加、修改和删除数据库记录。数据操纵语言主要包括INSERT、UPDATE、DELETE等命令。,14.3 ODBC数据库编程,ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构中有关数据库的一个组成部分。它建立了一组规范,并提供了一组对数据库访问的标准API。这些API函数利用SQL来完成其大部分任务。目前很多数
12、据库应用程序都使用ODBC来访问数据库。,14.3.1 MFC ODBC概述,由于直接使用ODBC API编写应用程序要编制大量代码。所以在VC+中提供了MFC ODBC类,对较复杂的ODBC API进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。MFC ODBC类中主要包括以下内容。1.CDatabase(数据库类)2.CRecordset(记录集类)3.CRecordView(可视记录集类)4.CFieldExchange(字段交换类)5.CDBException(异常类),14.3.2 创建ODBC数据源,ODBC应用程序不能直接使用数据库,用户必需为要使用的数据库
13、创建ODBC数据源。创建数据源的工作由ODBC数据源管理器完成。ODBC数据源管理器根据数据源提供的数据库的位置、数据库类型、及ODBC驱动程序等信息,建立与具体数据库之间的联系。,14.3.3 CDatabase类,CDatabase类用来封装应用程序对一个数据库连接的处理。这个连接可以是本地数据库,也可以通过网络相连的一个远程数据库。,14.3.4 CRecordset类,尽管CDatabase类提供了ExecuteSQL()函数用于执行大多数的SQL命令。但有时,当SQL命令返回一系列相关记录时,需要形成一个记录集,CDatabase类无法完成这样的任务。MFC提供了CRecordset
14、类来实现构成查询结果的记录集,并负责处理相关操作。,14.4 ODBC编程实例,本节,我们首先从创建Acces数据开始,然后实现为其关联数据源,最后利用VC+编写一个管理学生信息数据库的程序。实现显示学生信息、添加学生信息、删除学生信息等功能。,14.4.1 创建Access数据库,在这一小节,我们将利用Microsoft Access 2010创建一个学生信息数据库,并为其关联数据源。,14.4.2 编写MFC程序,现在,我们来编写一个MFC对话框程序,实现通过数据源对数据库进行操作;完成对学生信息的添加、修改、删除操作。,14.5 ADO数据库编程,ADO是微软提出的一组用于访问关系型及非
15、关系型数据库的应用程序接口,它采用COM技术,提供了编程语言和统一数据访问方式OLE DB的一个中间层。使用ADO技术,开发人员只需关心到数据库的连接,而不用关心数据库是如何实现的。使用ADO不仅可以访问关系型,还可以访问非关系型数据库。ADO技术最主要的优点是易于使用、速度快、占用内存少。,14.5.1 ADO简介,在介绍ADO之前,首先对前面介绍的ODBC做一些回顾。使用ODBC技术访问数据库,虽然非常方便,但目前使用ODBC只能访问关系型数据库,对于访问像电子邮件、文本文件、目录结构等数据源类型ODBC是无能为力的。,14.5.1 ADO简介,OLE DB(Object Linking
16、and Embedding Database,对象链接嵌入数据库)是微软为以统一方式访问不同类型的数据存储设计的一种应用程序接口,是一组用组件对象模型(COM)实现的接口。它能为不同类型的数据库提供了统一的访问方法,这些数据库可以是关系型的,也可以是非关系型的。由于OLE DB程序使用COM组件技术,这种技术能访问任何程序。因此OLE DB技术比传统的数据库访问技术更加优越。,14.5.1 ADO简介,ActiveX Data Objects(ADO)是微软提供的一种数据访问技术。它被设计用来同新的数据访问层OLE DB Provider一起协同工作,以提供通用数据访问(Universal D
17、ata Access)。它继承了OLE DB技术的所有优点,并且ADO对OLE DB的接口作了封装,使程序开发更加方便。ADO是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法之一,它是一种功能强大的数据访问编程模式。ADO使开发者能够编写通过OLE DB提供者对在数据库服务器中的数据进行访问和操作的应用程序。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。,14.5.1 ADO简介,ADO(ActiveX Data Object)和OLE DB可以看成是对应于不同层次的应用开发。OLE DB是系统级的编程接口,使用它可以对系统底层进行操作。ADO是应用层的编程接口,它适
18、合于各种客户机/服务器系统和基于Web的应用。在这儿我们就不介绍使用OLE DB技术访问数据库了。如果读者对OLE DB操作数据库感兴趣,可以自己查阅相关资料获得。,14.5.2 ADO对象模型,ADO对象模型定义了一组可以编程的对象,其中包含了7个对象:Connection对象、Command对象、Parameter对象、Recordset对象、Field对象、Property对象、Error对象。此外,ADO对象模型中还包含了4个集合:Fields集合、Properties集合、Errors集合、Parameters集合。,14.5.2 ADO对象模型,它们之间的关系如下图所示。其中每个C
19、onnection、Command、Recordset和Field对象都有Properties集合。,14.5.2 ADO对象模型,1.Connection对象Connection对象用来与数据源建立连接、管理事务处理等。它保存诸如指针类型,连接字符串,查询超时,连接超时和默认数据库等连接信息。任何对数据库的操作都需要一个连接对象,只不过有时显式地创建,有时隐式地创建。在大多数应用程序中把一个Connection对象保存为全局级或模块级,这样就不用每次执行一个操作时都去创建这个对象。,14.5.2 ADO对象模型,2.Command对象Command对象用于执行数据库操作命令。例如,执行创建、
20、添加、取回、删除或更新记录等操作。这些命令并不只限于查询串,而是依赖于数据库的OLE DB供应者。使用Command对象查询数据库并返回Recordset对象,以便获取数据,或进行更新、删除等操作。,14.5.2 ADO对象模型,3.Recordset对象Recordset对象用来操作返回的结果集,一个Recordset对象由记录和列(字段)组成。几乎所有对数据的操作都可以在Recordset对象中完成,例如可以在结果集中添加、删除、修改和移动记录。,14.5.2 ADO对象模型,4.Parameter对象Parameter对象可提供有关被用于存储过程或查询中的一个单个参数的信息。Parame
21、ter对象在其被创建时被添加到Parameters集合。Parameters集合与一个具体的Command对象相关联,Command对象使用此集合在存储过程和查询内外传递参数。,14.5.2 ADO对象模型,5.Field对象Field对象代表使用普通数据类型的数据的列。Recordset对象含有由Field对象组成的Fields集合,每个Field对象对应于Recordset中的一列。使用Field对象的Value属性可以设置或返回当前记录的数据。Field对象不需要显式地被创建。,14.5.2 ADO对象模型,6.Property对象Property对象代表由提供者定义的ADO对象的动态特
22、征。在连接对象、命令对象、记录集对象和域对象中都包括属性集合,此集合用于保存与这对象有关的各个属性对象。属性对象用于表示各个选项设置和其他没有被对象的固有属性处理的ADO对象的特性。,14.5.2 ADO对象模型,7.Error对象Error对象包含与单个操作(涉及提供者)有关的数据访问错误的详细信息。任何涉及ADO对象的操作都会生成一个或多个提供者错误。每个错误出现时,一个或多个Error对象将被放到Connection对象的Errors集合中。当另一个ADO操作产生错误时,Errors集合将被清空,并在其中放入新的Error对象集。每个Error对象都代表特定的提供者错误,而不是ADO错误
23、;ADO错误在运行时是使用异常处理机制来处理。,14.5.3 ADO编程的方法,使用ADO技术开发数据库应用程序有两种方法。在应用程序中使用ActiveX控件,这种方法可以最大限度的简化应用程序对数据库的访问,但这种方法的效率比较低,开发者对程序的控制相对比较弱,所以不能完全发挥ADO访问数据库的优点。使用Visual C+中为开发ADO应用程序提供的动态链接库,这种方法效率比较高,而且可以灵活地控制应用程序,缺点是该方法使用起来比较复杂。虽然使用ADO控件可以开发简单的数据库应用程序,但这种方法增加了很多不必要的开销,而且支持数据绑定的控件数量很少,这些都限制了此技术的使用。所以我们只介绍第
24、二种方法。,14.5.3 ADO编程的方法,在VC+中使用ADO开发数据库应用程序可以简化为以下四个步骤:(1)引入ADO库文件。(2)初始化OLE/COM库。(3)利用Connection对象连接数据库(_ConnectionPtr m_pConnection)。(4)利用建立好的连接,通过Connection、Command对象执行SQL命令,或者利用Recordset对象取得结果集进行查询和处理。下面,我们详细介绍ADO编程方法以及其中的一些重要的知识点。,14.5.4 引入ADO库文件,与其他面向对象的访问数据库的技术相比,MFC并没有提供对ADO的封装类,能够支持ADO编程的是ADO
25、的COM动态链接库文件msado*.dll(*代表库的版本,例如msado15.dll)。msado*.dll文件一般位于系统盘的Program FilesCommon FilesSystemado目录下,根据操作系统的不同,该文件可能为msado1.dll、msado15.dll或msado2.dll。在编写ADO应用程序时需要在项目中引入该文件。我们通过预编译指令#import在来完成。,14.5.5 初始化OLE/COM库环境,由于ADO库是一组COM动态库,所以应用程序在调用ADO前,必须初始化OLE/COM库环境。在编写MFC应用程序时,通常的方法是在应用程序主类的InitInsta
26、nce()或OnInitDialog()成员函数中完成OLE/COM库环境的初始化。,14.5.6 ADO智能指针,在msado.tlh中定义了几个指针类型,包括连接对象指针_ConnectionPtr、命令对象指针_Command、记录集对象指针_Recordset。这些类型的定义如下:_COM_SMARTPTR_TYPEDEF(_Connection,_uuidof(_Connection);_COM_SMARTPTR_TYPEDEF(_Command,_uuidof(_Command);_COM_SMARTPTR_TYPEDEF(_Recordset,_uuidof(_Recordset
27、);,14.5.7 连接数据库,在进行数据库编程时,通常需要先建立与数据库之间的连接。在ADO中,不需要显式地创建和打开一个专门的连接。可以在创建其他对象时,同时隐式的建立连接。例如,可以直接创建RecordSet对象,在创建的同时建立与数据库的连接。但是,如果需要连接对象来进行事物操作或使用多个记录集和命令对象,就需要显式地创建数据库连接。,14.5.8 打开记录集,建立与数据库连接之后,要访问和操作数据库数据,通常使用记录集对象来实现。首先,创建一个记录集对象指针,且调用指针的CreateInstance()函数创建记录集对象;然后,调用记录集的Open()函数,用它来执行一条SQL命令,
28、并将数据库的返回结果放置在记录集中。,14.5.8 打开记录集,记录集Open()函数的原型声明如下所示。,14.5.9 在记录集中滚动,通过上面方法得到记录集后,要从各条记录中读取数据,必须在记录集中移动光标,使光标移动到要访问的行。记录集对象提供了5个函数来定位当前记录集指针,各函数的含义如下所示。Move(n):实现将记录集指针移动到从当前记录算起的第n个记录。MoveNext():实现将记录集指针移动到下一条记录。MovePrevious():实现将记录集指针移动到上一条记录。MoveFirst():实现将记录集指针移动到下第一条记录。MoveLast():实现将记录集指针移动到下最后
29、一条记录。,14.5.10 添加数据到记录集,当需要在数据库中添加一条记录时,可以调用AddNew()函数来完成。调用AddNew()后,通常还需要调用Update()函数完成更新操作。,14.6 ADO编程实例,这一节,我们利用ADO编写一个操作Access数据库的应用程序,实现和14.4节ODBC数据库程序一样的功能。,14.7 小结,本章首先介绍了数据库系统的概述和SQL语言,然后又介绍了VC+环境下开发ODBC和ADO数据库程序。本章中所列举的两个例子虽然简单,但是浓缩了数据库的核心操作。本章的重点是熟悉关系数据库模型和SQL语言的基本语句,以及利用ODBC和ADO来进行数据库编程。难点是熟练运用ODBC和ADO中的方法。如果读者对前面的知识点感觉晦涩难懂,可以先敲一下我们的两个实例。,