- 浏览: 45970 次
- 性别:
- 来自: 河北
最新评论
1.ODBC概述
数据库应用程序是指能够通过数据库管理系统DBMS访问数据库的程序。Visual C++提供了多种数据库访问技术,其中经常使用的开放式数据库连接(open database connectivity,ODBC)和数据存取对象(data access object,DAO)两种关系数据库访问技术。ODBC是一个技术上成熟可靠的标准接口,基本上可用于所有的关系数据库。
ODBC是微软开放服务结构(Windows open services architecture,WOSA)中有关数据库一个组成部分,它建立了一组数据库访问规范,为用户提供了简单、标准、透明和统一的数据库访问的编程接口(即API),使应用程序独立于DBMS。ODBC API作为数据库的一种底层访问技术,它支持SQL(structured query language)语言,并且用户可以直接将SQL语句提交给ODBC API。
ODBC的体系结构包括如下4个组件。
(1)应用程序,执行处理并调用ODBC API函数,以提交SQL语句并获取结果。
(2)驱动程序管理器(driver manager):根据应用程序的需要加载或卸装驱动程序,处理ODBC API函数调用,或将函数调用转交给ODBC驱动程序。驱动程序管理器包括一组ODBC API函数,它们位于ODBC32.dll动态链接库中。
(3)ODBC驱动程序(driver):处理ODBC API函数调用,提交SQL请求到一个指定的数据源,并把结果返回给应用程序。ODBC驱动程序通常是一个DLL。
(4)数据源(data source):应用程序要连接一个数据库,首先必须设置一个数据源。一个数据源包含了用户要访问的数据库及相关的DBMS、网络平台等信息,ODBC驱动程序管理器根据数据源提供的信息,建立ODBC与具体数据库的联系。数据源是应用程序的操作对象,应用程序通过数据源就能找到对应的数据库物理文件。
一个ODBC应用程序对数据库的操作不依赖于具体的DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。例如,对于Access、SQL Server和Oracle等关系数据库管理系统,用户均可用ODBC API进行访问。
需要注意的是,ODBC API并不能直接访问数据库。借助于ODBC.INI文件,驱动程序管理器负责将应用程序对ODBC API的调用传递给对应的ODBC驱动程序,由驱动程序完成相应的操作。
2.MFC ODBC数据库类
ODBC提供了访问DBMS的统一接口,但是直接使用ODBC API创建数据库应用程序需要编制大量的代码。MFC的ODBC类对复杂的ODBC API进行了封装,揭供了简化的调用接口,从而大大方便了数据库应用程序开发。如果要对数据库底层进行操作,在MFC ODBC数据库应用程序中也可以直接调用ODBC API。
MFC的ODBC数据库类主要包括如下内容。
(1)CDatabase:主要功能是建立与数据源的连接。
(2)CRecordset:从数据源中撮的记录集。CRecordset类的对象有动态行集(dynasets)和快照集(snapshots)两种形式,每一种形式在记录集被打开时提供一组记录。动态行集能保持与其他用户所做的更改同步,而快照集则是数据的一个静态视图。
(3)CRecordView:CRecordView是连到一个CRecordset对象的表单视图,它是CFormView类(一个基于对话框的视图类)的派生类,用于显示数据库记录。利用对话框数据交换机制DDX在记录与表单视图的控件之间传输数据。
(4)CFieldExchange:支持记录字段数据交换RFX(record field exchange),即记录集字段数据成员与相应的数据库的表的字段之间的数据交换。
(5)CDBException:用于处理ODBC类产生的异常。
从上面可以看出,CDatabase针对某个数据库,它负责连接数据源;CRecordset针对数据源中的记录集,它负责对记录的操作;CRecordView负责界面;而CFieldExchange负责CRecordset与数据源的数据交换。
3.编程实现
编写一个基于MFC的数据库应用程序一般分为三个步骤,首先利用ODBC数据源管理器配置与数据库对应的数据源,然后利用MFC AppWizard应用程序向导生成数据库应用程序框架,最后根据需要向框架添加具体的源代码。下面通过一个例子说明数据库应用程序的设计原理、方法和步骤。
例:编写一个基于MFC的数据库应用程序Myodbc,实现简单的记录浏览功能,并支持记录的修改、增加和删除功能。
本例程序要访问一个Access数据库APETEST.MDB,需要利用ODBC数据源管理器配置数据源,安装对应的驱动程序。打开Windows控制面板中的管理工具,执行“数据源ODBC”,出现如图1所示的ODBC数据源管理器。用户可以定义三种类型DSN(data source name)。
- 用户DSN:当前用户配置的数据源,只有当前用户可以使用。
- 系统DSN:系统配置的数据源,有访问权限的用户都可以使用。
- 文件DSN:由一个文本文件定义的数据源,安装了驱动程序的用户可以使用。
在“用户DSN”页面单击“添加”按钮,弹出“创建新数据源”对话框。在该对话框中选择Access数据库对应的驱动程序即Microsoft Access Driver(*.mdb)项,然后单击“完成”按钮。接下来弹出“ODBC Microsoft安装”对话框,在对话框中输入用户自已命名的一个数据源名(如APETEST)和说明字符串,然后单击“选择”按钮,在随后弹出的对话框中通过路径“...\Microsoft Visula Studio\Common\Tools\APE”找到并选择APETEST.MDB。单击“确定”按钮后,一个名为APETEST的数据源就被配置成功了。
以上介绍了利用ODBC数据源管理器配置Access数据源的方法,其他类型数据库如SQL Server数据源的配置方法有所不同。有时在一个应用程序中需要连接不同的数据源,这种手工配置数据源的方法不太实用。因此,在程序中常常通过ODBC API动态配置数据源,这时需要调用ODBC API函数SQLConfigDataSource()。由于Visual C++的默认库文件中不包含该函数,因此使用该函数前需要包含头文件Odbcinst.h,并执行Project|Settings命令,在Link碰面的Object/library modules编辑框中输入导入库文件Odbccp32.lib,同时保证系统目录System32下有文件odbccp32.dll。
(2)生成Myodbc应用程序框架。
利用MFC AppWizard应用程序向导可以自动生成一个基于MFC的数据库应用程序框架。首先创建一个单文档应用程序Myodbc,在向导的第二步列出了关于数据库操作四个选项,本例仅想读写数据库记录而不需要读写文档(序列化),因此选择Database view without file support。然后单击Data Source按钮,出现Database Options对话框,旬出了已配置的数据源。选择要操作的数据源,如APETEST,单击OK按钮后出现Select Database Tables对话框,其中列出了所选数据源中包含的数据库表。选择希望操作的表,如OrderDetails,单击OK按钮。
与一般应用程序不同的是:MFC AppWizard向导创建了一个数据库有关的类CMyodbcSet,它记录集类CRecordset类的派生类;视图类CMyodbcView是表单视图CRecordView的派生类,负责显示记录。应用程序框架通过CDatabase对象自动进行数据源的连接和关闭,这些代码对用户是透明的,在源程序中并没有出现。
MFC AppWizard向导还自动创建了一些类的数据成员。在生成的CMyodbcDoc类中有一个CMyodbcSet对象的m_myodbcSet,它随文档对象的建立而自动建立,随文档对象的删除而自动删除。注意,在生成的CMyodbcView类中还包含一个指向CMyodbcSet对象的指针m_pSet,在视图中通过该指针直接访问数据库,在表单视图和记录集之间建立联系,使得记录集中的查询结果能够方便地在表单视图中显示出来。
(3)增加浏览记录集和修改记录功能。
要真正实现浏览和修改记录的功能,还需要用户添加具体代码。打开工作区的资源视图,找到一个ID为IDD_MYODBC_FORM的对话框模板,表单视图用该查模板来显示记录。向对话框加入静态文本控件和对应的编辑控件。根据数据库表文件OrderDetails的五个字段名,将对应的五个编辑控件的ID为IDC_ORDERID、IDC_PRODUCTID、IDC_UNITPRICE、IDC_QUANTITY和IDC_DISCOUNT。
接下来,利用ClassWizard把表单视图中的编辑控件与记录集的域数据成员连接起来,实现控件与当前记录的DDX数据交换。启动ClassWizard,选择Member Variables页并选择CMyodbcView类。在控件列表中分别双击IDC_ORERID、IDC_PRODUCTID等五项,打开Add Member Variable对话框。注意该对话框的Member variable name显示的是一个组合框,而不是平常看到的编辑框。可以在组合框列表中选择合适的域数据成员作为变量,这里分别选择m_pSet->m_OrderID、m_pSet->m_ProductID等。
编译、链接并运行Myodbc,就会发现MyOdbc是一个不错的记录浏览器,并且用户可以对记录时进行修改。Myodbc的运行界面图2所示。
图2 Myodbc的运行界面
图3 OrderDetails表的结构
一般的DDX都是在控件和控件父窗口的数据成员之间交换数据,而表单视图则是使用DDX在控件和一个外部对象(CRecordset的派生类对象)之间交换数据。读者可以查看CMyodbcView的DoDataExchange()成员函数,该函数是与m_pSet指针指向的记录集对象的域数据成员交换数据,交换数据的代码是ClassWizard类向导自动加入的。图4描述了DDX和RFX(record field exchange)数据交换机制。RFX数据交换通过成员函数CMyodbcSet::DoFieldExchange()来实现。
CRecordView提供了对ID_RECORD_FIRST、ID_RECORD_LAST、ID_RECORD_NEXT和ID_RECORD_PREV等四个命令的支持,用于滚动记录。它的成员函数OnMove()处理这四个命令消息,OnMove()函数对用户是透明。
BOOL CRecordView::OnMove(UINT nIDMoveCommand) { CRecordset* pSet=OnGetRecordset(); if(pSet->CanUpdate()) { pSet->Edit(); //进入编辑模式 if(!UpdateData()) //将控件中的数据更新到记录集对象的域数据成员中 return TRUE; pSet->Update(); //将域数据成员的值写入数据源 } switch(nIDMoveCommand) //分别处理四个不同的命令 { case ID_RECORD_PREV: pSet->MovePrev(); if(!pSet->IsBOF()) break; case ID_RECORD_FIRST: pSet->MoveFirst(); break; case ID_RECORD_NEXT: pSet->MoveNext(); if(!pSet->IsEOF()) break; if(!pSet->CanScroll()) //clear out screen since we're sitting on EOF { pSet->SetFieldNull(NULL); break; } case ID_RECORD_LAST: pSet->MoveLast(); break; default: //Unexpected case value ASSERT(FALSE); }//switch //Show results of move operation UpdateData(FALSE); //把新的当前记录的内容置入到表单视图的控件中 return TRUE; }//OnMove()
在函数的多分支语句中调用了CRecordset类各种用于滚动记录的成员函数,这些函数在滚动到一个新的记录时会把该记录传递到数据成员中。OnMove()函数一来一回完成了两次表单控件和数据源的数据交换,即控制DDX和RFX数据交换。
(4)支持记录的增加和删除
对数据库的操作除了对记录的浏览和修改,还包含对记录的增加和删除。下面为Myodbc程序添加记录的增加和删除功能,并支持数据库异常的处理。在Myodbc程序Record菜单中增加三个菜单命令项;Add、Delete和Refresh。菜单ID分别为ID_RECORD_ADD、ID_RECORD_DELETE和ID_RECORD_REFERSH,它们分别来添加、删除和刷新记录。
在处理增加、刷新和滚动命令时必须有一个标志来判断当前是否处于增加模式,以便向数据源中加入新记录或进行普通的滚动处理。在CMyodbcView类定义中声明一个protected属性、BOOL类型的变量m_bAddMode,并在构造函数中初始化。
CMyodbcView::CMyodbcView() : CRecordView(CMyodbcView::IDD) { //{{AFX_DATA_INIT(CMyodbcView) m_pSet = NULL; m_bAddMode=FALSE; //初始化变量 //}}AFX_DATA_INIT // TODO: add construction code here }
利用ClassWizard为上面Add、Delete和Refresh三个命令添加消息处理函数:
void CMyodbcView::OnRecordAdd() { // TODO: Add your command handler code here if(m_bAddMode) //如果已处于增加模式,则完成添加记录操作 OnMove(ID_RECORD_FIRST); //滚动到别的记录上,新记录被保存到数据源中 m_pSet->AddNew(); //进入增加模式 m_bAddMode=TRUE; UpdateData(FALSE); //更新表单视图 } void CMyodbcView::OnRecordDelete() { // TODO: Add your command handler code here TRY { m_pSet->Delete(); } CATCH(CDBException,e) { AfxMessageBox(e->m_strError); return; } END_CATCH m_pSet->MoveNext(); //滚动到下一个记录 if(m_pSet->IsEOF()) //如果滚出了记录集的边界,则滚动到最后一个记录 m_pSet->MoveLast(); if(m_pSet->IsBOF()) //如果记录变空了,则清除域数据成员 m_pSet->SetFieldNull(NULL); UpdateData(FALSE); //更新表单视图 } void CMyodbcView::OnRecordRefresh() { // TODO: Add your command handler code here if(m_bAddMode==TRUE) { m_pSet->Move(AFX_MOVE_REFRESH); //取消增加模式开始恢复域数据成员的原值 m_bAddMode=FALSE; } UpdateData(FALSE); //恢复表单视图中的记录 }
另外,需要为表单视图编写新的OnMove()函数来处理滚动命令,因为原来的OnMove()函数没有增加记录的功能。利用ClassWizard类向导重载OnMove()虚函数,添加如下代码。
BOOL CMyodbcView::OnMove(UINT nIDMoveCommand) { if(m_bAddMode) //判断当前是否处于增加模式,以便添加记录或进行普通的滚动 { if(!UpdateData()) return FALSE; TRY { m_pSet->Update(); //把新记录保存到数据源 } CATCH(CDBException,e) { AfxMessageBox(e->m_strError); return FALSE; } END_CATCH m_pSet->Requery(); //重新查询,使新加的记录对用户可见 UpdateData(FALSE); //更新表单 m_bAddMode=FALSE; return TRUE; } return CRecordView::OnMove(nIDMoveCommand); }
CMyodbcView::OnMove()函数负责处理滚动命令。与CRecordView::OnMove()函数不同,该函数对增加模式下的滚动重新进行了处理;在调用CRecordset::Update()函数把新记录保存到数据源后,调用CRecordset::Requery()函数重新查询记录集。因为Myodbc使用的是快照型记录集,快照不反映用户增加记录,所以需要调用Requery()函数把新的记录加入记录集中。在调用Requery()函数后,会自动滚动到第1条记录上。在调用CRecordset::Update()函数时,对可能发生异常进行了处理。
在Add命令的处理函数OnRecordAdd()中调用了CRecordset::AddNew()时进行增加模式。如果已处于增加模式,调用CMyodbcView::OnMove()函数滚动到别的记录这将使新记录保存数据源中。通过滚动完成记录的增加是一种简便实用的方法。
在Delete命令的处理函数OnDelete()中调用了CRecordset::Delete()来删除记录,并进行了异常处理。在调用Delete()后,滚动记录到新的位置以跳过被删除的记录。
Refresh命令的处理函数OnRefresh()用来放弃修改添加记录的操作。如果当前处于增加模式,则调用CRecordset::Move(AFX_MOVE_REFRESH)取消增加模式并恢复域数据成员的原值。调用CRecordView::UpdateData(FALSE)恢复表单视图中的记录。
编译、链接后创建了应用程序,程序Myodbc实现了记录的增加和删除功能。
- Myodbc.rar (1.9 MB)
- 描述: MFC ODBC连接数据库的实例
- 下载次数: 40
发表评论
-
MFC的打印
2009-05-24 17:05 0虽然Windows通过 ... -
ActiveX控件
2009-05-23 15:49 6714ActiveX是Microsoft提出的使用组件对 ... -
多线程
2009-05-22 18:57 0Windows对CPU的管理的采取时间片分配的方式 ... -
动态链接库DLL
2009-05-22 14:38 0为了提高系统 ... -
异常处理
2009-05-21 19:06 2123异常(exception)是指在程序运行过程中发生 ... -
对话框高级编程---公共控件之四(树视控件)
2009-05-19 21:45 2376树视(tree view)控 ... -
对话框高级编程---公共控件之四(列表视控件)
2009-05-19 14:01 0列表视(list view)控件也称列表控件,属 ... -
对话框高级编程---公共控件之三(图像列表)
2009-05-18 21:22 0图像列表(image list)是一个由一些大小相同 ... -
对话框高级编程---公共控件之二(标签控件和属性表)
2009-05-18 20:33 35571.标签控件 标签(tab)控件也 ... -
对话框高级编程---公共控件之一(旋转按钮、滑块和进度条)
2009-05-18 11:09 01.旋转按钮 ... -
对话框高级编程---通用对话框
2009-05-17 21:17 18211.通用对话框概 ... -
对话框高级编程---非模态对话框
2009-05-16 21:39 0尽管不同对话 ... -
图形处理---位图、图标和光标
2009-05-16 20:33 22121.位图 例1 编写一个应用程序MyB ... -
图形处理---位图,图标和光标
2009-05-16 20:16 01.位图 例1 编写一个应用程序MyBMP ... -
图形处理---位图、图标和光标
2009-05-16 19:58 01.位图 例1 编写一个应用程序MyBMP ... -
文本与字体
2009-05-16 16:23 01.绘制文本 以图形方式进行文本的输 ... -
图形处理---基本几何图形的绘制
2009-05-15 21:27 0获取设备环境、设置绘图属性和选择GDI绘图对象后,就 ... -
图形处理---画笔和画刷
2009-05-15 17:30 0进行绘图除了需 ... -
图形处理---颜色的设置
2009-05-15 16:08 0在绘制图形时,颜色是一个需要考虑的因素。Window ... -
用CDC绘制简单图形
2009-05-14 20:47 0绘图 1. 几种不同设备环境 MFC的CDC类封装了设 ...
相关推荐
MFC程序设计详细实例 第20章 MFC ODBC数据库编程MFC程序设计详细实例 第20章 MFC ODBC数据库编程MFC程序设计详细实例 第20章 MFC ODBC数据库编程MFC程序设计详细实例 第20章 MFC ODBC数据库编程MFC程序设计详细实例 ...
在"ODBC访问数据库"的场景中,MFC提供了CDatabase和CRecordset等类,这些类是用来操作ODBC数据源的。CDatabase类用于建立和管理数据库连接,而CRecordset类则代表了数据库中的一个结果集,可以用来执行SQL查询并处理...
MFC ODBC数据库编程\Chapter20 MFC ODBC数据库编程实例源码 MFC ODBC数据库编程\ IMAGES.BMP 树视图图像列表 MFC ODBC数据库编程\Chapter20.ico 应用图标 MFC ODBC数据库编程\open.ico “打开”图标 MFC ...
本实例“mfc odbc数据库应用程序源代码”将帮助初学者理解如何在MFC框架下使用ODBC连接SQL Server数据库,以实现学生成绩管理系统的功能。 首先,我们要理解MFC如何与ODBC协同工作。MFC提供了一组CDatabase、...
标签中的关键词进一步细化了主题:"mfc_数据库操作","mfc数据库编程","mfc_odbc","mfc_数据库","odbc数据库编程",强调了与MFC相关的数据库编程技术和ODBC的使用。这些标签可以帮助开发者了解这个资源将涉及的...
### MFC ODBC 数据库访问技术 #### 一、概述 MFC (Microsoft Foundation Classes) 是微软提供的一个C++类库,主要用于简化Windows API的使用难度。ODBC (Open Database Connectivity) 是一种开放的标准应用程序...
总的来说,MFC ODBC数据库闹钟项目结合了数据库操作和定时提醒功能,通过ODBC接口与ACCESS数据库进行交互,使用MFC库提供的CDatabase和CRecordset类进行数据访问。ALERM文件是实现闹钟逻辑的关键,而"SOSO"则表明...
首先,MFC通过CDatabase类提供了对ODBC接口的封装,使得开发者可以使用C++的对象模型来操作数据库。CDatabase类提供了连接、断开数据库、执行SQL语句、获取结果集等基本操作。在创建CDatabase对象时,通常需要提供...
MFC提供了CDatabase类,它是ODBC API的封装,使得C++开发者可以更方便地在MFC应用中操作数据库。CDatabase类提供了一系列的方法,如打开、关闭数据库,执行SQL语句,处理结果集等。 2. **设置ODBC数据源** 在使用...
理解MFC的类层次和ODBC的工作原理,以及如何结合两者进行数据库操作,是成为一名合格的MFC数据库开发者的关键。在这个过程中,不断实践和学习新知识将有助于提升技能,应对各种复杂的数据库应用场景。
使用ODBC打开位图 MFC vc++ 数据库使用ODBC打开位图 MFC vc++ 数据库使用ODBC打开位图 MFC vc++ 数据库使用ODBC打开位图 MFC vc++ 数据库使用ODBC打开位图 MFC vc++ 数据库使用ODBC打开位图 MFC vc++ 数据库使用ODBC...
MFC数据库ODBC操作详解 MFC(Microsoft Foundation Classes)为Microsoft提供的一套用于Windows平台的应用程序开发的类库。ODBC(Open Database Connectivity)是一种开放式数据库连接接口标准,允许不同的应用程序...
在这个场景中,我们将深入探讨如何使用VC++ 2008 MFC ODBC功能实现对SQL Server 2005数据库中的多表进行增、删、改、查操作。 首先,理解ODBC的核心概念是关键。ODBC提供了一个抽象层,使得开发者无需了解底层...
MFC提供了CDatabase、CRecordset和CRecordView等类,这些类简化了与ODBC数据库的交互。CDatabase类代表一个数据库连接,CRecordset类用于处理数据库查询结果,而CRecordView则可以直接绑定到记录集,实现数据的可视...
同时,MFC也提供了对数据库访问的支持,其中包括通过ODBC(Open Database Connectivity)接口连接各种数据库系统,如Oracle。 ODBC是一种数据库访问标准,它为不同的数据库管理系统(DBMS)提供了一个统一的接口。...
16.4 使用ADO数据库类 ADO是微软提供的另一套数据库访问技术,它比ODBC更高级,提供了更丰富的对象模型和更直接的数据访问方式。ADO可以直接与各种数据提供者(如OLE DB或ODBC)通信,简化了数据库编程。在MFC中,...
### 学生信息管理系统(MFC、VC++、ODBC数据库)知识解析 #### 设计目标与背景 在探讨学生信息管理系统(MFC、VC++、ODBC数据库)之前,我们首先理解设计这一系统的初衷与目标。该系统旨在让学生及开发者熟悉Windows...
### MFC的ODBC数据库编程技术详解 #### MFC与ODBC编程背景 MFC(Microsoft Foundation Classes)作为Microsoft Visual C++环境下的一个重要组件,它极大地简化了Windows应用程序的开发过程,通过封装复杂的Windows...