第12章 数据库应用程序开发

更新时间:2023-08-25 02:34:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第12章 数据库应用程序开发 重点 1.数据库系统和ODBC 2.CRecordSet的应用 3.示例系统中数据库操作类的设计

2013年9月

嘉兴学院计算机软件与理论研究室

共10页第1页

数据库应用程序是在数据库管理系统(DBMS)的支持下对数据库中的数据进 行加工、处理的程序,MFC提供了两种支持:ODBC和DAO。

12.1

数据库系统的基本概念

数据库系统由数据库、数据库管理系统和数据库应用系 统3部分组成,如右图: 数据库是数据的集合,由一个或多个表组成,一般将表 中的一行称作记录(record)或行(row),将表的列称作字 段(field)或列(column);

数据库系统的组成

数据库管理系统是一套程序,用来定义、管理和处理数据库与应用程序之间的联系, 例如,FoxPro、Access等; 不同的数据库在实现它的数据库管理系统时都有一些不同的特性,因而使得用某个数 据库管理系统开发的数据库应用系统无法在其他数据库管理系统上使用; 为了使一个数据库应用系统能够适用于所有的数据库管理系统,人们在数据库应用系 统和数据库管理系统之间增加了一个符合某种规范的标准接口,从而使得按照标准接 口设计的数据库应用系统可以访问所有支持标准接口的数据库管理系统。常用的标准 接口有ODBC、DAO、JDBC等,他们之间的关系如图所示: SQL(Structured Query Language,结构化查询语言)最早由IBM提出,是专门用来处 理关系数据库的基于文本的语言。SQL向数据库提供了完善而一致的接口,它不是独立 的计算机语言,需要DBMS的支持才能执行。SQL是一种标准的数据库语言,目前大多数 DBMS都支持它。嘉兴学院计算机软件与理论研究室 共10页第2页

2013年9月

12.2 ODBC基本概念 ODBC是微软公司开放服务结构中有关数据库的一个组成部分,它建立了 一组规范,并提供了一组对数据库访问的标准API。这些API利用SQL来 完成大部分任务,ODBC本身也提供了对SQL语言的支持,用户可以直接 将SQL语句送给ODBC; 基于ODBC的应用程序对数据库的操作不依赖于任何DBMS,不直接与DBMS 打交道,所有的数据库操作由对应DBMS的ODBC驱动程序完成,一个完整 的ODBC由下列几个部件组成;– 应用程序: – ODBC管理器:管理安装的ODBC驱动程序和管理数据源; – 驱动程序管理器:包含在ODBC32.DLL中,任务是管理ODBC驱动程序; – ODBC API:给数据库应用程序提供访问数据库的接口函数; – ODBC驱动程序:一些DLL,提供了ODBC和数据库之间的接口; ODBC部件关系图 – 数据源:包含数据库位置和数据库类型的信息。

在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与 数据库交换信息

。驱动程序管理器负责将应用程序对ODBC API的调用传 递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过 驱动程序管理器返回给应用程序。2013年9月 嘉兴学院计算机软件与理论研究室 共10页第3页

12.3

MFC的ODBC类简介

MFC的ODBC类主要包括有以下几个:– CDatabase类:负责建立与数据源的连接; – CRecordset类: 该类的一个对象代表从数据源选择的一组记录 (记录集); – CRecordView类:提供了一个表单视图与某个记录集直接相连,利 用对话框数据交换机制(DDX)在记录集与表单视图的控件之间传输数 据; – CFieldExchange类:支持记录字段数据交换(DFX),即记录集字段数 据成员与相应的数据库表的字段之间的数据交换; – CDBException类:代表ODBC产生的异常。

概括地讲,CDatabase针对某个数据库,它负责连接数据源; CRecordset针对数据源中的记录集,它负责对记录的操作; CRecordView负责界面;CFieldExchange负责CRecordset与 数据源的数据交换。2013年9月 嘉兴学院计算机软件与理论研究室 共10页第4页

12.4

CDatabase类

先构造一个CDatabase对象,然后调用Open成员函数:virtual BOOL Open(LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = "ODBC;", BOOL bUseCursorLib = TRUE);throw (CDBException, CMemoryException);CDatabase m_db;//在文档类中嵌入一个CDatabase对象 lpszDSN必须为NULL,若两处均未提供数据源名,则会显示一个数据源对话 m_db.Open("Student Registration"); //连接到一个名为Student Registration的数据源 框,用户可以在该对话框中选择一个数据源; m_db.Open(NULL,FALSE,FALSE,"ODBC;DSN=Student Registration;UID = ZYF;PWD – 参数 bExclusive:说明是否独占数据源; = 1234"); //在连接数据源的同时指定了用户账号和口令 m_db.Open(NULL);// 将弹出一个数据源对话框 – 参数bReadOnly :True则对数据源的连接是只读的,否则为可读写的;

– lpszDSN:数据源名,也可以在lpszConnect参数中包括数据源名,此时

–void 参数 lpszConnect :指定了一个连接字符串。该串中可以包括数据源名、用 virtual Close();// 断开与数据库的连接, CDatabase的析构函数中同样会自动调用该 户账号和口令等信息,字符串中的ODBC表示要连接到一个ODBC数据源上; 函数 BOOL IsOpen() const;//返回True 则表明当前有一个连接 – 参数bUseCursorLib :若为 True,则会装载光标库,否则不装载。快照需要 const CString& GetConnect() const;//获取当前的连接字符串 光标库,动态集不需要光标库;

– 若连接成功,函数返回True,否则返回False,若函数内部出现错误,则会 产生一个异常。

一些其它的有用成员函数:2013年9月 嘉兴学院计算机软

件与理论研究室 共10页第5页

12.5

CRecordSet类

12.5.1 动态集、快照、光标和光标库 共享数据的一个主要问题就是如何协调各个用户对数据源的修改,在 MFC中这取决于用户采用哪种记录集来处理; 记录集主要分为快照(Snapshot)和动态集(Dynaset)两种:– 快照型记录集提供了对数据的静态视,当其他用户改变了记录时(包括修改、 添加和删除),快照中的记录不受影响; – 动态集提供了数据的动态视,当其他用户修改或删除了记录集中的记录时, 会在动态集中反映出来。

在记录集中滚动,需要有一个标志来指明滚动后的位置。ODBC驱动程序 会维护一个光标,用来跟踪记录集的当前记录; 光标库是处于ODBC驱动程序管理器和驱动程序之间的动态链接库。光标 库的主要功能是支持快照以及为底层驱动程序提供双向滚动能力。光标 库管理快照记录的缓冲区,该缓冲区反映本程序对记录的修改和删除, 但不反映其他用户对记录的改变,由此可见,快照实际上相当于当前的 光标库缓冲区; 与快照不同,动态集不用光标库维持的缓冲区来存放记录。2013年9月 嘉兴学院计算机软件与理论研究室 共10页第6页

12.5.2 SQL查询 记录集的建立实际上是一个查询过程,SQL的SELECT语句用来查询数据 源。在建立记录集时,CRecordset会根据参数构造一个SELECT语句来查 询数据源,并用查询的结果创建记录集,SELECT语句的句法如下:SELECT field-list FROM table-name [WHERE m_strFilter] [ORDER BY m_strSort]

如果列名或表名中包含有空格,则必须用方括号把该名称括起来;

12.5.3 记录集的建立和关闭 要建立记录集,首先要构造一个CRecordset派生类对象,然后调用Open 成员函数查询数据源中的记录来建立记录集CRecordset(CDatabase* pDatabase = NULL); virtual CString GetDefaultConnect(); virtual BOOL Open(UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none);throw(CDBException, CMemoryException); BOOL CanRestart() const;//若支持Requery则返回True BOOL IsOpen() const;//若记录集已建立则返回True2013年9月 嘉兴学院计算机软件与理论研究室 共10页第7页

12.5.4 滚动记录 CRecordset提供了以下所示几个成员函数用来在记录集中滚动:void MoveNext();//前进一个记录 void MovePrev();//后退一个记录 void MoveFirst();//滚动到记录集中的第一个记录 void MoveLast();//滚动到记录集中的最后一个记录 void SetAbsolutePosition(long nRows);//滚动到绝对位置 virtual void Move(long nRows, WORD wFetchType = SQL_FETCH_RELATIVE); BOOL IsEOF() const; BOOL IsBOF() const; long GetRecordCount( ) const;

12.5.5 修改、添加和删除记录1. 采用CDatabase成员函数 通过向CDatabase对象的Execut

eSQL成员函数传递SQL语句的方法达到修 改、添加和删除数据库数据的目的void ExecuteSQL(LPCSTR lpszSQL); throw(CDBException);2013年9月 嘉兴学院计算机软件与理论研究室 共10页第8页

2. 采用CRecordset成员函数 修改记录:– 调用Edit成员函数; – 设置域数据成员; – 调用Update完成编辑。

添加记录:– 调用AddNew成员函数; – 设置域数据成员; – 调用Update。

删除记录:– 调用Delete成员函数; – 滚动到另一个记录上以跳过删除记录。virtual void Edit();throw(CDBException, CMemoryException); virtual void AddNew();throw(CDBException); virtual void Delete();throw(CDBException); virtual BOOL Update();throw(CDBException); BOOL CanUpdate() const;//返回True表明记录是可以修改的 BOOL CanAppend() const;//返回True则表明可以添加记录2013年9月 嘉兴学院计算机软件与理论研究室 共10页第9页

12.6 参见实验。

示例系统中数据库操作类的设计

2013年9月

嘉兴学院计算机软件与理论研究室

共10页第10页

本文来源:https://www.bwwdw.com/article/kgli.html

Top