PowerPoint 演示文稿

第五讲 数据库编程
5.1 数据库编程的概述
5.1.1 数据库及数据库管理系统
5.1.2工程软件开发中有关数据库编程的几个关键概念
5.1.3 MFC的ODBC类简介
5.1.4 数据库的基本操作
5.2 ODBC
5.2.1 ODBC概述
5.2.2 ODBC的实现
5.3 DAO
5.3.1 DAO概述
5.3.2 DAO和ODBC的异同
5.3.3 MFC中的DAO类
5.4 VC软件平台中的数据库编程实例
5.1 数据库编程的概述
介绍ODBC, DAO, MFC对数据库编程的支持及相应的
MFC类的使用等情况.
5.1.1 数据库及数据库管理系统
1. 数据库:数据的集合,由一个或多个表组成.每个表中
存储了对一类对象的数据描述.表的每一列描述了对象
的一个属性,而每一行则是对一个对象的具体描述.一行
称为一个绿录,一列称为一个字段.如果一个库中只有一
个表,称该库为简单数据库,若由多个相关的表组成, 则
称为关系数据库.
2. DBMS:数据库管理系统,是一用来定义,管理和处理
数据库与应用程序之间的联系,例如:FoxPro, Access,
Sybase等都是DBMS.
3. SQL:结构化的查询语言(structured query language),
最早由IBM提出,是一种标准的数据库语言,大多数
DBMS都支持它.
4. RDBMS:关系数据库管理系统,根据定义 的关系来存
储,处理和管理数据库信息,主要有SQL server,Oracle,
Sybase,Foxbase,Foxpro,Access等.
5.1.2工程软件开发中有关数据库编程的几个关键概念
1. SQL:对具有关系模型的各种对象进行操作,包括语
句,数据库,表,列和行.有DDL,DCL,DML三种基本的语
句形式.
DDL: 数据定义语句,用于建立数据结构和生成对象;
DCL: 数据控制语句,用于设置和处理数据库对象的用
户优先权
DML:数据的处理,有增加,修改,删除和执行数据的查询.
例:CREATE 命令为DDL语句;
GRANT 命令为DCL语句;
SELECT 命令为DML语句.
2开放式数据库连接(ODBC):open database connectivity,
是一种用来在相关或不相关的数据库管理系统中存取
数据的标准应用程序接口(API).是微软开放服务结构中
的一部分,提供了一组对数据库访问的标准API,其利用
SQL来完成大部分任务.
优点:使用ODBC让应用程序的编写者避免了与数据源
相连的复杂性.由相应DBMS的ODBC驱动器完成.
如:SQL server,Oracle,Sybase,Foxbase,Foxpro,Access,
Paradox,excel等.
ODBC的组成:
ODBC管理器:管理安装的ODBC驱动程序和数据源.
应用程序.
驱动程序管理器:管理ODBC驱动程序.
ODBC API:接口.
ODBC驱动程序:提供ODBC和数据库之间的接口.
数据源.
注册
应用程序
ODBC, API
返回结果
启动
数据库
返回信息
驱动程序管理器
VC++支持哪些驱动程序?
打开
3. RFX:Record field exchange, 记录字段数据交换.它在用
户选择的记录集和后台数据源之间建立对应关系,用户
操作记录集来实现对数据源的操作.MFC提供了一系列
的RFX调用函数,可以实现记录集与数据源之间的双向
的数据交换.
RFX与记录集对象相联系,隐于后台;DDX在对话框
界面上实现的,与视图对象相联系,显示于前台.
5.1.3 MFC的ODBC类简介
1. Cdatabase别类:通过它可以连接,操作和作用数据源.
在应用程序中可以同时使用一个或多个Cdatabase对
象.
注:在使用DAO类时可使用类:Cdaodatabase.
使用过程:
A) 先构造一个Cdatabase对象并调用它的OPENEX成员
函数.
B) 再构造Crecordset对象操纵连接的数据源时,向
Cdatabase对象传递记录集构造程序指针.
C) 完成使用时调用CLOSE成员函数并销毁Cdatabase
对象,关闭以前没有关闭的任何记录集.
D) 使用前要包含头文件:#include<afxdb.h>
数据成员和成员函数如下:
(1) 数据成员: m_hdbc 类型为HDBC,是对数据源的
ODBC的连接句柄.
(2) 构造函数: Cdatabase()构造对象,须通过OPENEX或
OPEN初始化这个对象.
(3) 其它成员函数:
Open: virtual BOOL Open(LPCSTR lpszDSN, BOOL
bExclusive=FALSE,BOOL bReadOnly=FALSE,
LPCSTR lpszConnect=“ODBC;”,
BOOL buseCursorLib=TRUE);
OpenEx:建立到数据源的一个连接,打开一个新构造的
Cdatabase对象,并将它初始化.
Virtual BOOL OpenEx(LPCSTR lpszConnectString,
DWORD dwOption=0)
Close:关闭与某个数据源的连接.virtual void Close();
GetConnect: 返回连接字符串.
IsOpen: 用于检测Cdatabase与某个数据源相连.
Rollback:回滚当前事务期间所做变化,数据源返回到
BeginTrans调用时定义的以前状况.
ExecuteSQL: 直接执行一条SQL语句.
GetDatabaseName:返回当前使用的数据库名称.
CanUpdate:用于检测数据库是否可更新.
Cancel:取消正在进行的异步操作,或取消第二个线程.
CanTransact: 用于检测数据库是否允许事务处理操作.
SetLoginTimeout:设置数据源连接的超时秒数.
SetQueryTimeout:设置数据库查询操作超时秒数.
其它见课本.
第五讲 数据库编程
5.1 数据库编程的概述
5.1.1 数据库及数据库管理系统
5.1.2工程软件开发中有关数据库编程的几个关键概念
5.1.3 MFC的ODBC类简介
5.1.4 数据库的基本操作
5.2 ODBC
5.2.1 ODBC概述
5.2.2 ODBC的实现
5.3 DAO
5.3.1 DAO概述
5.3.2 DAO和ODBC的异同
5.3.3 MFC中的DAO类
5.4 VC软件平台中的数据库编程实例
2. Crecordset类: 代表某个数据源中选定记录的集合,用
于操作数据库中的记录,要使用该类应包含文件afxdb.h
数据成员有:
m_nFields
m_nparams
m_database
m_strFilter
m_strSort
当前记录集合中字段的数目
当前记录集合中参数的数目
指向一个Cdatabase对象的指针
某个SQL语句的WHERE参数
某个SQL语句的ORDER BY参数
成员函数主要有:
AddNew: 将一个新记录加到当前表中.
CanAppend:检测某个记录集是否可增加新记录.
Cancel:取消操作.
Canupdate:检测记录集是否能更新.BOOL Canupdate()
Close:void Close()
Delete:virtual void Delete();throw (CDBException)
DoFieldExchange:在字段和记录集合之间交换数据.
Edit:编辑当前记录
IsBOF:检测指针是否位于第一个记录的前面.
IsEOF:检测指针是否位于最后一个记录之后.
IsFieldNull:检测字段是否是NULL.
IsOpen:检测当前记录集合是否已经打开.
Move:移动记录指针
MoveFirst:将第一个记录作为当前记录.
MoveNext:将最后一个记录作为当前记录.
MovePrev:将上一个记录作为当前记录.
Open:打开指定的记录集合
Update: 在调用ADDNEW 或 EDIT 之后, 以便更新数据.
3. CRecordView类: 代表一个视图,用来显示控件中数据
库记录.有几个成员函数,isonfirstrecord,isonlastrecord,
Ongetrecordset, onmove等.
4.CFieldExchange类:用于支持记录字段交换(RFX)和批
量记录字段交换(BULKRFX).
5. CDBException类: 对象表示数据库类引起的异常条件.
包括两个公用数据成员m_nRetCode 和 m_strError.
5.1.4 数据库的基本操作:利用Cdatabase,Crecordset类的
成员函数来完成.设m_pset 为指向一个CDBset对象的指针.
(1)打开数据库.(详见P114)
(2)关闭数据库.Cdatabase * pDb; pDb->Close();
(3) 删除记录.m_pset->Delete(); if(!m_pset->IsEOF())
m_pset->MoveNext();else m_pset->MoveLast();
4 修改记录.
m_pset->Edit(); m_pset->m_type=“mytype”;
……..; m_pset->Update(); m_pset->Requery();
5. 添加记录.
m_pset->AddNew();
m_pset->SetFieldNull(&(m_pset->m_type),FALSE);
m_pset->m_type=“mytype”;
……..
m_pset->Update();
m_pset->Requery();
6.SQL语句的直接执行.
(程序段见P115)
5.2 ODBC
5.2.1 ODBC概述
1. 优点: (见P115-116)
2. ODBC通过使用驱动程序来提供数据库的独立性. 驱
动程序一般为DLL,通过调用动态链接上的驱动程序所
支持的函数来操作数据库.
5.2.2 ODBC的实现
一般过程为:配置ODBC环境,对数据库进行操作,释放
ODBC环境.
1. 配置ODBC环境:有三种类型的数据源:
(1)用户数据源:本地用户自创建的,只供创建者使用.
(2)系统数据源:属于系统的数据源,只有访问权限的用
户方可使用.
(3)文件数据源:将数据源指定到文件,任何已正确安装驱
动程序的用户都可以使用这种数据源.
2. 对数据库进行操作:
首先初始化ODBC并得到一个惟一代表ODBC线程使用
环境句柄henv, 然后应用程序从ODBC中得到数据连接
句柄hdbc, 最后应用程序就可以利用ODBC API对所连
数据库进行适当的操作.
3. 释放ODBC环境.
::SQLDisconnect(hdbc);
bIsConnected=FALSE;
4 .VC++中的ODBC编程
VC++的MFC基类库中定义了几个数据库类,主要有
Cdatabase类:提供了对数据源的连接.
Crecordset类:提供了从数据源中提取出的记录集.有两
种:动态集和快照集.动态与其它所作的修
改保持同步.
CrecordView类:提供记录集的视图形式.
具体操作见示例.(配置WIZAD向导.)
5.3 DAO
5.3.1 DAO概述
DAO:data access object , 即数据访问对象.DAO提供了一
个框架,用它编写代码可以创建和操作数据库,使用Jet数
据引擎来访问数据库,主要是为access和VB提供引擎.
同ODBC一样,DAO也提供一组API函数供调用.MFC也
提供了一组DAO类供使用.
5.3.2 DAO和ODBC的异同
1. 相同: 提供了相似功能的MFC类;
DAO
ODBC
CDaoDatabase
Cdatabase
CDaorecordset
Crecordset
CDaorecordview
Crecordview
CDaoException
CException
都支持对各种ODBC数据源的访问;
AppWizard和ClassWizard 对使用DAO和ODBC应用
程序提供了类似的支持.
2. 不同.
*在用ClassWizard 创建Cdaorecordset类的派生类时,
在数据库选择对话框中选择DAO,不是ODBC.
*记录集的默认类型不同.ODBC默认是快照,而DAO
默认的是动态集.
*参数化的方式不同:DAO记录集的m_strFilter,
m_strsort中的参数不是“?”,
而是一个有意义参数.
*处理异常方式不同.
*数据交换方式不同: DAO使用DFX,而不是RFX;
*DAO虽可访问ODBC数据源,但它可直接访问一些
基于Jet引擎的数据库,如 access, foxpro,
paradox, excel, lotusWK.
*DAO直接支持DDL的SQL语言, 而ODBC不支持,
其只有调用其API来完成类似的功能.
*DAO提供了一些新类:
CDaotableDef 类提供了表结构定义:成员函数有
Open, Creat ,Creatfield ,CreatIndex,
Append.
CDaoQueryDef 定义一个查询定义并能存入库中.
CDaoWorkspace 提供了数据工作区.
*DAO提供了对access库的强大的支持.
5.3.3 MFC中的DAO类
1. CDaoDatabase类:主要成员函数及操作详见
P120-121表5-2
2. CDaoRecordset类.对象有三种类型:
(1) 表型记录集:表示一个基本表.
(2) 动态集型记录:是一个查询的结果,包含可更新记录.
(3) 快照型记录集:是一组记录的一个静态拷贝,可查但
不可更新.
*部分数据成员如下:
m_pDAORecordset, m_nFields, m_nParams, m_pDatabase
m_strFilter, m_strSort.(作用详见P122)
*构造函数有:
CDaoRecordset: 构造一个CDaoRecordset对象.
Close:关闭记录集.
Open:从一个表,动态集或快照创建一个新的记录集.
*属性(21条,详见P123)
*记录集的更新操作:
AddNew: 增加一条新记录,以Update完成操作.
Delete:
Edit:以Update完成操作.
Update.
*记录集的导航操作:find , findfirst , findlast , findnext ,
Findprev, getabsoluteposition, move, movefirst, movelast
Movenext, moveprev, seek.
*可覆盖的函数:
DoFieldExchange:实现DAO记录字段双向交换.
GetDefaultDBName:返回数据源名字.
GetDefaultSQL:返回要执行的默认SQL字符串.
4. CDaoQueryDef 类:表示一个查询定义,封装了
QueryDef 对象,并把查询定义保存在库中以便于查询速
度提高.查询定义包括:选择,动作查询,交叉表,删除,更新,
添加,造表,数据定义,SQL直接查询和批量查询等.
(execute一般用于BULK操作.)
*成员有:m_pDatabase, m_pDaoQueryDef.
*构造函数:CdaoQueryDef, Create, Append , Open, Close.
*成员函数:(详见P125-126)
5. CDaoWorkspace类:可让一个用户管理从登录到离开
期间,指定的密码保护数据库会话的全过程.
(作用见P126)
6. CDaoException 类:基于DAO的数据库类产生的异常.
(1)数据成员:
m_scode 与错误相关的SCODE值.
m_nAfxDaoError 包含了MFC中DAO类的任何错误
的扩展代码.
m_pErrorInfro 指向一个对象的指针,该对象记录了
一个DAO错误对象信息.
(2)操作:
GetErrorCount 返回数据库引擎的Errors集合中的
错误代码.
GetErrorInfro 返回Errors集合中某个错误的错误代码.
5.4 VC软件平台中的数据库编程实例(见P127-142)