把Oracle数据库编写到OLEDB的程序

数据库 Oracle
下面的文章主要是介绍如何使用OLEDB来编写Oracle数据库的实际应用程序的相关实例的描述,以下就是正文的相关内容的描述。

我们都知道Oracle数据库的服务端编程主要是使用OLE DB等一些方法。Oracle数据库的编程的运用的过程中,我们需要掌握的是一些关于访问数据库技术方法,还需要注意怎么设计高效的数据库、数据库管理与运行的优化、数据库语句的优化。

使用OLEDB编写Oracle数据库应用程序的应用实例:

1 概述

 

OLE DB的存在为用户提供了一种统一的方法来访问所有不同种类的数据源。OLE DB可以在不同的数据源中进行转换。利用OLE DB,客户端的开发人员在进行数据访问时只需把精力集中在很少的一些细节上,而不必弄懂大量不同数据库的访问协议。

 

OLE DB是一套通过COM接口访问数据的ActiveX接口。这个OLE DB接口相当通用,足以提供一种访问数据的统一手段,而不管存储数据所使用的方法如何。同时,OLE DB还允许开发人员继续利用基础数据库技术的优点,而不必为了利用这些优点而把数据移出来。

 

2 使用ATL使用OLE DB数据使用程序

 

由于直接使用OLE DB的对象和接口设计数据库应用程序需要书写大量的代码。为了简化程序设计,Visual C++提供了ATL模板用于设计OLE DB数据应用程序和数据提供程序。

 

利用ATL模板可以很容易地将OLE DB与MFC结合起来,使Oracle数据库的参数查询等复杂的编程得到简化。MFC提供的数据库类使OLE DB的编程更具有面向对象的特性。Viual C++所提供用于OLE DB的ATL模板可分为数据提供程序的模板和数据使用程序的模板。

 

使用ATL模板创建数据应用程序一般有以下几步骤:

 

1)、 创建应用框架

 

2)、 加入ATL产生的模板类

 

3)、 在应用中使用产生的数据访问对象

 

3 不用ATL使用OLE DB数据使用程序

利用ATL模板产生数据使用程序较为简单,但适用性不广,不能动态适应Oracle数据库的变化。下面我们介绍直接使用MFC OLE DB类来生成数据使用程序。

 

模板的使用

 

OLE DB数据使用者模板是由一些模板组成的,包括如下一些模板,下面对一些常用类作一些介绍。

 

1)、 会话类

 

CDataSource类

 

CDataSource类与OLE DB的数据源对象相对应。这个类代表了OLE DB数据提供程序和数据源之间的连接。只有当数据源的连接被建立之后,才能产生会话对象,可以调用Open来打开数据源的连接。

 

CSession类

 

CSession所创建的对象代表了一个单独的Oracle数据库访问的会话。一个用CDataSource类产生的数据源对象可以创建一个或者多个会话,要在数据源对象上产生一个会话对象,需要调用函数Open()来打开。同时,会话对象还可用于创建事务操作。

 

CEnumeratorAccessor类

 

CEnumeratorAccessor类是用来访问枚举器查询后所产生的行集中可用数据提供程序的信息的访问器,可提供当前可用的数据提供程序和可见的访问器。

 

2)、 访问器类

 

CAcessor类

 

CAccessor类代表与访问器的类型。当用户知道数据库的类型和结构时,可以使用此类。它支持对一个行集采用多个访问器,并且,存放数据的缓冲区是由用户分配的。

 

CDynamicAccessor类

 

CDynamicAccessor类用来在程序运行时动态的创建访问器。当系统运行时,可以动态地从行集中获得列的信息,可根据此信息动态地创建访问器。

 

CManualAccessor类

 

CManualAccessor类中以在程序运行时将列与变量绑定或者是将参数与变量捆定。

 

3)、 行集类

 

CRowSet类

 

CRowSet类封装了行集对象和相应的接口,并且提供了一些方法用于查询、设置数据等。可以用Move()等函数进行记录移动,用GetData()函数读取数据,用Insert()、Delete()、SetData()来更新数据。

 

CBulkRowset类

 

CBulkRowset类用于在一次调用中取回多个行句柄或者对多个行进行操作。

 

CArrayRowset类

 

CArrayRowset类提供用数组下标进行数据访问。

 

4)、 命令类

 

CTable类

 

CTable类用于对Oracle数据库的简单访问,用数据源的名称得到行集,从而得到数据。

 

CCommand类

 

CCommand类用于支持命令的数据源。可以用Open()函数来执行SQL命令,也可以Prepare()函数先对命令进行准备,对于支持命令的数据源,可以提高程序的灵活性和健壮性。

 

在stdafx.h头文件里,加入如下代码。

 

 

  1. #include <atlbase.h> 
  2. extern CComModule _Module;  
  3. #include <atlcom.h> 
  4. #include <atldbcli.h> 
  5. #include <atldbsch.h> // if you are using schema templates 

 

 

在stdafx.cpp文件里,加入如下代码。

 

 

  1. #include <atlimpl.cpp> 
  2. CComModule _Module; 

 

 

决定使用何种类型的存取程序和行集。

 

获取数据

 

在打开数据源,会话,行集对象后就可以获取数据了。所获取的数据类型取决于所用的存取程序,可能需要绑定列。按以下步骤。

 

1、 用正确的命令打开行集对象。

 

2、 如果使用CManualAccessor,在使用之前与相应列进行绑定。要绑定列,可以用函数GetColumnInfo,如下所示:

 

 

  1. // Get the column information  
  2. ULONG ulColumns = 0;  
  3. DBCOLUMNINFO* pColumnInfo = NULL;  
  4. LPOLESTR pStrings = NULL;  
  5. if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)  
  6. AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo);  
  7. struct MYBIND* pBind = new MYBIND[ulColumns];  
  8. rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);  
  9. for (ULONG l=0; l<ulColumns; l++)  
  10. rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, 
    &pBind[l].szValue, NULL, &pBind[l].dwStatus);  
  11. rs.Bind(); 

 

 

3、 用while循环来取数据。在循环中,调用MoveNext来测试光标的返回值是否为S_OK,如下所示:

 

 

  1. while (rs.MoveNext() == S_OK)  
  2. {  
  3. // Add code to fetch data here  
  4. // If you are not using an auto accessor, call rs.GetData()  

 

 

4、 在while循环内,可以通过不同的存取程序获取数据。

 

1) 如果使用的是CAccessor类,可以通过使用它们的数据成员进行直接访问。如下所示:

 

2) 如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 类,可以通过GetValue或GetColumn函数来获取数据。可以用GetType来获取所用数据类型。如下所示:

 

 

  1. while (rs.MoveNext() == S_OK)  
  2. {  
  3. // Use the dynamic accessor functions to retrieve your  
  4. // data  
  5. ULONG ulColumns = rs.GetColumnCount();  
  6. for (ULONG i=0; i<ulColumns; i++)  
  7. {  
  8. rs.GetValue(i);  
  9. }  

 

 

3) 如果使用的是CManualAccessor,可以指定自己的数据成员,绑定它们。就可以直接存取。如下所示:

 

 

  1. while (rs.MoveNext() == S_OK)  
  2. {  
  3. // Use the data members you specified in the calls to  
  4. // AddBindEntry.  
  5. wsprintf("%s", szFoo);  

 

 

决定行集的数据类型

 

在运行时决定数据类型,要用动态或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函数得到行集的列信息。从这里可以得到数据类型。

 

4 总结

 

由于现在有多种数据源,,想要对这些数据进行访问管理的***途径就是通过一些同类机制来实现,如OLE DB。高级OLE DB结构分成两部分:客户和提供者。客户使用由提供者生成的数据。

 

就像其它基于COM的多数结构一样,OLE DB的开发人员需要实现很多的接口,其中大部分是模板文件。

 

当生成一个客户对象时,可以通过ATL对象向导指向一个数据源而创建一个简单的客户。ATL对象向导将会检查数据源并创建Oracle数据库的客户端代理。从那里,可以通过OLE DB客户模板使用标准的浏览函数。

 

当生成一个提供者时,向导提供了一个很好的开端,它们仅仅是生成了一个简单的提供者来列举某一目录下的文件。然后,提供者模板包含了OLE DB支持的完全补充内容。在这种支持下,用户可以创建OLE DB提供者,来实现行集定位策略、数据的读写以及建立书签。

 

 【编辑推荐】

  1. Oracle创建Split 与Map 函数的代码示例
  2. Oracle索引整理的详细描述
  3. Oracle 权限入门如何管理
  4. Oracle 10G for linux常用命令浅析
  5. Oracle数据库中归档进程ARCH的详细阐述
责任编辑:佚名 来源: 博客园
相关推荐

2011-07-13 10:36:53

Delphi

2010-04-22 11:58:00

Oracle数据库

2009-07-31 17:07:40

ASP.NET数据库连

2009-01-14 10:12:04

Oracle编写事务Oracle控制机制Oracle数据库

2010-06-12 12:45:14

高效MySQL数据库

2011-03-24 13:09:11

数据库代码

2010-05-14 10:39:32

MySQL数据库

2010-04-23 09:23:44

Oracle 数据库

2011-05-26 10:30:12

Oracle数据库约束

2015-08-21 12:59:38

Oracle数据库

2011-03-10 13:24:26

2010-04-22 16:16:35

Oracle数据库

2011-03-16 08:54:45

Oracle数据库索引

2011-05-19 13:25:14

Oracle数据库

2009-09-02 14:55:19

Oracle数据库

2011-05-26 14:43:49

ORACLE数据库异常处理

2010-04-14 08:49:43

Oracle数据库系统

2010-04-16 15:05:10

Oracle数据库

2022-04-25 14:41:15

甲骨文数据库机数据库

2011-08-23 15:16:54

OracleMySQL
点赞
收藏

51CTO技术栈公众号