第九章 连接数据库
精讲
微机在商业上的应用主要在数据处理,要求能够快速方便地访问一个大型数据库中的记录, MFC提供了两种独立地面向用户的数据库访问系统,一种是ODBC(Open DataBase Connectivity,开放数据库连接),另一种是DAO(Data Access Objects,数据访问对象)。本章你将学会使用ODBC和DAO连接数据库,并能够简单地操作数据库数据。
9.1 MFC ODBC连接数据库
ODBC是微软公司支持开放数据库服务体系的重要组成部分,它定义了一组规范,提供了一组对数据库访问的标准API,这些API是建立在标准化版本SQL(Structed Query Language,结构化查询语言)基础上的。ODBC位于应用程序和具体的DBMS之间,目的是能够使应用程序端不依赖于任何DBMS,与不同数据库的操作由对应的DBMS的ODBC驱动程序完成。
9.1.1 ODBC的构成
ODBC的结构如图9-1所示。
图9-1 使用ODBC的层次图
ODBC层由三个部件构成:
1. ODBC管理器
ODBC管理器的主要任务是管理安装ODBC驱动程序,管理数据源。应用程序要访问数据库,首先必须在ODBC管理器中创建一个数据源。ODBC管理器根据数据源提供的数据库存储位置,类型及ODBC驱动程序信息,建立起ODBC与一个特定数据库之间的联系,接下来,程序中只需提供数据源名,ODBC就能连接相关的数据库。ODBC管理器位于系统控件面板中。
2. 驱动程序管理器
驱动器管理器位于ODBC32.DLL,是ODBC中最重要的部件,应用程序通过ODBC API执行数据库操作。其实ODBC API不能直接操作数据库,需要通过驱动管理器调用特定的数据库的驱动程序,驱动程序在执行完相应操作后,再将结果通过驱动程序管理器返回。驱动器管理器支持一个应用程序同时访问多个DBMS中的数据。
3. ODBC驱动程序
ODBC驱动程序以DLL文件形式出现,提供ODBC与数据库之间的接口。
9.1.2 MFC ODBC类
进行ODBC编程,有三个非常重要的元素:环境(Enviroment),连接(Connection)和语句(Statement),它们都是通过句柄来访问的。在MFC的类库中,CDatabase类封装了ODBC编程的连接句柄,CRecordset类封装了对ODBC编程的语句句柄,而环境句柄被保存在一个全局变量中,可以调用一个全局函数AfxGetHENV来获得当前被MFC使用的环境句柄。
此外CRecordView类负责记录集的用户界面,CFieldExchange负责CRedordset类与数据源的数据交换。
使用AppWizard生成应用程序框架过程中,只要选择了相应的数据库支持选项,你就能够很方便地获得一个数据库应用程序的框架。
1. CDatabase类
CDatabase类的主要功能是建立与ODBC数据源的连接,连接句柄放在其数据成员m_hdbc中,并提供一个成员函数GetConnect()用于获取连接字符串。要建立与数据源的连接,首先创建一个CDatabase对象,再调用CDatabase类的Open()函数创建连接。Open()函数的原型定义如下:
virtul BOOL Open(LPCTSTR lpszDSN,BOOL bExclusive=FALSE,
BOOL bReadOnly=FALSE,
LPCTSTR lpszConnect="ODBC;",BOOL bUseCursorLib=TRUE);
其中:
lpszDSN指定数据源名,若lpszDSN的值为NULL时,在程序执行时会弹出数据源对话框,供用户选择一个数据源。
lpszConnect指定一个连接字符串,连接字符串中通常包括数据源名、用户ID、口令等信息,与特定的DBMS相关。
例如:
CDatabase db;
db.Open(NULL,FALSE,FALSE,"ODBC;DSN=HotelInfo;UID=SYSTEM;PWD=123456");
从断开与一个数据源的连接,可以调用CDatabase类的成员函数Close()。
2. CRecordset类
CRecordset类对象表示从数据源中抽取出来的一组记录集。CRecordset类封装了大量操作数据库的函数,支持查询,存取,更新数据库操作。
记录集主要分为两种类型:
(1) 快照(Snapshot)记录集
快照记录集相当于数据库的一张静态视图,一旦从数据库抽取出来,当别的用户更新记录的操作是不会改变记录集,只有调用Requry()函数重新查询数据,才能反映数据的变化。自身用户的添加记录操作重要调用Requry()函数重新查询数据,但快照集能反应自身用户的删除和修改操作。
(2) 动态(Dynaset)记录集
动态(Dynaset)记录集与快照记录集恰恰相反,是数据库的动态视图。当别的用户更新记录时,动态记录集能即时反映所作的修改。在一些实时系统中必须采用动态记录集,如火车标联网购票系统。但别的用户添加记录,也需要调用Requry()函数重新查询数据后才能反映出来。
CRecordset有六个重要的数据成员如表9-1所示.。
表9-1 CRecordset 类的数据成员
数据成员 类型 说明 m_strFilter CString 筛选条件字符串 m_strSort CString 排序关键字字符串 m_pDatabase CDatabase类指针 指向CDatabasec对象的指针 m_hstmt HSTMT ODBC语句句柄 m_nField UINT 记录集中字段数据成员总数 m_nParams UINT 记录集中参数数据成员总数
CRecordset的主要成员函数如表9-2 所示:
表9-2 CRecordset类的成员函数
成员函数 类 型 Move 当前记录指针移动若干个位置 MoveFirst 当前记录指针移动到记录集第一条记录 MoveLast 当前记录指针移动到记录集最后一条记录 MoveNext 当前记录指针移动到记录集下一条记录 MovePrev 当前记录指针移动到记录集前一条记录 SetAbsolutePosition 当前记录指针移动到记录集特定一条记录 AddNew 添加一条新记录 Delete 删除一条记录 Edit 编辑一条记录 Update 更新记录 CancelUpdate 取消一条记录的更新操作 Requry 重新查询数据源 GetDefaultConnect 获得默认连接字符串 GetDefaultSQL 获得默认SQL语句 DoFieldExchange 记录集中字段数据成员与数据源中交换数据 GetRecordCount 获得记录集记录个数 IsEOF 判断当前记录指针是否在最后一个记录之后 IsBOF 判断当前记录指针是否在第一个记录之前 CanUpdate 判断记录集是否允许更新
3. CRecordView类
CRecordView类是CFormView的派生类,支持以控件视图来显示当前记录,并提供移动记录的默认菜单和工具栏,用户可以通过记录视图方便地浏览、修改、删除和添加记录。记录视图与对话框一样使用DDX数据交换机制在视图中的控件的记录集成员之间交换数据,只需使用ClassWizard将控件与记录集的字段数据成员一一绑定。
CRecordView的主要函数如表9-3所示:
表9-3 CRecordView类的主要成员函数
成员函数 类型 OnGetRecordset 获得指向记录集的指针 OnMove 当前记录指针移动时,OnMove()函数更新对当前记录所作的修改,这是将更新记录保存的方式。 IsOnFirstRecord 判断当前记录是否为记录集的第一条记录 IsOnLastRecord 判断当前记录是否为记录集的最后一条记录
4. CFieldExchange类
CFieldExchange类支持记录字段数据的自动交换,实现记录集中字段数据成员与相应的数据源中字段之间的数据交换,类似于对话框数据自动交换机制。
9.2数据库应用程序的实现
9.2.1 创建并注册数据源
在创建数据库应用程序之前,先要准备好数据源。下面我们假设数据库应用程序要连接的数据库hotel.mdb存放在C盘根目录下,该数据库下有一张TblCustomer的表,如图9-2所示:
图9-2 数据表"tblCustomer"
在Wi
上一篇:
JQQ即时通讯系统(毕业论文)
下一篇:
隐式链接DLLvc源程序