250 likes | 406 Views
第五讲 数据库编程 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 对数据库编程的支持及相应的
E N D
第五讲 数据库编程 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 数据库及数据库管理系统 • 数据库:数据的集合,由一个或多个表组成.每个表中 • 存储了对一类对象的数据描述.表的每一列描述了对象 • 的一个属性,而每一行则是对一个对象的具体描述.一行 • 称为一个绿录,一列称为一个字段.如果一个库中只有一 • 个表,称该库为简单数据库,若由多个相关的表组成, 则 • 称为关系数据库. • 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工程软件开发中有关数据库编程的几个关键概念 • 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类简介 • Cdatabase别类:通过它可以连接,操作和作用数据源.在应用程序中可以同时使用一个或多个Cdatabase对象. • 注:在使用DAO类时可使用类:Cdaodatabase.
使用过程: • A) 先构造一个Cdatabase对象并调用它的OPENEX成员 • 函数. • B) 再构造Crecordset对象操纵连接的数据源时,向 • Cdatabase对象传递记录集构造程序指针. • 完成使用时调用CLOSE成员函数并销毁Cdatabase • 对象,关闭以前没有关闭的任何记录集. • 使用前要包含头文件:#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 数据成员有: 成员函数主要有: 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环境. • 配置ODBC环境:有三种类型的数据源: • (1)用户数据源:本地用户自创建的,只供创建者使用. • (2)系统数据源:属于系统的数据源,只有访问权限的用 • 户方可使用.
(3)文件数据源:将数据源指定到文件,任何已正确安装驱(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类;
都支持对各种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类 • CDaoDatabase类:主要成员函数及操作详见 • P120-121表5-2 • 2. CDaoRecordset类.对象有三种类型: • 表型记录集:表示一个基本表. • 动态集型记录:是一个查询的结果,包含可更新记录. • 快照型记录集:是一组记录的一个静态拷贝,可查但 • 不可更新. • *部分数据成员如下: • 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集合中某个错误的错误代码.