2014/10/24

60
22/7/3 22/7/3 22/7/3 ADO 访访访访访 Version1.0 2010 年 5 年

Upload: kellan

Post on 05-Jan-2016

42 views

Category:

Documents


7 download

DESCRIPTION

ADO 访问数据库. Version1.0. 2010 年 5 月. 2014/10/24. 课程介绍 软件项目计划 制作项目计划 几点建议 参考资料. Overview. 课程目标 预备知识 目标听众 日程表 词汇表. 课程介绍. 理解 ADO 的结构 全面理解 Connection 、 Command 、 Recordset 对象及其成员变量 掌握用 ADO 进行数据库应用程序设计. 课程目标. VC++ 的基本知识 数据库 SqlServer 的基本知识. 预备知识. 项目经理 软件开发人员 其他人员. 目标听众. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 2014/10/24

23/4/20 23/4/2023/4/20

ADO 访问数据库Version1.0

2010年 5月

Page 2: 2014/10/24

23/4/20 2

Overview

课程介绍 软件项目计划 制作项目计划 几点建议 参考资料

Page 3: 2014/10/24

23/4/20 3

课程介绍

课程目标 预备知识 目标听众 日程表 词汇表

Page 4: 2014/10/24

23/4/20 4

课程目标

理解 ADO 的结构 全面理解

Connection 、 Command 、 Recordset对象及其成员变量

掌握用 ADO 进行数据库应用程序设计

Page 5: 2014/10/24

23/4/20 5

VC++ 的基本知识 数据库 SqlServer 的基本知识

预备知识

Page 6: 2014/10/24

23/4/20 6

项目经理 软件开发人员 其他人员

目标听众

Page 7: 2014/10/24

23/4/20 7

共计: 0.5 天 详细安排

<0:05> 课程介绍 <0:15> 软件计划<0:35> 制作软件计划<0:10> 建议<0:05> 问题& 反馈

Total: <1:10> hours

日程表

Page 8: 2014/10/24

23/4/20 8

ADO- ActiveX Data Object

词汇表

Page 9: 2014/10/24

23/4/20 9

ODBC(Open Database Connectivity) 开放数据库互连。 ODBC 是上个世纪八十年代末九十年代

初出现的技术,它为编写关系数据库的客户软件提供了一种统一的接口。 ODBC 提供一个单一的 API ,可用于处理不同数据库的客户应用程序。使用 ODBC API 的应用程序可以与任何具有 ODBC 驱动程序的关系数据库进行通信。

DAO(Data Access Object)

数据访问对象。 DAO 就是一组 Microsoft Access/Jet 数据库引擎的 COM 自动化接口。 DAO 不像 ODBC 那样是面向 C/C++ 程序员的,它是微软提供给 Visual Basic 开发人员的一种简单的数据访问方法,用于操纵 Access 数据库。

数据库访问技术

Page 10: 2014/10/24

23/4/20 10

RDO(Remote Data Object) ,远程数据对象。 由于 RDO 直接调用 ODBC API( 而不是像 DAO 那样通过

Jet 引擎 ) ,所以,可以为使用关系数据库的应用程序提供更好的性能。

OLE DB ,对象链接与嵌入数据库。 OLE DB 在两个方面对 ODBC 进行了扩展。首先, OLE

DB 提供了一个数据库编程的 COM 接口;第二, OLE DB 提供了一个可用于关系型和非关系型数据源的接口。 OLE DB 的两个基本结构是 OLE DB 提供程序 (Provider)和 OLE DB 用户程序 (Consumer), 它只支持 C/c++

数据库访问技术

Page 11: 2014/10/24

23/4/20 11

ADO(ActiveX Data Object) ActiveX 数据对象,它建立在 OLE DB 之上。 ADO 是一

个 OLE DB 用户程序。使用 ADO 的应用程序都要间接地使用 OLE DB 。 ADO 简化了 OLE DB ,提供了对自动化的支持,使得像 VBScript 这样的脚本语言也能够使用 ADO 访问数据库。

数据库访问技术

Page 12: 2014/10/24

23/4/20 12

OLE DB体系架构

ADO

使用 ADO 的客户程序

使用 OLE DB 访问数据库的程序

ODBC

OLE DB 用户程序

ODBC数据库

ODBC数据库

电子表格 电子邮件 其它非关系型存储

OLE DB 提供程序

Page 13: 2014/10/24

23/4/20 13

ADO 特点 1. 易于使用。 ADO 是高层数据库访问技术,

相对于 ODBC 来说,具有面向对象的特点,在 ADO 的对象结构中,对象与对象的层次关系不是非常明显。这样会给编写数据库程序带来很多便利。例如:在应用程序中我们要使用记录集对象,我们不一定要先建立连接,会话对象,如果需要就可以直接构造记录集对象。

总之,不用关心对象的构造顺序和构造层次。

ADO技术

Page 14: 2014/10/24

23/4/20 14

2. 可以访问多种数据源。与 OLEDB 一样, ADO 也几乎可以访问所有关系数据源和非关系数据源,这样的应用程序具有很好的通用性和灵活性。

3. 访问数据源效率高。因为 ADO 是以 OLEDB 技术为基础的,所以它继承了 OLEDB 访问数据源的高效性。

4. 方便的 WEB 应用。 ADO 可以 ActiveX 控件的形式出现,这可以大大方便 WEB 应用程序的编制。

5. 技术编程接口丰富。如包括 VC++ , VB , VJ++ 以及 VBScript 和 javaScript 等脚本语言。

ADO技术

Page 15: 2014/10/24

ADO应用结构 ADO 应用结构

23/4/20 15

使用使用 ADOADO的应用的应用

OLE DBOLE DB

使用程序使用程序

ADOADO

使用使用 ADOADO的应用的应用

OLE OLE DBDB

SQLOLEDB.DLLSQLOLEDB.DLL

MSJTCA35.DLLMSJTCA35.DLL

MSDASQL.DLLMSDASQL.DLL MDB filesMDB files

MDB filesMDB files

SQL DBSQL DB

OLE 的接口分别被 OLEDB 数据提供程序,服务提供程序和数据使用程序使用,而 ADO 所提供的对象则只能被数据应用程序使用,并且 ADO 对象使用了 OLEDB 服务提供程序和 OLEDB 数据提供程序所提供的接口和服务。总之, ADO 提供的对象用于实现 OLEDB 的数据应用程序。

Page 16: 2014/10/24

23/4/20 16

ADO对象 ADO 对象 ADO模型包括了下列对象:连接对象,命令对象,记录集对象,字段对象,参数对象和错误对象以及对象集合和属性等。

1. 连接对象( Connection):用于表示于数据源的连接,以及处理一些命令和事务,通过连接可以从应用程序访问数据源,连接是交换数据所必须的环境。

2.命令( Command)通过已建立的连接发出的“命令”可以某种方式来操作数据源。命令可以在数据源中添加,删除或更新数据或检索数据。

3. 记录集( Recordset)用于处理数据源的表格集,如获取或修改数据等。

Page 17: 2014/10/24

23/4/20 17

ADO对象 4.字段( Field)用于表示记录集中的列信息,包括列值等信息。每一个字段列都包含有名称,数据类型和值的属性,正是在该值中包含了来自数据源的真实数据。在需要修改数据源中的数据,可以在记录集中修改 Field 对象的值,对记录集的更改最终被传输给数据源。

5. 参数( Parameter)用于对传递给数据源的命令赋参数值等。 通常,命令需要的变量部分即“参数”可以在命令发布之前进

行更改,例如,可重复发出相同的命令,但每一次均可更改指定的检索信息。

6.错误对象( Error)用于获取所产生错误的详细信息。错误可以在应用程序中发送,通常是由于无法建立连接,执行命令或对某些状态的对象进行操作。

Page 18: 2014/10/24

23/4/20 18

ADO对象 7.属性( Property):每个 ADO 对象都有一组唯一的“属

性”来描述或控制对象的行为。属性有内置和动态两种类型,内置属性是 ADO 对象的一部分并且随时可用,动态属性则由特别的数据提供者添加到 ADO 对象的属性集合中,仅在提供者被使用时才能存在。

8. 集合: ADO 提供“集合”,这是一种可方便地包含其他特殊类型对象的对象类型,使用集合方法可按名称或序号对集合中的对象进行检索。

ADO 提供四种类型的集合: Connection 对象具有 Errors 集合。

Command 对象具有 Praameters 集合,包含应用玉Command 对象的所有 Parameter 对象。 Recordset 对象具有 Field 集合。

此外 Connection , Command , Recordset 和 Field 对象都具有属性集合

Page 19: 2014/10/24

23/4/20 19

ADO对象

CommandCommand (( optionaoptionall ))

ParameterParameter (( optionaoptionall ))

RecordsetRecordset

FieldField

ConnectionConnection

ErrorError (( optionaoptionall ))

ParametersCollection

Execute

Execute

ActiveConnection

Error Collection(optional)

Source

Fields Collection

Page 20: 2014/10/24

23/4/20 20

ADO接口简介 

ADO 库包含三个基本接口 :_ConnectionPtr 接口_CommandPtr 接口_RecordsetPtr 接口

Page 21: 2014/10/24

23/4/20 21

_ConnectionPtr接口

返回一个记录集或一个空指针。 通常使用它来创建一个数据连接或执行一条

不返回任何结果的 SQL 语句,如一个存储过程。

一般不使用 _ConnectionPtr 接口返回一个记录集。

使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。

Page 22: 2014/10/24

23/4/20 22

_CommandPtr接口

_CommandPtr 接口返回一个记录集。 它提供了一种简单的方法来执行返回记录集的存储过程

和 SQL 语句。 在使用时,连接数据库时有两种方法 在使用时可以利用全局全局 _connectionPtr 接口,也

可以在 _CommandPtr 接口里直接使用连接串。如果频繁执行数据库操作最好使用 _ConnectionPtr 接口连接数据库。

Page 23: 2014/10/24

23/4/20 23

_RecordsetPtr 接口 _RecordsetPtr 是一个记录集对象。与以上两种对象相比,

它对记录集提供了更多的控制功能,如记录锁定,游标控制等 。

同 _CommandPtr 接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr 的 connection 成员变量,让它自己创建数据连接。如果频繁使用时最好还是用已经创建了数据连接的全局 _ConnectionPtr 接口

Page 24: 2014/10/24

23/4/20 24

使用 ADO的基本流程

初始化 COM 库,引入 ADO 库定义文件 用 Connection 对象连接数据库 利用建立好的连接,通过

Connection 、 Command 对象执行 SQL命令,或利用 Recordset 对象取得结果记录集进行查询、处理。

使用完毕后关闭连接释放对象。

Page 25: 2014/10/24

23/4/20 25

我们可以使用 AfxOleInit() 来初始化 COM 库这项工作通常在 CWinApp::InitInstance() 的重载函数中完成,请看如下代码 :

BOOL CADOTest1App::InitInstance() {

// 初始化 OLE/COM AfxOleInit();

......  }

COM库的初始化

Page 26: 2014/10/24

23/4/20 26

引入 ADO类型库

用 #import指令引入 ADO类型库 我们在预编译文件 stdafx.h 中加入如下语句:

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 其最终作用同我们熟悉的 #include类似 ,编译的时候系统会为我们生成 msado15.tlh,ado15.tli 两个 C++头文件来定义 ADO 库。

Page 27: 2014/10/24

23/4/20 27

创建 Connection对象

创建 Connection 对象并连接数据库 在 CWinApp 中添加一个指向 Connection 对象的指针 :

_ConnectionPtr m_pConnection=null; 初始化定义的指针并连接数据库: HRESULT hr; try{ hr=m_pConnection.CreateInstance(__uuidof(Connection)); TESTHR(hr); }

Page 28: 2014/10/24

23/4/20 28

打开连接 创建了连接对象后,需要打开和数据源的连接

HRESULT Open (_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )

ConnectionString : 可选参数 ,为连接字串 , UserID  :可选参数,访问数据源的用户名 Password  :可选参数,用户访问数据源的口令Options  :可选参数,次参数是 ConnectionOptionalEnum类型的值,用来指明连接是同步还是异步连接。

Connectionstring 连接字符串是由一系列关键字和值组成: DataSource :指定所使用的数据源名。 Provider :用于指定所使用的数据提供程序。 User :用户名 PassWord :用户口令 FileName :给出保存连接信息的提供程序说明文件名称。

Page 29: 2014/10/24

23/4/20 29

打开连接 设置连接超时属性 : 缺省情况下 ADO 在应用程序和数据源之间建立连接的等待时间

为 15秒。如果我们要求在建立连接时修改超时连接值,则需要在 Open()函数调用前设置 Connection 对象的ConnectionTimeout属性,单位秒。

注意: ConnectionTimeout属性和 CommandTimeout属性的不

同,前者为建立连接的超时值,后者为连接建立后对数据库操作的超时值。

Page 30: 2014/10/24

23/4/20 30

连接访问模式 连接访问模式: 通常我们需要通过应用程序限制用户对数据源的访问权限,这些可以通过调用 OPEN函数之前设置连接的 MODE属性来解决。

Mode值可以是下列值的组合:adModeUnknown: 没有确定模式

adModeRead:  只读权限 adModeWrite:  只写权限adModeReadWrite: 读写权限 adModeShareDenyRead: 阻止其它用户以读权限打开连接 adModeShareDenyWrite: 阻止其它用户以写权限打开连接 adModeShareExclusive: 阻止其它用户打开连接 adModeShareDenyNone: 阻止其他用户使用任何权限打开连接

Page 31: 2014/10/24

23/4/20 31

连接访问模式 例子: HRESULT hr; _ConnectinPrt p_conn; hr=p_conn.CreateInstance(“ADODB.Connection”); p_conn->ConnectinoTimeout=90; p_conn->Mode=adModeReadWrite|

adModeShareDenyNone; hr=p_conn->Open(“MytestDs”,”admin”,”1234”); 上面的程序中我们设定连接超时值为 90秒,该数据源访问权限为

只有用户 admin 可读写,对其他用户的任何连接请求都拒绝。

Page 32: 2014/10/24

23/4/20 32

关闭连接 关闭 当使用使用完数据库后,应该关闭连接,即调用

Connection 对象的 Clouse 方法, ADO 在关闭连接的同时,也关闭所有使用这个连接的 ADO 对象,例如记录集对象( RecordSet)和命令对象( Command)以释放资源。

if(p_conn->State){ p_conn->Close(); p_conn=null;} pRst->Close();

pConn->Close(); pCmd.Release(); pRst.Release(); pConn.Release(); 

Page 33: 2014/10/24

23/4/20 33

常用的数据库连接方法

通过 JET 数据库引擎对 ACCESS2000 数据库的连接 m_pConnection->Open("Provider= Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb",

"","",adModeUnknown);

通过 DSN 数据源对任何支持 ODBC 的数据库进行连接 :

m_pConnection->Open("Data Source=adotest; UID=sa;PWD=;","","",adModeUnknown);

//m_pConnection->Open("DSN=test;","","",0); // 连接叫作 test 的 ODBC 数据源

Page 34: 2014/10/24

23/4/20 34

不通过 DSN 对 SQL SERVER 数据库进行连接: m_pConnection->Open(

“driver={SQL Server};Server=.; DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown); 其中 Server 是 SQL 服务器的名称, DATABASE 是库的名称

常用的数据库连接方法

Page 35: 2014/10/24

23/4/20 35

执行 SQL命令

用 Connection 对象的 Execute 方法执行SQL命令 :

pRst=pConn->Execute("select * from authors",NULL,adCmdText);

Page 36: 2014/10/24

23/4/20 36

执行 SQL命令

利用 Command 对象,执行 SQL命令 _CommandPtr pCmd(__uuidof(Command));

pCmd->ActiveConnection( _variant_t((IDispatch*)pConn));

pCmd->CommandText="select * from authors";

pRst=pCmd->Execute(NULL,NULL,adCmdText); 调用存储过程 pcom->ActiveConnection=pconn; pcom->commandtext=“demo”; pcom->Execute(Null,null,adCmdStoreProc);

Page 37: 2014/10/24

23/4/20 37

执行 SQL命令

直接用 Recordset 对象进行查询取得记录集

pRst->Open("select * from authors",_variant_t((IDispatch*)pConn),adOpenDynamic,adLockOptimistic,adCmdText);

Page 38: 2014/10/24

23/4/20 38

操作结果集

操作结果集 用 pRt->adoEOF 来判断数据库指针是否已经移到结果

集的末尾了。 用 pRt->BOF判断是否在第一条记录前面 例子: while(!pRt->adoEOF){ var=pRt->GetCollect(“Name”); if(var.vt!=VT_NULL) strName=(LPCSTR)_bstr_t(var); var=pRt->GetCollect(“Age”);

if(var.vt!=VT_NULL)strAge=(LPCSTR)_bstr_t(var);

Page 39: 2014/10/24

23/4/20 39

操作结果集 pRt->MoveNext();} 取得一个字段的值的两种方法: 1. pRt->GetCollect(“Name”);或者 pRt-

>GetCollect(_variant_t(Long(0)); 2. pRt->GetCollect(“Column_name”);或者 pRt-

>GetCollect ( long(index));

利用结果集进行操作数据 1.添加 pRt->addNew();

pRt->PutCollect(); 给每个字段赋值 pRt->update();

Page 40: 2014/10/24

23/4/20 40

操作结果集 2.修改,删除 把记录指针移动到要删除的记录上,然后调用

Delete(adAffectCurrent) try{//假设删除第二天记录 pRt->MoveFirst(); pRt->Move(1);// 从 0 开始 pRt->Delete(adAffectCurrent); pRt->Update();

Page 41: 2014/10/24

23/4/20 41

操作结果集 用 _CommandPtr 和 _RecordSetPtr配合 pcmd.createInstance(_uuidof(command));

pcmd->ActiveConnection=pconn; pcmd->CommandText=“select * from demot”; pRt=pcmd->Execute(Null,Null,adCmdText); 其中 CommandText 是命令字符串,通常是 SQL命令 adCmdText :表明 CommandText 是文本命令 adCmdTable :表明 CommandText 是一个表名 adCodProc :表明 CommandText 是一个存储过程 adCmdUnKnow :未知

Page 42: 2014/10/24

23/4/20 42

_variant_t数据类型转换 _variant_t 1. 一般传递个 ADO 的对象的值都不是 MFC 直接支持的数据类型,

而要用 _variant_t转换一下。 2._variant_t var; _variant_t->long: (longt)var; _variant_t->Cstring: Cstring strval=(LPCSTR)_bstr_t(var); Cstring->_varint_t: _variant_t(strSql); 3.BSTR宽字符串与 Cstring转换 BSTR bstr; Cstring strsql;

Page 43: 2014/10/24

23/4/20 43

_variant_t数据类型转换 Cstring->BSTR: bstr=strsql.AllocSysString(); BSTR->Cstring: strSql=(LPCSTR)bstr; 4 _bstr_t 与 Cstring 相互转换 -bstr_t bstr; CString -> _bstr_t: bstr=(_bstr_t)strSql; _bstr_t->Cstring: strSql=(LPCSTR)bstr;

Page 44: 2014/10/24

23/4/20 44

事务处理 事务 在数据库中,事务可以把多个操作作为一个单一的,最基本的活动

来进行。 例如:同时更新几个表,除非在更新过程中所有操作都顺利完成,否则,如果其中一个更新失败,将会使数据库产生异常或者产生脏数据。通过事务处理就会避免这样的操作可能带来的不利影响。

开始事务处理,需要通过连接对象 Connection 的 BeginTrans()方法,之后就额可以对事务中的数据源进行任何改变,如果在更改的过程中一起顺利,并想保存对数据库所作的所有更改,那么调用连接对象的 CommitTrans() 方法提交事务,否则调用RollbackTrans()回滚事务,系统将恢复从 BeginTrans()开始后的任何改变

Page 45: 2014/10/24

23/4/20 45

事务处理 例子 try{ // 开始事务 pConn->BeginTrans(); // 更新数据 prs->updateBatch(); // 提交事务 pConn->CommitTrans() ; }catch(_com_error &e) { dump_com_error(e);} catch(ADODB.Error &e) { pConn->Rollback();

}

Page 46: 2014/10/24

23/4/20 46

SQL语言概述

SQL ( Structured Query Language )是关系型数据库的标准语言,是由国际标准组织提出的,各种关系型数据库都支持 SQL 指令, SQL Server在基本的 SQL基础上进行了扩充, SQL语句有如下的两大特点 :

( 1) SQL是一种类似于英语的语言,很容易理解和书写。( 2) SQL语言是非过程化的语言(第四代语言)。 SQL

语言包括 DDL( Data Definition Language:数据定义语言), DML( Data Manipulation Language:数据操作语言)和 DCL ( Data Control Language:数据控制语言)等等。

Page 47: 2014/10/24

23/4/20 47

SQL语句分类

SQL分类 描述

数据定义语言( DDL)

数据定义语言( DDL)用于定义、修改或者删除数据库对象,如 Create Table等

数据操纵语言( DQL)

数据查询语句( Data Query Language, DQL)用于对数据进行检索。如最常用的 Select语句

数据操纵语言( DML)

数据操纵语言( DML)用于访问、建立或者操纵在数据库中已经存在数据,如 Select、 Insert、 Update和 Delete等等。

事务控制语言( TCL)

事务控制语言( Transact Control Language)管理 DML语句所做的修改,是否保存修改或者放弃修改。如: Commit、 Rollback、 Savepoint、 Set Transaction等命令。

数据控制语言( DCL)

数据控制语言( DCL)管理对数据库内对象的访问权限和授予和回收,如 Grant、 Revoke等等。

Page 48: 2014/10/24

23/4/20 48

基本SQL语句

基本的 SQL语句包括 DQL和 DML。也就是对数据库最常用的四大基本操作:查询( Select )、插入( Insert )、更新(Update )和删除(Delete )。1. 基本句型一:(最简单的 SELECT语句)SELECT 字段名 FROM 数据表例 1. SELECT * FROM grade功能说明:将 grade表中的所有字段取出来。例 2. SELECT 学号 ,姓名 FROM grade功能说明:将 grade表中学号和姓名字段取出来。例 3. SELECT 学号 , 姓名 ,语文 +数学 +英语 as 总成绩 FROM grade

功能说明:将 grade表中的学号和姓名取出来,并将语文、数学和英语成绩相加产生虚拟的总成绩。

Page 49: 2014/10/24

23/4/20 49

基本句型二2. 基本句型二:(使用条件查询)SELECT 字段名 FROM数据表 WHERE 筛选条件测试句型如下。例 1. SELECT * FROM grade WHERE数学 >50功能说明:把所有数学成绩大于 50分的记录选出来。

例 2. SELECT * FROM grade WHERE数学 =300 or 语文=300功能说明:把数学成绩等于 300分或者语文成绩等于300分的人选出来。

例 3. Like子句基本格式一:“ _”匹配。功能说明:每个下划线匹配一个任意字符,注意只匹配一个字符。比如:姓名 like '_ 敏 ',匹配姓名以“敏”字结尾且字数等于二的所有数据记录,如:“张敏”。

Page 50: 2014/10/24

23/4/20 50

基本句型三

3. 基本句型三:(进行排序)

SELECT 字段名 FROM 数据表 ORDER BY 字段名测试句型如下。( 1) SELECT * FROM grade ORDER BY数学 注:从低到高排序功能说明:从 grade表中取出所有字段,并按数学成绩排序。( 2) SELECT * FROM grade ORDER BY数学 ,语文功能说明:从 grade表中取出所有字段,并按数学成绩排序,如果数学成绩

相同则按照语文成绩排序。( 3) SELECT * FROM grade ORDER BY数学 desc 注:从高到低排序功能说明:从 grade表中取出所有字段,并按数学成绩倒序。( 4)SELECT top 5 * FROM grade功能说明:从 grade表中取出前五条记录的所有字段。

Page 51: 2014/10/24

23/4/20 51

DML的基本格式

DML的基本格式

( 1) DELETE指令:删除数据记录。基本语法: DELETE FROM 数据表 WHERE 条件例: DELETE from grade WHERE数学 =0 功能说明:删除所有数学成绩为零的记录,如果没有WHERE子句,则删除

所有记录。( 2) UPDATE指令:更新数据记录。

基本语法: UPDATE 数据表 SET 字段值 =新值 WHERE条件例 1: UPDATE grade SET 数学 =数学 +10 说明:将 grade表中所有人

的成绩加 10分 例 2: UPDATE grade SET 数学 =100 WHERE 姓名 like '%敏%' 功能说明:将姓名中含有敏的人的数学成绩更新为 100分

( 3) INSERT INTO指令:添加数据记录。基本格式 1: INSERT INTO 数据表 VALUES (字段新值)基本格式 2: INSERT INTO 数据表(字段一,字段二,……) VALUES (字段新值)

Page 52: 2014/10/24

23/4/20 52

聚合函数

聚合函数在信息管理系统经常使用,功能是做一些基本的统计和计算。

聚合函数有 5个,分别是 SUM函数、 AVG函数、COUNT 函数、MAX函数和MIN函数。

Page 53: 2014/10/24

23/4/20 53

SUM 函数,功能是算出某个字段的总值。例 . SELECT SUM(数学 ) As Total FROM grade 功能说明:求出所有学生数学成绩总和,这个数值的列名为 Total。在 SQL 输入窗口中输入,

AVG函数,功能是算出某个字段的平均值。例 . SELECT AVG(数学 ) As Average FROM grade

COUNT 函数,功能是算出返回记录的行数。例 . SELECT COUNT(*) As Counts FROM grade功能说明:求出满足条件的记录总数。

Page 54: 2014/10/24

23/4/20 54

MAX函数,功能是算出某个字段的最大值例 . SELECT MAX(数学 ) As First FROM grade功能说明:求出所有学生数学成绩的最高分,这个数值

的列名为 First。

MIN函数,功能是算出某个字段的总值例 . SELECT MIN( 数学 ) As Last FROM grade功能说明:求出所有学生数学成绩的最低分,这个数值

的列名为 Last 。

Page 55: 2014/10/24

23/4/20 55

分组查询

计算所有男生的数学平均成绩,有两种方法 :( 1) SELECT 性别 , AVG(数学 ) as 平均分 FROM grade GROUP BY 性别 HAVING 性别 =' 男 '

( 2) SELECT 性别 , AVG(数学 ) as 平均分 FROM grade WHERE 性别 =' 男 ' GROUP BY 性别

Page 56: 2014/10/24

23/4/20 56

分组查询

在使用分组查询的时候,有 4点需要注意。( 1)WHERE子句必须放在 GROUP BY子句之前。( 2)HAVING子句中只能包含分组字段或者聚合函数。( 3) SELECT语句选择的列只能是分组字段或者聚合函数

( 4)HAVING必须放在 GROUP BY子句之后

Page 57: 2014/10/24

23/4/20 57

交叉查询

考虑 3个表:学生表( Student )、课程表(Course )和选课表(SC)表的关系如图所示。

其中:( 1)学生表中的 sno表示学生学号, sname表示学生姓名。

( 2)课程表中 cno表示课程的编号, cname表示课程的名称。

( 3)选课表中的 sno表示学生学号, cno表示课程编号

Page 58: 2014/10/24

23/4/20 58

查找选择课程为“软件工程”的所有同学姓名?可以利用如下的 SQL语句。

SELECT b.sname FROM sc a, student b, course cWHERE a.cno=c.cno AND a.sno=b.sno and c.cname='软件工程‘

其中“ sc a”表示给表 sc 起个别名为 a,同样“ student b”是给 student表起个别名b。该查询实现了三个表之间的交叉查询。

Page 59: 2014/10/24

23/4/20 59

小结

本章介绍了框架类中 ADO的结构,理解 ADO的组成以及 3 种数据库访问方式。

重点掌握 SQL 语句的分类以及使用; Connection 对 象 、 如 何 使 用 Command 对象、 RecordsetRecordset 对象对象执行各种 SQL语句。

Page 60: 2014/10/24

23/4/20 60

Question?

THANK YOU