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对象的表视图。

VC++数据库编程之MFC+ODBC

VC++数据库编程之MFC+ODBC

VC++数据库编程之MFC+ODBC在vc中,使用ODBC连接是数据库有两种方法,第一种就是使用ODBC API,第二种就是使用MFC ODBC,在这里我只谈一下MFCODBC。

为了使数据库开发变得更方便,Microsoft对ODBC API进行的封装,使得我们开发数据库时可以直接使用MFC ODBC类:CDatabase:建立与数据源的连接 CRecordset:获取记录集CRecordView:提供一个表单视图与某个记录集直接相连,利用对话框数据交换机制(DDX)在记录集与表单视图的空间之间传输数据CFieldExchange:支持记录字段数据交换(DFX),即记录集字段数据成员与相应的数据库的表的字段之间的数据交换CDBException:ODBC的异常类一、在实际开发中,使用MFC ODBC类访问数据库步骤如下: a . 使用CDatabase类方法打开数据源:定义CDatabase对象m_db;调用其OpenEx方法打开数据源,OpenEx原型如下:virtual BOOL OpenEx( LPCTSTR lpszConnectString, DWORD dwOptions=0 );参数一为连接字串:如\为数据源名称,注意到如果为lpszConnectString传递NULL,则将出现数据源对话框,提示用户选择一个数据源。

参数二为打开方式,缺省值0表示以共享方式打开数据库,带有写访问,不装入ODBC 游标库DLL,并且只有在没有足够信息形成连接时显示ODBC连接对话框。

可选参数如下:CDatabase::openExclusive:此类库版本不支持。

为共享数据源总是打开的。

如果选定此选项,断言失败。

CDatabase::openReadOnly:以只读方式打开CDatabase::UseCursorLib 装入ODBC游标库DLL。

游标掩盖了基础ODBC驱动程序的一些功能,有效地阻止使用动态集(如果驱动程序支持它们)。

MFC_ODBC访问数据库

MFC_ODBC访问数据库

主要内容撒:的撒旦将ODBC API封装在类CDatabase、CRecordSet、CFieldExchange、CRecordView和CDBException中使用MFC ODBC开发数据库应用程序的一般步骤使用AppWizard访问数据库使用类CDatabase连接数据库使用类CRecordSet打开记录集、获取数据使用类CRecordSet的函数MoveFirst()、MoveLast()、MoveNext()、MovePrev()、IsBOF()和IsEOF()进行记录集的遍历使用类CRecordSet的函数AddNew和Update增加记录使用类CRecordSet 的函数Edit和Update修改记录使用类CRecordSet的函数Delete删除记录使用类CDatabase的函数ExecuteSQL直接执行SQL命令使用类CDatabase 的函数BeginTrans、CommitTrans和Rollback处理事务目录MFC OBDC技术 (3)概述 (3)CDatabase类操作数据源 (3)CFieldExchange类处理数据交换 (6)CRecordView类显示记录 (6)CDBException类处理异常 (7)使用MFC ODBC编程建立应用程序 (7)MFC ODBC编程模型概述 (7)通过AppWizard建立数据库应用程序 (8)使用CDatabase类方法打开数据源 (8)使用CRecordste类打开记录集 (10)绑定记录集 (12)参数化记录集和查询 (13)遍历记录集合 (15)书签定位和绝对定位 (16)获取记录集的数据 (18)添加记录 (19)删除记录 (21)修改记录 (21)直接执行SQL语句(增加、删除表等) (22)事务处理 (23)使用多记录集 (25)MFC OBDC技术概述MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的调用接口。

ODBC和ADO

ODBC和ADO

MFC 中的 ODBC 类和 ADO 类1、MFC 的 ODBC 类:MFC 的 ODBC 类对较复杂的 ODBC API 进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。

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

1、MFC 的 ODBC 类主要包括:1.1、CDatabase 类:主要是建立与数据源的连接。

为了使用 CDatabase 类,必须包含以下头文件: #include <afxdb.h>1.1.1、数据成员:HDBC M_hdbc ; // 是对数据源的开放数据库连接 (ODBC) 的连接句柄,用来表示某次 ODBC 数据源的连接。

1.1.2、成员函数:1.1.2.1、CDatabase() :构造函数构造一个 CDatabase 对象,必须通过调用 OpenEx 和 Open 初始化这个对象。

1.1.2.2、Open() 函数:函数原型: virtual BOOL Open(LPCSTR lpszDSN,BOOL bExclusive=FALSE,BOOL bReadOnly=FALSE,LPCSTR lpszConnect=”ODBC;”,BOOL bUseCursorLib=TRUE);throw(CDBException,CmemoryException);如果成功形成连接,则返回非 0 值。

功能:打开新构造的 CDatabase 对象,并将它初始化。

1.1.2.3、OpenEx() 函数:函数原型: virtual BOOL OpenEx(LPCSTR lpszConnectString,DWORD dwOption=0);throw(CDBException,CmemoryExption);功能:建立到数据源的一个连接(通过 ODBC 驱动程序),打开一个新构造的 CDatabase 对象,并将它初始化。

基于ODBC的MFC数据库类及其应用

基于ODBC的MFC数据库类及其应用

基于ODBC的MFC数据库类及其应用
鲁佩云
【期刊名称】《电脑开发与应用》
【年(卷),期】2001(014)008
【摘要】通过ODBC驱动程序,允许终端用户在一个应用程序中访问不同数据库中的数据.MFC数据库类的目标就是要为程序员提供用于访问ODBC数据元的高级C++和Microsoft WindowsAPI,它是基于ODBC的,以保证最大的内部可操作性.用MFC可添加少量代码来完成一个很好的建立在各种ODBC类之上的数据库应用程序,并可在此基础上开发更完善、更实用的程序.
【总页数】2页(P39-40)
【作者】鲁佩云
【作者单位】湖北省经济管理干部学院,武汉,430073
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于ARX和MFC ODBC标准数据库数据交换的实现 [J], 陈福兰;刘强
2.ODBC技术解析与MFC ODBC实例应用 [J], 代伟;刘敏;冯文武
3.基于ODBC的Visual C++5.0 MFC数据库应用程序设计 [J], 杨喜中
4.基于MFC ODBC的光伏发电数据库系统的实现 [J], 袁茂荣
5.基于MFC ODBC的有限元分析数据处理 [J], 靳小俊
因版权原因,仅展示原文概要,查看原文内容请购买。

VC数据库编程之MFC ODBC连接

VC数据库编程之MFC ODBC连接

VC数据库编程之MFC ODBC连接VC数据库编程的方法有很多,下面介绍MFC ODBC连接的方法。

MFC ODBC是MFC对ODBC进行的封装,以简化对ODBC API的调用,从而实现面向对象的数据库编程接口.MFC ODBC的封装主要开发了CDatabase类和CRecordSet类(1) CDatabase类CDatabase类用于应用程序建立同数据源的连接。

CDatabase类中包含一个m_hdbc变量,它代表了数据源的连接句柄。

如果要建立CDatabase类的实例,应先调用该类的构造函数,再调用Open函数,通过调用,初始化环境变量,并执行与数据源的连接。

在通过Close函数关闭数据源。

CDatabase类提供了对数据库进行操作的函数及事务操作。

(2) CRecordSet类CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,以实现对数据集的数据操作。

CRecordSet类的成员变量m_hstmt代表了定义该记录集的SQL语句句柄,m_nFields为记录集中字段的个数,m_nParams为记录集所使用的参数个数。

CRecordSet的记录集通过CDatabase实例的指针实现同数据源的连接,即CRecordSet的成员变量m_pDatabase.MFC ODBC编程更适合于界面型数据库应用程序的开发,但由于CDatabase类和CRecordSet类提供的数据库操作函数有限,支持的游标类型也有限,限制了高效的数据库开发。

在编程层次上属于高级编程。

应用实例:1.打开数据库CDatabase database;database.OpenEx( _T( "DSN=zhuxue" ),CDatabase::noOdbcDialog);//zhuxue 为数据源名称2.关联记录集CRecordset recset(&database);3.查询记录CString sSql1="";sSql1 = "SELECT * FROM tablename" ;recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly); int ti=0;CDBVariant var;//var可以转换为其他类型的值while (!recset.IsEOF()){//读取Excel内部数值recset.GetFieldValue("id",var);jiangxiang[ti].id=var.m_iVal;recset.GetFieldValue("name", jiangxiang[ti].name);ti++;recset.MoveNext();}recset.Close();//关闭记录集4.执行sql语句CString sSql="";sSql+="delete * from 院系审核";//清空表database.ExecuteSQL(sSql);sSql也可以为Insert ,Update等语句5.读取字段名sSql = "SELECT * FROM Sheet1" ; //读取的文件有Sheet1表的定义,或为本程序生成的表.// 执行查询语句recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);int excelColCount=recset.GetODBCFieldCount();//列数CString excelfield[30];//得到记录集的字段集合中的字段的总个数for( i=0;i {CODBCFieldInfo fieldinfo;recset.GetODBCFieldInfo(i,fieldinfo);excelfield[i].name =fieldinfo.m_strName;//字段名}6.打开excel文件CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动CString sSql,sExcelFile; //sExcelFile为excel的文件路径TRY{// 创建进行存取的字符串sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CRE ATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);// 创建数据库 (既Excel表格文件)if( database.OpenEx(sSql,CDatabase::noOdbcDialog) ){//可以把excel作为一个数据库操作}}catch(e){TRACE1("Excel驱动没有安装: %s",sDriver); AfxMessageBox("读取失败,请检查是否定义数据区Sheet1"); }。

MFC用ODBC方法连接mysql

MFC用ODBC方法连接mysql

VS2010 MFC用ODBC方法连接MYSQL教程1.安装mysql(已安装完的同学可以直接跳过这一步)既然要连接mysql,我们当然要安装mysql,这里附一个链接,下载最新版本的mysql:/downloads/mysql/,下载完之后就需要配置环境变量,按照下面的方法来将mysql路径添加到mysql环境变量中:右键,点击“我的电脑”-“属性”-“高级”-“环境变量”-“系统变量”-新建,变量名为MYSQL_HOME,然后变量值输入你的mysql安装中bin文件的路径,例如我的安装路径为:D:\InsInEnglish\MySQL\mysql-5.6.16-win32\mysql-5.6.16-win32\bin,截图如下:之后再系统变量中的path变量下添加我们刚刚新建的变量(MYSQL_HOME),形式为:%MYSQL_HOME%;注意不能少了百分号和后面的分号,到此,配置完成,然后点击确定。

截图如下:添加完毕之后,打开到你mysql安装的目录下bin目录下,里面有一个mysqlld.exe的可执行文件,点击执行,之后再打开cmd命令行,输入:mysql–u –p之后按回车键,配置成功的截图如下:2.建立数据库(已经建立好数据库的同学可以跳过这一步)建立数据库用sql语言显然是繁琐的,但是如果有了mysql workbench,做数据库就方便多了,附上mysql workbench的下载地址:/downloads/tools/workbench/下载之后安装,推荐和mysql 安装在同一个文件中,方便使用和管理,然后打开mysql,界面如下:左上角MySQL Connections中有个“+”的图标,点击这个图标,即新建连接,之后输入连接的名字-Test,如果要输入密码,就输入一个密码,然后点击确定,就会出现上图中名字为Test的一个连接,单击之后进入这个连接。

如下图所示:我们看到左下角有英文SCHEMAS,下面可以看到我们创建的数据库,我用的是大写的Test,到了这里面,系统自动改过来了,名字是test,如下图:Test里面可以看到Tables,右键单击,选择Creat tables,这样就可以创建表了,我创建了一个表,user,之后设置主键(PK),not null (NN)等等,之后点击apply(应用),表示建立这个表,系统会给你看相应的sql语言,点击apply,然后可以看到Tables下面已经有了user这个表了。

MFC数据库ODBC增加、删除、改、查询操作

MFC数据库ODBC增加、删除、改、查询操作

航班订票系统MFC数据库ODBC增加,删除,改,查询操作void CMyView::OnBtnAdd(){// TODO: Add your control notification handler code hereCAddDialog dlg;if(dlg.DoModal()==IDOK){if(dlg.m_arrive_city.IsEmpty()||dlg.m_arrive_time.IsEmpty()||dlg.m_body_id.IsEmpty()||dlg.m_book_person_name.IsEmpty()|| dlg.m_date.IsEmpty()||dlg.m_hbh.IsEmpty()||dlg.m_lanch_time.IsEmpty()||dlg.m_seat_level.IsEmpty()||dlg.m_start_city.IsEmpty() ){AfxMessageBox("有信息未填写,请填写完毕!");}else{m_pSet->AddNew();m_pSet->m_arrive_city=dlg.m_arrive_city;m_pSet->m_arrive_time=dlg.m_arrive_time;m_pSet->m_body_id=dlg.m_body_id;m_pSet->m_date=dlg.m_date;m_pSet->m_dingpiaoren=dlg.m_book_person_name;m_pSet->m_hbh=dlg.m_hbh;m_pSet->m_lanch_time=dlg.m_lanch_time;m_pSet->m_seat_level=dlg.m_seat_level;m_pSet->m_start_city=dlg.m_start_city;m_pSet->Update();m_pSet->Requery();AfxMessageBox("订票成功!");UpdateData(false);}}/* if(dlg.DoModal()==IDOK){if(dlg.m_addnum.IsEmpty()||dlg.m_addpsw.IsEmpty()){}m_pSet->AddNew();m_pSet->m_column1 = dlg.m_addnum;m_pSet->m_column2 = dlg.m_addpsw;m_pSet->Update();m_pSet->Requery();AfxMessageBox("已经添加"+dlg.m_addnum+"密码为"+dlg.m_addpsw); UpdateData(false); */}//DEL void CMyView::OnBtnAsure()//DEL {//DEL // TODO: Add your control notification handler code here//DEL//DEL }void CMyView::OnBtnChange(){// TODO: Add your control notification handler code hereCAddDialog dlg;dlg.m_arrive_city=m_pSet->m_arrive_city;dlg.m_arrive_time=m_pSet->m_arrive_time;dlg.m_body_id=m_pSet->m_body_id;dlg.m_date= m_pSet->m_date;dlg.m_book_person_name= m_pSet->m_dingpiaoren;dlg.m_hbh= m_pSet->m_hbh;dlg.m_lanch_time=m_pSet->m_lanch_time;dlg.m_seat_level=m_pSet->m_seat_level;dlg.m_start_city=m_pSet->m_start_city;if(dlg.DoModal()==IDOK){if(dlg.m_hbh.IsEmpty()||dlg.m_book_person_name.IsEmpty()){AfxMessageBox("航班号,乘客姓名,身份证,不能为空!");}else{m_pSet->Edit();m_pSet->m_arrive_city=dlg.m_arrive_city;m_pSet->m_arrive_time=dlg.m_arrive_time;m_pSet->m_body_id=dlg.m_body_id;m_pSet->m_date=dlg.m_date;m_pSet->m_dingpiaoren=dlg.m_book_person_name;m_pSet->m_hbh=dlg.m_hbh;m_pSet->m_lanch_time=dlg.m_lanch_time;m_pSet->m_seat_level=dlg.m_seat_level;m_pSet->m_start_city=dlg.m_start_city;m_pSet->Update();m_pSet->Requery();AfxMessageBox("已经修改票成功!");UpdateData(false);}}}void CMyView::OnBtnRollBack(){// TODO: Add your control notification handler code hereif(AfxMessageBox("真的要退票吗",MB_OKCANCEL)==IDCANCEL) return;else{if(m_pSet->IsEOF()){AfxMessageBox("没有票可以退?");}else{m_pSet->Delete();if(m_pSet->IsEOF())m_pSet->MoveLast();else m_pSet->MoveNext();m_pSet->Requery();UpdateData(false);AfxMessageBox("退票成功!");}}}void CMyView::OnBtnSearchInfo(){// TODO: Add your control notification handler code here/* CDlgQuery Dlgquery;CString value;if(Dlgquery.DoModal()==IDOK){value="职工编号=+"+Dlgquery.m_query+"";m_pSet->m_strFilter=value;m_pSet->Requery();UpdateData(FALSE);}*/CSearchDlg search;CString str;if(search.DoModal()==IDOK){// str="订票人="+search.m_C_NAME+"and 身份证号="+search.m_C_SFZ+""; /* str.Format("订票人=%s and 身份证号=%s",search.m_C_NAME,search.m_C_SFZ);m_pSet->m_strFilter=str;m_pSet->Requery();UpdateData(FALSE);*//* m_pSet->m_strFilter="订票人=? and 身份证号= ?";m_pSet->m_dingpiaoren=search.m_C_NAME;m_pSet->m_body_id=search.m_C_SFZ;*/str.Format("身份证号= %s%s%s","'",search.m_C_SFZ,"'");m_pSet->m_strFilter=str;m_pSet->Requery();UpdateData(FALSE);}}。

  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 语句来实现。

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

相关文档
最新文档