为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

连接数据库

2011-01-05 20页 doc 2MB 81阅读

用户头像

is_617120

暂无简介

举报
连接数据库第五章 图形和文本输出 第九章 连接数据库 精讲 微机在商业上的应用主要在数据处理,要求能够快速方便地访问一个大型数据库中的记录, MFC提供了两种独立地面向用户的数据库访问系统,一种是ODBC(Open DataBase Connectivity,开放数据库连接),另一种是DAO(Data Access Objects,数据访问对象)。本章你将学会使用ODBC和DAO连接数据库,并能够简单地操作数据库数据。 9.1 MFC ODBC连接数据库 ODBC是微软公司支持开放数据库服务体系的重要组成部分,它定义了一组规范,提供了一...
连接数据库
第五章 图形和文本输出 第九章 连接数据库 精讲 微机在商业上的应用主要在数据处理,要求能够快速方便地访问一个大型数据库中的, 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” 在Windows操作系统的控制面板中,可以找到数据源ODBC管理器的图标,如图9-3所示为windows XP homeEditon中的ODBC的图标,它的位置在控制面板中的管理工具文件夹。由于所要连接的数据库是由Microsoft ACCESS创建,要求ODBC管理器中安装有Microsoft ACCESS的ODBC驱动程序。一般,只需安装了Microsoft ACCESS软件,相应的ODBC驱动程序就已经默认安装了。 图9-3 ODBC图标 鼠标双击ODBC图标,弹出“ODBC数据源管理器”对话框,如图9-4所示。 图9-4  ODBC数据源管理器 在用户DSN、系统DSN、文件DSN标签页中都可以创建一个数据源,但所创建的数据源的应用范围是不同的: (1)​ 用户DSN: 用户数据源只对当前用户可见,而且只能用于当前机器上。 (2)​ 系统DSN:系统数据源对当前机器上的所有用户可见。 (3)​ 文件DSN:文件数据源可以由安装了相同驱动程序的用户共享。 可以根据所创建的数据源的不同的应用场合选择在不同的标签页下创建数据源,在本例中选择系统DSN。在标签页中的列表中显示的是在本机已创建的系统数据源的列表。 单击“Add”按钮,新建一个数据源,弹出“创建新数据源”对话框。如图9-5所示,在ODBC驱动程序列表中选择“Microsoft Access Driver(*.mdb)”。 图9-5 选择ODBC驱动程序类别 单击“Finish”按钮,弹出“ODBC Microsoft Access 安装”对话框,如图9-6所示。在数据源名文本框中填入:HotelInfo,单击“选择”按钮,弹出“选择数据库”对话框,如图9-7所示,选择数据库文件c:\hotel.mdb,连续单击“OK”按钮回到前一对话框。 图9-6 设置Microsoft Access数据源 图9-7 选择数据库 最后在系统DSN标签中可以看到创建的数据源HotelInfo出现在数据源列表中,如图9-8所示。 图9-8 创建好的系统数据源  9.2.2创建数据库应用框架 〖例9-1〗使用AppWizard可以方便地得到一个数据库应用程序的框架,创建一个MFC EXE应用程序Exam9_1,在向导的第2步中,选择单选项“Database view without file support”,如图9-9所示。 图9-9 设置数据库支持 单击“Data Source”按钮,弹出“Data Options”对话框,选择单选项ODBC,并在下拉框中选择事先建立好的数据源“HotelInfo”,如图9-10所示。 图9-10选择ODBC数据源 单击“OK”按钮,弹出“Select Database Tables”对话框,列表框中列出了HotelInfo数据库中所包含的表和查询,选择应用程序所操作的表tblCustomer,如图9-11所示。 图9-11 选择数据库表 单击“OK”按钮,结束数据源的设置工作,在图9-9中“Data Source”按钮的下方会出现数据源的选择信息。 单击“Finish”按钮,完成数据库应用程序框架的创建,编译运行这个程序,运行结果如图9-12所示。应用程序包含了数据库记录基本操作菜单和工具按钮,视图是一个对话框,可以添加控件。 图9-12 数据库应用程序框架运行效果 选择工作区的ClassView,展开类树,进一步观察AppWizard自动添加的与数据库支持有关的内容。 增加了一个CExam9_1Set类,该类代表从HotelInfo中选择的一组记录集。程序可以选择一个表作为一个记录集,本例选择了表tblCustomer中的记录构建记录集,也可以选择一个查询的结果集作为一个记录集。 如程序清单9-1所示。CExam9_1Set构造函数用于创建一个记录集对象,并把一个CDatabase对象的指针作为参数传递给构造函数,以便获得已由CDatabase对象建立起来的与数据源的连接。 CExam9_1Set类的成员函数GetDefaultConnect()用于获得定义了数据源类型和数据源名的连接字符串。GetDefaulltSQL()函数中定义了定义SQL语句的字符串,本例的SQL语句定义了查询一张表的完整记录。 CExam9_1Set类中定义了与数据源表的字段相对应的数据成员,成员函数DoFieldExchange()完成记录集上的字段数据成员与数据源上当前记录对应列之间数据的自动交换。   程序清单9-1:CExam9_1Set类 class CExam9_1Set : public CRecordset { public: CExam9_1Set(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CExam9_1Set) // Field/Param Data //{{AFX_FIELD(CExam9_1Set, CRecordset) long m_CustomerID; CString m_LastName; CString m_FirstName; CString m_HomeCountry; CString m_HomeState; CString m_PhoneNumber; CString m_Comments; //}}AFX_FIELD // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CExam9_1Set) public: virtual CString GetDefaultConnect(); // Default connection string virtual CString GetDefaultSQL(); // default SQL for Recordset virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support //}}AFX_VIRTUAL // Implementation #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif }; CExam9_1Set::CExam9_1Set(CDatabase* pdb) : CRecordset(pdb) { //{{AFX_FIELD_INIT(CExam9_1Set) m_CustomerID = 0; m_LastName = _T(""); m_FirstName = _T(""); m_HomeCountry = _T(""); m_HomeState = _T(""); m_PhoneNumber = _T(""); m_Comments = _T(""); m_nFields = 7; //}}AFX_FIELD_INIT m_nDefaultType = snapshot; } CString CExam9_1Set::GetDefaultConnect() { return _T("ODBC;DSN=HotelInfo"); } CString CExam9_1Set::GetDefaultSQL() { return _T("[tblCustomer]"); } void CExam9_1Set::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CExam9_1Set) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID); RFX_Text(pFX, _T("[LastName]"), m_LastName); RFX_Text(pFX, _T("[FirstName]"), m_FirstName); RFX_Text(pFX, _T("[HomeCountry]"), m_HomeCountry); RFX_Text(pFX, _T("[HomeState]"), m_HomeState); RFX_Text(pFX, _T("[PhoneNumber]"), m_PhoneNumber); RFX_Text(pFX, _T("[Comments]"), m_Comments); //}}AFX_FIELD_MAP } 视图类CExam9_1View 是CRecordView的派生类,CRecordView是记录视图,支持在控件中显示数据库记录。默认提供了移动记录功能的实现(第一个,上一个,下一个,最后一个)。定义了一个指向记录集的指针m_pSet。 CRecordView类是CFormView类的派生类,CFormView类的视图对应一个对话框资源,所以CRecordView类从基类中继承的成员函数中最重要的是DoDataExchange()函数和UpdateData()函数,DoDataExchange()函数实现记录集的字段与视图中控件之间的自动数据交换,UpdateData()函数实现记录集的字段与视图中控件之间实时交换。 9.2.3 记录操作界面 〖例9-2〗打开资源管理器的 Dialog文件夹,选择IDD_EXAM9_1_FORM,在对话框中按图9-13添加静态控件和编辑框控件,设置ID编辑框的属性为只读。 图9-13 记录操作界面 并按表9-4所示,修改编辑框控件的ID属性。 表9-4 记录操作界面控件属性 控件ID 控件类型 标题 静态文本控件 ID IDC_CustomerID 编辑框控件 静态文本控件 名 IDC_LastName 编辑框控件 静态文本控件 姓 IDC_FirstName 编辑框控件 静态文本控件 国家 IDC_HomeCountry 编辑框控件 静态文本控件 电话 IDC_PhoneCall 编辑框控件 静态文本控件 备注 IDC_Comments 编辑框控件 接下来,要将编辑框控件与一个记录集字段数据成员绑定,打开ClassWizard,选择MemberVariables标签页,为编辑框控件映射记录集字段数据成员,单击“Add Variable”,弹出“Add Member Variable”对话框,在下拉框中选择由m_pSet指针所指向的记录集字段数据成员。如图9-14所示,为控件IDC_Comments选择绑定的变量为m_pSet->m_Comments。设置完毕如图9-15所示。 图9-14 为视图控件绑定记录集字段数据成员 图9-15 所有控件ID与记录集的绑定 单击“OK”按钮,完成设置,重新运行程序,运行结果如图9-16所示。使用移动记录的四个工具按钮,前后浏览每一条记录,当移动到第一条记录时,“第一条”和“上一条”按钮变灰,当移动到最后一条记录时,“最后一条”和“下一条”按钮变灰。 在浏览记录的过程中,你可以修改各个编辑框中的内容,紧接着作一次移动记录操作,所作的修改就能被保存到数据库中。 图9-16 增加了浏览功能后的应用程序 9.2.4 更新记录 更新记录操作包括修改,添加和删除记录,CRecordSet类提供了AddNew()、Delete()、Edit()、Update()、CancelUpdate()、Requery()等成员函数用于更新记录。 AddNew()函数用于添加一个新的空记录,所有字段数据成员的值都为NULL。Delete()函数用于删除当前记录,Edit()函数用于修改当前记录各字段数据成员的值。Update()函数用于AddNew和Edit操作后的数据的最后保存,CancelUpdate()函数用于取消任何由AddNew和Edit操作产生的待处理的更新。Requery()函数用于重新执行对记录集的查询,当记录集类型是快照型时,快照不反映用户添加的记录,这时需要调用该函数重新查询更新后的记录集。 下面在Exam9_1中增加添加新记录和删除记录的功能。 〖例9-3〗在“record”记录下添加三个菜单项如下图图9-17所示。一个菜单项是分割线,另外两个菜单项分别是“增加记录”和“删除记录”。菜单ID设置为ID_RECORD_ADD和ID_RECORD_DELETE。 图9-17 增加菜单项 使用ClassWizard在视图类为菜单项ID_RECORD_ADD和ID_RECORD_DELETE映射COMMAND消息处理函数,得到成员函数OnRecordAdd()和OnRecordDelete()。 添加CExam9_1View的BOOL类数据成员m_addflg,用以记录是否进入添加模式,当m_addflg的值为true时,进入添加模式。在CExam9_1View的构造函数中初始化m_addflg的值为false。 为成员函数OnRecordAdd()添加代码,增加一条空记录,并清除ID编辑框的只读属性。实现代码如程序清单9-2所示。 程序清单9-2:Add Record 菜单消息处理函数 void CExam9_1View::OnRecordAdd() { // TODO: Add your command handler code here m_pSet->AddNew();  //进入添加模式 m_addflg=true;    //设置添加模式标志 CEdit* m_pCtrl=(CEdit*)GetDlgItem(IDC_CustomerID); m_pCtrl->SetReadOnly(false); //清除ID编辑框的只读属性 UpdateData(false); //用新记录的字段数据成员值更新控件显示 } 使用ClassWizard添加CExam9_1View类的虚函数OnMove()函数,并在OnMove()函数中添加代码,通过移动记录将添加的新记录保存到表中。实现代码如程序清单9-3所示 程序清单9-3:OnMove()函数 BOOL CExam9_1View::OnMove(UINT nIDMoveCommand) { // TODO: Add your specialized code here and/or call the base class if(m_addflg)//添加模式处理 { m_addflg=false; UpdateData(true);//使用控件值更新记录集字段数据成员 if(m_pSet->CanUpdate() )//将记录集更新保存到表中 m_pSet->Update(); m_pSet->Requery();//重新查询记录集 UpdateData(false);//以更新后的记录集数据成员更新控件显示 CEdit* m_pCtrl=(CEdit*)GetDlgItem(IDC_CustomerID); m_pCtrl->SetReadOnly(true); //设置ID编辑框为只读 return true; } else return CRecordView::OnMove(nIDMoveCommand); } 为成员函数OnRecordDelete()添加代码,删除当前记录,实现代码如程序清单9-4所示。 程序清单9-4:Delete Record菜单处理函数 void CExam9_1View::OnRecordDelete() { // TODO: Add your command handler code here m_pSet->Delete();//删除当前记录 m_pSet->MoveNext();//移到下一记录 if(m_pSet->IsEOF() )//删除记录为最后一条记录处理 m_pSet->MoveLast(); if(m_pSet->IsBOF() )//删空记录集处理 m_pSet->SetFieldNull(NULL); UpdateData(false);//更新控件显示 } 9.2.5 排序和筛选 CRecordView类有两个重要的数据成员m_strFilter和m_strSort,m_strFilter是用于表示筛选记录的条件字符串,m_strSort是用于表示排序的关键字的字符串。只要对这两个数据成员赋值,只能实现排序和筛选。 〖例9-3〗首先在应用程序Exam9_1中建立两类排序,每一类是按ID号排序,另一类是按HomeCountry排序。 在“查看”菜单下添加三个菜单项:一条分隔线、“按ID排序”和“按国家排序”,菜单项ID设置为ID_VIEW_SORT_ID和ID_VIEW_SORT_COUNTRY。使用ClassWizard为两个菜单项在视图类中映射COMMAND消息处理函数得到,添加代码如程序清单9-5所示,实现排序。 程序清单9-5:实现排序的函数 void CExam9_1View::OnViewSortId() { // TODO: Add your command handler code here m_pSet->m_strSort="CustomerID";// 定义排序关键字按ID排序 m_pSet->Requery() ;// 重新查询 UpdateData(false); //更新控件显示 } void CExam9_1View::OnViewSortCountry() { // TODO: Add your command handler code here m_pSet->m_strSort="HomeCountry"; m_pSet->Requery() ; UpdateData(false); } 接着添加筛选条件,在一个对话框中输入一个国别,则只显示属于该国别的顾客记录。步骤如下: (1)​ 创建一个对话框,并添加控件,如图9-18所示。设置编辑框的ID为IDC_FILTER.。为该对话对话框添加一个新的对话框类CFilterDlg并使用ClassWizard为编辑框IDC_FILTER在对话框类CFilterDlg中添加一个Ctring类型的成员变量m_Filter。 图9-18 筛选对话框 (2)​ 在“查看”菜单下添加一个新的菜单项“筛选”,菜单项ID设为ID_VIEW_FLITER,使用ClassWizard在CExam9_1View类中为菜单项ID_VIEW_FILTER映射菜单处理函数,得到函数OnViewFilter()。 (3)​ 在CExam9_1View类的实现文件中使用include命令包含“FilterDlg.h”文件,并在函数OnViewFilter()中添加代码,调用筛选对话框,并按对话框返回的字符串设置数据成员m_strFilter的值,实现筛选。若对话框返回空串,显示整个记录集。 程序清单9-6:实现筛选的函数 void CExam9_1View::OnViewFilter() { // TODO: Add your command handler code here CFilterDlg dlg; CString str; if(dlg.DoModal()==IDOK )//调用筛选对话框,按OK按钮返回 { if(dlg.m_Filter.IsEmpty())//编辑框为空,显示整个记录集 str=""; else str="HomeCountry='"+dlg.m_Filter+"'";//定义筛选字符串 m_pSet->m_strFilter=str; m_pSet->Requery(); //重新查询记录集 UpdateData(false); //更新控件显示 } } 9.3 MFC DAO连接数据库 DAO(Data Access Objects)即数据对象访问集,是使用Microsoft Jet访问数据库的一种技术。它是Windows API的一部分,可以独立于DBMS进行数据库访问。DAO与ODBC是两种完全不同的访问机制,ODBC的工作依赖于数据库制造商提供的驱动程序,应用程序使用ODBC API访问数据库时,是由ODBC管理器将应用程序的数据库访问请示传递给相应的数据库驱动程序,驱动程序再用SQL语句完成DBMS的访问任务。DAO则使用Microsoft Jet提供的数据库访问对象集直接访问DBMS,速度比ODBC要快。Microdoft Jet本身的数据库为MDB。如果你采用的是MDB格式的数据库,又希望提高数据库访问速度时,可以选择DAO方式。 MFC封装了DAO的绝大多数API函数,MFC为DAO封闭的类与ODBC类非常相似,同样,AppWizard和ClassWizard也提供了类似的支持,所以虽然MFC DAO与MFC ODBC的工作机制不一样,但是开发DAO数据库应用程序的过程与开发ODBC数据库程序却惊人地相似。 1.​ DaoDatabase类 CDaoDatabase类对应于CDatabase类,支持与数据库的连接,但它不需要在ODBC管理器中注册DSN,直接与一个数据库相连。 2.​ DaoRecordset类 CDaoRecordset类对应CRecordset类,CDaoRecordset类的数据成员和成员函数与CRecordset类的数据成员和成员函数非常相似,支持同样的记录集操作。 但由于DAO是直接与数据库相连,所以ODBC中的GetDefaultConnect()函数在DAO中是GetDefaultDBName。此外,CDaoRecordset类与数据源之间的数据交换是采用DFX(Dao record Field eXchange)机制,而OBDC采用的是RFX机制。 3.​ CDaoRecordView类 CDaoRecordView类对应CRecordView类,功能几乎完全相同。 4.​ CDaoFieldExchange类 CDaoFieldExchange类对应CFieldExchange类,支持数据交换。 5.​ CDaoTableDef类 CDaoTableDef类支持对数据库中表结构的操作,成员函数Open()打开一张表的结构,Create()函数创建一张新表,CreateField()函数添加字段,Append()函数将新添加的表保存到数据库中。 6.​ CDaoQueryDef类 CDaoQueryDef类用于定义一个查询,并保存到数据库中。 使用MFC AppWizard生成基于DAO的数据库应用程序,与生成基于ODBC的数据库应用程序非常相似,只需在选择数据源的时候选择DAO单选项,然后输入数据库文件的完整路径和文件名。最后生成的程序框架与基于ODBC的应用程序框架非常类似,后面的操作步骤几乎一样。读者可以自已模仿Exam9-1的操作步骤,以DAO方式重写程序。 图9-19 选择DAO数据源 实验 实验1:(独立练习) 重新实现Exam9_1示例程序,要求在AppWizqrd向导的第二步不作指定数据源和选择数据库表的操作,在生成程序框架后,使用ClassWizard创建一个CRecordset的派生类CCustomerset,再按DAO访问方式设置连接数据库。 实验2:(独立练习) 独立设计一个简单的数据库应用系统,用于管理旅行社的游客信息管理。需要知道信息一般有:身份证号,姓名,性别,住址,电话,参加的旅游项目编号,团队编号等,程序要有浏览、修改、添加、删除游客信息的功能。 自测题 1.MFC提供了两种独立地面向用户的数据库访问系统,一种是 ,另一种是 。 2.ODBC层由三个部件构成: 、 、 。 3.进行ODBC编程,有三个非常重要的元素: , 和 ,它们都是通过句柄来访问的。 4.数据库应用程序的实现步骤分为: 、 、 、 、 。 5.DAO与ODBC是两种完全不同的访问机制,DAO使用 ,速度比ODBC要快。 小结 1.​ MFC提供了基于ODBC和基于DAO的数据库访问方式。 2.​ 基于ODBC的数据库应用程序编程有三个非常重要的元素:环境(Enviroment),连接(Connection)和语句(Statement)。 3.​ 在进行ODBC数据库应用程序开发前,先要在ODBC管理器中注册数据源名,为要操作的数据库选择正确的驱动程序。 4.​ MFC ODBC支持类包括:CDatabase类、CRedordset类、CRecordView类、CFieldExchange类。 5.​ CDatabase类支持与ODBC数据源的连接。 6.​ CRecordset类对象表示从数据源中抽取出来的一组记录集,并提供了支持大量记录集记录操作的函数,如记录移动函数,记录更新函数,记录状态函数等。可以在AppWizard的第二步中设定数据源,框架根据设定自动创建CRecordset的派生类,也可以在程序框架生成后,使用ClassWizard创建一个CRecordset的派生类。 7.​ CRecordView类支持记录集的控件视图,是CFormView类的派生类。CRecordView类的数据成员m_pSet指向一个记录集,使用ClassWizard将一个控件与记录集的一个选定字段数据成员绑定。与Dialog的DDX数据交换机制相类似,CRecordView类使用RFX数据交换机制在控件与记录集字段数据成员之间自动交换数据。同样使用UpdateDate()函数可以程序控制数据交换的产生。 8.​ CFieldExchange类支持CFieldExchange类支持记录字段数据的自动交换。 9.​ 记录集的类型有快照记录集和动态记录集两种,前者是数据的静态映像,后者是数据的动态映像。 10.​ CRecordView类中支持记录移动的函数有Move()、MoveFirst()、MoveLast()、MoveNext()、MovePrev()、SetAbsolutePosition()。 11.​ CRecordView类中支持记录更新的函数有AddNew()、Delete()、Edit()、Update()、CancelUpdate()、Requry()。 12.​ CRecordView类有两个重要的数据成员m_strFilter和m_strSort,m_strFilter是用于表示筛选记录的条件字符串。 13.​ DAO(Data Access Objects)即数据对象访问集,使用Microsoft Jet提供的数据库访问对象集直接访问DBMS,速度比ODBC要快。Microdoft Jet本身的数据库格式为MDB。 MFC为DAO封闭的类与ODBC类非常相似,与基于ODBC相对应的类有:CDaoDatabase类、CDaoRecordset类、CDaoRecordView类、CDaoFieldExchange类,此外还定义了CDaoTableDef类和CDaoQueryDef类
/
本文档为【连接数据库】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索