MFC提供的ODBC数据库类

合集下载

MFC关于ODBC数据库连接

MFC关于ODBC数据库连接

UpdateData(TRUE); if(m_pSet->CanUpdate()) m_pSet->Update(); } void CODBCView::OnUpdateUpdateRecord(CCmdUI* pCmdUI) //刷新 记录集 { pCmdUI->Enable(!m_pSet->IsEOFarDomain() //清除域 { m_pSet->SetFieldNull(NULL); UpdateData(FALSE); }
if(!UpdateData()) return; pSet->Update(); } long m_lNewID=m_pSet->GetMaxID()+1;//获取新的ID值 m_pSet->AddNew(); //添加一个新记录 m_pSet->m___ID=m_lNewID; //设置新的ID标识 m_pSet->Update(); //保存新的记录 m_pSet->Requery(); //刷新数据库 m_pSet->MoveLast(); //游标移到最后一条记录 UpdateData(FALSE); //更新表单 }
long CODBCSet::GetMaxID() { MoveLast(); //移到最后一条记录 return m___ID; //返回该ID值 } void CODBCView::OnAddRecord() {CRecordset * pSet=OnGetRecordset();//获取指向数据库的指针 if(pSet->CanUpdate()&&!pSet->IsDeleted()) //确认对数据库的任何修 改均已保存 { pSet->Edit();

简介MFC访问数据库的几种方式

简介MFC访问数据库的几种方式

简介MFC访问数据库的几种方式简介MFC访问数据库的几种方式2010-04-22 09:06从功能简单的数据库(如Jet Engine)到复杂的大型数据库系统(如oracle),VC++6.0都提供了一些编程接口。

本文主要介绍以下五种: 1.ODBC API;2.MFC ODBC类;3.MFC DAO 类;(数据访问对象)4.MFC的OLE/DB;5.ActiveX数据对象(ADO)。

6.RDO远程数据访问1.开放数据库连接(ODBC API):提供了一个通用的编程接口,允许程序与多种不同的数据库连接。

它为Oracle,SQL Server,MS Excel等都提供了驱动程序,使得用户可以使用SQL语句对数据库进行直接的底层功能操作。

在使用ODBC API时,用户须引入的头文件为"sql.h","sqlext.h","sqltypes.h"。

用ODBC API创建数据库应用程序遵循一定的基本步骤:第一步是分配ODBC环境,使一些内部结构初始化。

完成这一步,须分配一个SQLHENV类型的变量在ODBC环境中做句柄使用。

第二步是为将要使用的每一个数据源分配一个连接句柄,由函数SQLALLocHandle()完成。

第三步是使用SQLConnect()把连接句柄与数据库连接,可以先通过SQLSetConnectAttr()设置连接属性。

然后就可以进行SQL语句的操作,限于篇幅,相关的函数就不具体介绍了,读者可以参考相关书籍。

操作完成后,用户取回相应的结果,就可以取消与数据库的连接。

最后需要释放ODBC环境。

ODBC API的特点是功能强大丰富,提供了异步操作,事务处理等高级功能,但相应的编程复杂,工作量大。

2.MFC ODBC类:MFC1.5后的版本里引入封装了ODBC 功能的类。

通过这些类提供与ODBC的接口,使得用户可以不须处理ODBC API中的繁杂处理就可以进行数据库操作。

ODBC数据库接口的介绍

ODBC数据库接口的介绍

ODBC数据库接口的介绍什么是ODBCMcrosoft推出的ODBC(Open Database Connectivity)技术为异质数据库的访问提供了统一的接口。

ODBC基于SQL(Structured Query Language),并把它作为访问数据库的标准。

这个接口提供了最大限度的相互可操作性:一个应用程序可以通过一组通用的代码访问不同的数据库管理系统。

一个软件开发者开发的客户/服务器应用程序不会被束定于某个特定的数据库之上。

ODBC可以为不同的数据库提供相应的驱动程序。

ODBC的灵活性表现在以下几个方面:♦应用程序不会受制于某种专用的API;♦ SQL语句以源代码的方式直接嵌入在应用程序中;♦应用程序可以以自己的格式接收和发送数据;♦ ODBC的设计完全和ISO Call-Level Interface兼容;♦现在的ODBC数据库驱动程序支持55家公司的数据产品;ODBC的名词术语ODBC驱动程序:是一个动态链接库(DLL),用以将特定的开放式数据库连接的数据源和另一个应用程序(客户端)相连接。

ODBC数据源:作为数据源使用的数据库或数据库服务器。

ODBC数据源通过它们的数据源名称来引用,或者通过具体引用ODBC驱动程序和服务器名称来引用。

可以在Windows的控制面板中使用ODBC 管理程序或rdoRegisterDataSource(一个ODBC API)方法来注册命名的数据源。

ODBC驱动程序管理器:提供从主机语言到特定后端数据源驱动程序的接口。

ODBC API:数据库厂商为程序设计者提供的直接访问数据库的一组函数。

注意:这里要指出的是,虽然ODBC API提供了很多很方便而且强大的功能。

但是ODBC API都比较难学,而且使用很容易出错。

虽然允许用ODBC API来操作ODBC句柄,如果不正确使用ODBC API,可能会导致不可预知的错误。

配置ODBC数据源ODBC管理器(Administrator)它负责安装驱动程序,管理数据源,并帮助程序员跟踪ODBC的函数调用。

MFC ODBC数据库访问技术

MFC ODBC数据库访问技术

4)用CDatabase::ExecuteSQL()执行SQL语句
对于返回结果集的一般查询,使用CRecordset很容 易。然而,可以不用CRecordset执行不返回结果集 的SQL语句,而是通过调用CDatabase类的 CDatabase::ExecuteSQL()成员函数执行。其函数 原型如下:
MFC ODBC数据库访问技术
在Visual C++中,MFC封装的ODBC数据库 类包括CDatabase(数据库类)、 CRecordSet(记录集类)和CrecordView (记录视图类),更为用户提供了切实可行 的解决方案。
1.1 MFC的ODBC过程
使用MFC ODBC类访问数据库,主要有以下几个步 骤: 1.建立数据库 建立数据库就是用户根据自己的需要设计数据库中 的表及各表之间的依赖关系。要想设计一个完整的 数据库,首先必须了解数据库的基本知识。
void ExecuteSQL(LPCTSTR lpszSQL);
Throw(CEBException);
参数lpszSQL是一个带SQL语句字符串的指针。
的使用
CRecordset类派生于CObject类。虽然CDatabase类允许对一 个数据库执行SQL语句,但实际上是CRecordset 类提供了应 用程序与数据交互的实际操作。CRecordset类用来封装数据 库的查询,包括记录的插入、修改、删除等操作。
记录集对象一般都可以进行如下的操作:在 记录间滚动、更新记录并设定锁定模式、以 记录信进行过滤、限制对数据源可选记录的 选择、对记录排序、当完成操作后调用 Close()函数销毁对象等。
3.CRecordView类的使用
CRecordView类对象直接与CRecordset(记录 集)类对象连接,为该记录集提供显示的视图。 它是数据库操作的界面,提供了以下几个操 作:移动到第一个记录、下一个记录、前一 个记录、最后一个记录,还可以更新数据库 中当前视图所显示记录。

VisualC++数据库编程(ODBC)

VisualC++数据库编程(ODBC)

VisualC++数据库编程(ODBC)ODBC基本概念ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的⼀个组成部分,它建⽴了⼀组规范,并提供了⼀组对数据库访问的标准API(应⽤程序编程接⼝)。

这些API利⽤SQL来完成其⼤部分任务。

ODBC本⾝也提供了对SQL语⾔的⽀持,⽤户可以直接将SQL语句送给ODBC。

⼀个基于ODBC的应⽤程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。

也就是说,不论是FoxPro、Access还是Oracle数据库,均可⽤ODBC API进⾏访问。

由此可见,ODBC的最⼤优点是能以统⼀的⽅式处理所有的数据库。

⼀个完整的ODBC由下列⼏个部件组成: 应⽤程序(Application)。

ODBC管理器(Administrator)。

该程序位于Windows 95控制⾯板(Control Panel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。

驱动程序管理器(Driver Manager)。

驱动程序管理器包含在ODBC32.DLL中,对⽤户是透明的。

其任务是管理ODBC驱动程序,是ODBC中最重要的部件。

ODBC API。

ODBC 驱动程序。

是⼀些DLL,提供了ODBC和数据库之间的接⼝。

数据源。

数据源包含了数据库位置和数据库类型等信息,实际上是⼀种数据连接的抽象。

各部件之间的关系如图下图所⽰:应⽤程序要访问⼀个数据库,⾸先必须⽤ODBC管理器注册⼀个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建⽴起ODBC与具体数据库的联系。

这样,只要应⽤程序将数据源名提供给ODBC,ODBC就能建⽴起与相应数据库的连接。

MFC_ODBC_数据库访问技术

MFC_ODBC_数据库访问技术

MFC_ODBC_数据库访问技术16.2 MFC ODBC 数据库访问技术16.2.1概述ODBC是⼀种使⽤SQL的程序设计接⼝。

使⽤ODBC让程序的编写避免了与数据库相连的复杂性。

Studio为⼤多数标准的数据库格式提供了32位的ODBC驱动器,Paradox、ForPro、Excel、Oracle等。

如果⽤户需要⽤其他的数据库格式,⽤户需要相应的ODBC驱动以及DBMS。

MFC的ODBC类对较复杂的ODBC API进⾏了封装,提供了简化的调⽤接⼝,从⽽⼤⼤⽅便了数据库应⽤程序的开发。

程序员不必了解ODBC API和SQL的具体细节,利⽤ODBC类就可以完成对数据库的⼤部分操作。

MFC 的ODBC类主要包括如下5类:● CDatabase类:主要功能是建⽴与数据源地联接。

● CRecordset类:代表从数据源选择的⼀组记录(记录集)● CRecordView类:提供了⼀个表单视图与某个记录集直接相连,利⽤对话框数据交换机制(DDX)在记录集与表单视图的空间之间传输数据。

● CFieldExchange类:⽀持记录字段数据交换(DFX)应的的数据库的表的字段之间的数据交换。

● CDBException类:代表ODBC类产⽣的异常。

16.2.2使⽤MFC ODBC编程建⽴应⽤程序编程模型相对于使⽤ODBC API,使⽤MFC ODBC访问数据库简单得多,其步骤如下:●⾸先创建数据库并在系统中设置好;●使⽤CDatabase打开数据源的连接,如果利⽤AppWizard⽣成⼀个ODBC数据库应⽤程序,则会⾃动完成操作。

●使⽤ClassWizard想到加⼊由CRecordset类派⽣的⽤户记录集,完成对数据库表的绑定。

●创建记录积累对象,如果利⽤AppWizard⽣成⼀个ODBC数据库应⽤程序,则会⾃动在⽂档类中创建。

●使⽤记录集对象对数据库进⾏遍历、增加、删除、和修改等操作。

●使⽤CDatabase类的ExecuteSQL函数直接执⾏SQL命令。

MFC+ODBC

MFC+ODBC

MFC ODBC 数据存取ODBC是一种流行的数据库访问方法. 应用程序先调用ODBC访问ODBC驱动器管理器.ODBC驱动器管理器再调用数据库ODBC驱动器,通过数据库ODBC驱动器访问数据库数据.ODBC统一访问接口的结果是每个ODBC应用程序都可以使用相同的数据库调用,完成对不同的数据库的访问.例如用ODBC访问Oracle和SQL Server数据库,不需改变ODBC应用程序调用数据源的代码,仅需改变ODBC中数据源的配置.这样一来,就避免了ODBC应用程序直接与数据源打交道.用ODBC访问多种数据库虽然ODBC提供了访问数据库的接口,但是直接使用ODBC API创建应用程序需要编制大量的代码.而MFC ODBC数据库类将ODBC API函数进行了封装,这大大简化了ODBC数据库开发的编程工作.MFC ODBC实际上使用的是一个简化的编程模型,程序员无须考虑底层的很多细节.MFC ODBC有许多函数,这些函数使得编写ODBC应用程序变得很容易.2 MFC ODBC的数据库类进行MFC ODBC数据库开发时,所需的基础工具就是MFC ODBC数据库类的使用.利用MFC ODBC开发就是利用MFC ODBC数据库类来操纵ODBC数据源. Visual C++的大多数ODBC访问是通过MFC来完成的.有两个常常用于访问ODBC数据的MFC类,它们是CDatabase 类和CRecordset 类.这两个类被封装在CObject MFC类中,如下图所示.对于MFC ODBC数据库类来说,CDatabase类对象表示一个同数据源的连接,而CRecordset对象代表从数据源中选择的一组记录的集合,也就是通常所说的记录集对象.2.1 CDatabase 类CDatabase 类表示一个同数据源的连接,是操作ODBC数据源的基础.下面介绍CDatabase 类中的比较重要的函数.2.1.1 OpenEx( )成员函数为了创建一个新的CDatabase,且将它与一个数据库连接,可以建立一个新的CDatabase 对象,并调用它的OpenEx( )成员函数.OpenEx( )成员函数的原形为:virtual BOOL OpenEx( LPCTSTR lpszConnectString, DWORD dwOptions =0);2.1.2 Open( )成员函数构造了CDatabase 对象后,也可以调用Open( )函数以建立到指定数据源的连接.Open ( )成员函数的原形为:virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive=FALSE, BOOL bReadOnly=FALSE,LPCTSTR lpszConnect="ODBC; ",BOOL bUseCursorLib=TRUE);2.1.3 Close( ) 成员函数调用该函数将断开与数据源的连接.Close( )成员函数的原形为:virtual void Close( );2.2 CRecordset 类CRecordset 类代表从数据源中选择的一组记录的集合,它是操作数据源的工具. CRecordset 类提供了应用程序与数据交互的实质. CRecordset 类用来封装对数据库的查询,包括添加、修改、删除行.要注意的是在应用程序中,一般不直接使用CRecordset 类,而是使用其派生类.如果你没有自己的派生类,就几乎不可能使用CRecordset 类对象.因为CRecordset 类为你派生出的类提供了一个框架,当使用MFC Class Wizard 产生一个CRecordset 类的派生类时,MFC Class Wizard会自动添加相应于数据库表中字段的成员变量,并自动重载CRecordset 类的成员函数DoFieldExchange( ),该函数通过使用RFX_函数来完成数据库字段与记录集字段数据成员变量的数据交换.下面介绍CRecordset 类中的比较常用的函数.2.2.1 CRecordset( )构造函数在开始处理一个记录集之前,需要构造一个新的CRecordset派生类的对象.CRecordset( )构造函数的原形为:CRecordset( CDatabase * pDatabase=NULL);其中pDatabase是指向CDatabase对象的指针,该CDatabase对象用来处理数据库.如果已经产生一个CDatabase对象,可以把CDatabase对象的指针传递给CRecordset 类的构造函数.另一方面,可把NULL传给CRecordset结构,这时,MFC使用被CRecordset:: GetDefaultConnect( )返回的连接字符串构建一个新的CDatabase对象且打开它.如果用MFC Class Wizard 产生一个CRecordset 类的派生类时,那么Class Wizard会在你选用的数据源的基础上重载GetDefaultConnect( )函数,这是一种有用的简捷方式,它不需要应用程序在构造自己的记录集之前构造并连接一个CDatabase对象.2.2.2 Open( )成员函数在构造了一个新的CRecordset对象后,调用该对象的Open( )成员函数以打开记录集.Open ( )成员函数的原形为:virtual BOOL Open(UNIT nOpenType=AFX_DB_USE_DEFAULT_TYPE,LPCTSTR lpszSQL=NULL,DWORD dwOptions=none);2.2.3 AddNew( )成员函数调用该函数为表中增加一条新记录作准备.AddNew( )成员函数的原形为:virtual void AddNew( );注意在加入一个新行之前,可以调用CRecordset::CanAppend( )简单查看该记录集对象是否允许添加新记录.接着调用CRecordset::AddNew( )创建一个新的空行,然后将记录集的成员变量设为想加入新行中的值.最后,必须调动CRecordset::Update( )成员函数来向数据库加入新行.2.2.4 Edit( )成员函数调用该函数以开始对当前记录的修改.Edit( )成员函数的原形为:virtual void Edit( );注意在修改当前记录时,可以调用CRecordset::CanUpdata( )查看记录集是否允许修改现有的行.接着调用CRecordset::Edit( )开始对当前记录行的修改过程,然后改变当前记录的成员变量值.最后,必须调动CRecordset::Update( )成员函数使数据库保存修改结果. 2.2.5 Delete( )成员函数调用该函数以删除当前记录.Delete( )成员函数的原形为:virtual void Delete( );注意在完成删除操作后,需要重新定位记录集,使用户仍然可以看到记录.一般重新定位记录集在下一条记录.2.2.6 Close( )成员函数调用该函数以关闭记录集对象,其原形为:virtual void Close( );3 开发MFC ODBC程序应用程序实例本例描述了运用MFC ODBC对数据库进行增加,修改和删除等操作的具体过程.1) 在应用程序中建立数据源.此时需要创建一个CDatabase对象,并使用其成员函数Open( )或OpenEx( )来建立该数据源的连接.如:CDatabase * pDb = new CDatabase; //建立CDatabase 对象pDb->OpenEx("DSN=test; UID=sa; PWD=123"); //打开数据源或pDb->Open("test", FALSE, FALSE,"ODBC;UID=sa;PWD=123",FALSE); //打开数据源2) 使用Class Wizard来创建CRecordset类的派生类CMyRecordset.3) 在应用程序中构造一个新的CRecordset派生类的对象.并向该对象发送一个指向要使用数据源的指针. 如:CMyRecordset * pRecordset=new CMyRecordset(pDb); //建立CRecordset 对象4) 调用CRecordset派生类的Open( )成员函数以打开记录集.如:pRecordset->Open(CRecordset::dynamic, //打开记录集"SELECT name,age FROM test", CRecordset::none);5) 利用CRecordset派生类的对象对数据库进行增加,修改和删除等操作.如:进行添加操作:if(pRecordset->CanAppend( )) //查看记录集对象是否允许添加新记录{pRecordset->AddNew(); //创建一个新的空行pRecordset->m_Name="Tom"; //新行的name列值pRecordset->m_Age=12; //新行的age列值pRecordset->Update(); //完成添加新行工作}进行修改操作:if(pRecordset->CanUpdate( )) //查看记录集对象是否允许更新{pRecordset->Edit(); //开始修改当前行pRecordset->m_Name="Marry"; //将当前行的name值改为"Marry"pRecordset->m_Age=14; //将当前行的age值改为14pRecordset->Update(); //完成修改当前行的工作}进行删除操作:pRecordset->Delete( ); //删除当前纪录pRecordset->MoveNext( ); //移动到下一条记录if( pRecordset->IsDeleted( )){pRecordset->MoveFirst( ); //如果最后一条记录被删除,则定位在第一条记录上}6) 当完成对数据源的操作后,调用Close( )函数关闭记录集和数据源连接.如:pRecordset->Close( ); //关闭记录集delete pRecordset; //释放记录集指针pDb->Close( ); //关闭数据源delete pDb; //释放数据源指针对多个记录集的操作与对单个记录集的操作类似,只是增加了CRecordset类的派生类.。

ODBC(开放式数据库连接)是一种使用SQL的程序设计接

ODBC(开放式数据库连接)是一种使用SQL的程序设计接

ODBC(开放式数据库连接)是一种使用SQL的程序设计接口,使用ODBC使数据库应用程序的编写者避免了与数据源相连接的复杂性。

利用ODBC技术使得程序员从具体的DBMS中解脱出来,从而可以减少软件开发的工作量,缩短开发周期,并提高效率和软件的可靠性。

这项技术目前已经得到了大多数DBMS厂商的广泛支持。

Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。

这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。

如果用户希望使用其他数据格式,则需要安装相应的ODBC驱动器及DBMS。

用户使用自己的DBMS数据库管理功能生成新的数据库模式后,就可以使用ODBC来登录数据源。

对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。

登录数据库的具体操作参见有关ODBC的联机帮助。

一、MFC提供的ODBC数据库类Visual C++的MFC基类库定义了几个数据库类。

在利用ODBC编程时,经常要使用到CDatabase(数据库类)、CRecordSet(记录集类)和CRecordView(可视记录集类)。

CDatabase类对象提供了对数据源的连接,通过它可以对数据源进行操作。

CRecordSet类对象提供了从数据源中提取出的记录集。

CRecordSet对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。

动态行集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图。

每种形式在记录集被打开时都提供一组记录,所不同的是,当在一个动态行集里滚动到一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来。

CRecordView类对象能以控件的形式显示数据库记录,这个视图是直接连到一个CRecordSet对象的表视图。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文由yyqyea贡献 doc1。

MFC 提供的 ODBC 数据库类 Visual C++的 MFC 基类库定义了几个数据库类。

在利用 ODBC 编程时,经常要使用到 CDatabase(数据库类)、CRecordSet(记录集类)和 CRecordView(可视记录集类)。

 CDatabase 类对象提供了对数据源的连接,通过它可以对数据源进行操作。

 CRecordSet 类对象提供了从数据源中提取出的记录集。

CRecordSet 对象通常用于两种 形式:动态行集(dynasets)和快照集(snapshots)。

动态行集能与其他用户所做的更改保持同 步,快照集则是数据的一个静态视图。

每种形式在记录集被打开时都提供一组记录,所不同的 是,当在一个动态行集里滚动到一条记录时,由其他用户或应用程序中的其他记录集对该记 录所做的更改会相应地显示出来。

 CRecordView 类对象能以控件的形式显示数据库记录,这个视图是直接连到一 个 CRecordSet 对象的表视图。

 二、应用 ODBC 编程 应用 Visual C++的 AppWizard 可以自动生成一个 ODBC 应用程序框架,步骤是:打开 File 菜单的 New 选项,选取 Projects,填入工程名,选择 MFC AppWizard (exe),然后按 AppWizard 的提示进行操作。

 当 AppWizard 询问是否包含数据库支持时,如果想读写数据库,那么选定 Database view with file support;如果想访问数据库的信息而不想写回所做的改变,那么选定 Database view without file support。

 选好数据库支持之后,Database Source 按钮会被激活,选中它去调用 Data Options 对话 框。

在 Database Options 对话框中会显示出已向 ODBC 注册的数据库资源,选定所要操作的 数据库,如:Super_ES,单击 OK 后出现 Select Database Tables 对话框,其中列举了选中的数据 库包含的全部表;选择要操作的表后,单击 OK。

在选定了数据库和数据表之后,就可以按照惯 例继续进行 AppWizard 操作。

 特别需要指出的是:在生成的应用程序框架 View 类(如:CSuper_ESView)中,包含一个指 向 CSuper_ESSet 对象的指针 m_pSet,该指针由 AppWizard 建立,目的是在视表单和记录集 之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。

 要使程序与数据源建立联系,需用 CDateBase::OpenEx()或 CDatabase::Open()函数来 进行初始化。

数据库对象必须在使用它构造记录集对象之前初始化。

 三、实例 1.查询记录 查 询 记 录 使 用 CRecordSet::Open() 和 CRecordSet::Requery() 成 员 函 数 。

 在 使 用 CRecordSet 类对象之前,必须使用 CRecordSet::Open()函数来获得有效的记录集。

一旦已经 使用过 CRecordSet::Open()函数,再次查询时就可以应用 CRecordSet::Requery()函数。

 在调用 CRecordSet::Open()函数时,如果将一个已经打开的 CDatabase 对象指针传给 CRecordSet 类对象的 m_pDatabase 成员变量,则使用该数据库对象建立 ODBC 连接;否则如 果 m_pDatabase 为空指针,就新建一个 CDatabase 类对象,并使其与缺省的数据源相连,然后 进行 CRecordSet 类对象的初始化。

缺省数据源由 GetDefaultConnect()函数获得。

也可以提 供 所 需 要 的 SQL 语 句 , 并 以 它 来 调 用 CRecordSet::Open() 函 数 , 例 如:Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL); 如果没有指定参数,程序则使用缺省的 SQL 语句,即对在 GetDefaultSQL()函数中指定的 SQL 语句进行操作: CString CSuper_ESSet::GetDefaultSQL() {return _T(″[BsicData],[MinSize]″);} 对于 GetDefaultSQL()函数返回的表名,对应的缺省操作是 SELECT 语句,即: SELECT *FROM BasicData,MainSize 在查询过程中,也可以利用 CRecordSet 的成员变量 m_strFilter 和 m_strSort 来执行条件 查 询 和 结 果 排 序 。

 m_strFilter 为 过 滤 字 符 串 , 存 放 着 SQL 语 句 中 WHERE 后 的 条 件 串;m_strSort 为排序字符串,存放着 SQL 语句中 ORDER BY 后的字符串。

如: Super_ESSet.m_strFilter=″TYPE=‘电动机’″; Super_ESSet.m_strSort=″VOLTAGE″; Super_ESSet.Requery(); 对应的 SQL 语句为: SELECT *FROM BasicData,MainSize WHERE TYPE=‘电动机’ ORDER BY VOLTAGE 除了直接赋值给 m_strFilter 以外,还可以使用参数化。

利用参数化可以更直观、更方便 地完成条件查询任务。

使用参数化的步骤如下: S 声明参变量: CString p1; float p2; S 在构造函数中初始化参变量: p1=_T(″″); p2=0.0f; m_nParams=2; S 将参变量与对应列绑定: pFX->SetFieldType(CFieldExchange::param) RFX_Text(pFX,_T(″P1″),p1); RFX_Single(pFX,_T(″P2″),p2); 完成以上步骤后就可以利用参变量进行条件查询: m_pSet->m_strFilter=″TYPE=? AND VOLTAGE=?″;m_pSet->p1=″电动机″; m_pSet->p2=60.0; m_pSet->Requery(); 参变量的值按绑定的顺序替换查询字串中的“?”通配符。

 如果查询的结果是多条记录,可以用 CRecordSet 类的函数 Move()、MoveNext()、 MovePrev()、MoveFirst()和 MoveLast()来移动光标。

 2.增加记录 增加记录使用 AddNew()函数,要求数据库必须是以允许增加的方式打开: m_pSet->AddNew(); //在表的末尾增加新记录 m_pSet->SetFieldNull(&(m_pSet->m_type), FALSE); m_pSet->m_type=″电动机″; …… //输入新的字段值 m_pSet->Update(); //将新记录存入数据库 m_pSet->Requery(); //重建记录集 3.删除记录 可以直接使用 Delete()函数来删除记录,并且在调用 Delete()函数之后不需调用 Update() 函数: m_pSet->Delete(); if (!m_pSet->IsEOF()) m_pSet->MoveNext(); else m_pSet->MoveLast(); 4.修改记录 修改记录使用 Edit()函数: m_pSet->Edit(); //修改当前记录 m_pSet->m_type=″发电机″; //修改当前记录字段值 …… m_pSet->Update(); //将修改结果存入数据库 m_pSet->Requery(); 5.撤消操作 如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用 Update()函数之前 调用: CRecordSet::Move(AFX_MOVE_REFRESH)来撤消增加或修改模式,并恢复在增加或修 改模式之前的当前记录。

其中,参数 AFX_MOVE_REFRESH 的值为零。

 6.数据库连接的复用 在 CRecordSet 类中定义了一个成员变量 m_pDatabase: CDatabase* m_pDatabase; 它是指向对象数据库类的指针。

如果在 CRecordSet 类对象调用 Open()函数之前,将一 个已经打开的 CDatabase 类对象指针传给 m_pDatabase,就能共享相同的 CDatabase 类对 象。

如: CDatabase m_db; CRecordSet m_set1,m_set2; m_db.Open(_T(″Super_ES″)); //建立 ODBC 连接 m_set1.m_pDatabase=&m_db; //m_set1 复用 m_db 对象 m_set2.m_pDatabse=&m_db; // m_set2 复用 m_db 对象 7.SQL 语句的直接执行 虽然我们可以通过 CRecordSet 类完成大多数的查询操作,而且在 CRecordSet::Open() 函数中也可以提供 SQL 语句,但是有时候我们还是希望进行一些其他操作,例如建立新表、 删 除表、建立新的字段等,这时就需要使用 CDatabase 类直接执行 SQL 语句的机制。

通过调用 CDatabase::ExecuteSQL()函数来完成 SQL 语句的直接执行: BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL) {TRY {m_pdb->ExecuteSQL(strSQL); //直接执行 SQL 语句} CATCH (CDBException,e) {CString strMsg; strMsg.LoadString(IDS_EXECUTE_SQL_FAILED); strMsg+=strSQL; return FALSE;} END_CATCH return TRUE;} 应当指出的是,由于不同的 DBMS 提供的数据操作语句不尽相同,直接执行 SQL 语句可能 会破坏软件的 DBMS 无关性,因此在应用中应当慎用此类操作。

 8.动态连接表 表的动态连接可以利用在调用 CRecordSet::Open()函数时指定 SQL 语句来实现。

同一 个记录集对象只能访问具有相同结构的表,否则查询结果将无法与变量相对应。

相关文档
最新文档