使用OLEDB编写数据库应用程序

使用OLE DB
5.1    概述
OLE DB的存在为用户提供了一种统一的方法来访问所有不同种类的数据源。OLE DB可以在不同的数据源中进行转换。利用OLE DB,客户端的开发人员在进行数据访问时只需把精力集中在很少的一些细节上,而不必弄懂大量不同数据库的访问协议。
OLE DB是一套通过COM接口访问数据的ActiveX接口。这个OLE DB接口相当通用,足以提供一种访问数据的统一手段,而不管存储数据所使用的方法如何。同时,OLE DB还允许开发人员继续利用基础数据库技术的优点,而不必为了利用这些优点而把数据移出来。
5.2    使用ATL使用OLE DB数据使用程序
由于直接使用OLE DB的对象和接口设计数据库应用程序需要书写大量的代码。为了简化程序设计,Visual C++提供了ATL模板用于设计OLE DB数据应用程序和数据提供程序。
利用ATL模板可以很容易地将OLE DB与MFC结合起来,使数据库的参数查询等复杂的编程得到简化。MFC提供的数据库类使OLE DB的编程更具有面向对象的特性。Viual C++所提供用于OLE DB的ATL模板可分为数据提供程序的模板和数据使用程序的模板。
使用ATL模板创建数据应用程序一般有以下几步骤:
1、 创建应用框架
2、 加入ATL产生的模板类
3、 在应用中使用产生的数据访问对象

5.3 不用ATL使用OLE DB数据使用程序
利用ATL模板产生数据使用程序较为简单,但适用性不广,不能动态适应数据库的变化。下面我们介绍直接使用MFC OLE DB类来生成数据使用程序。
模板的使用
OLE DB数据使用者模板是由一些模板组成的,包括如下一些模板,下面对一些常用类作一些介绍。
1、 会话类
CDataSource类
CDataSource类与OLE DB的数据源对象相对应。这个类代表了OLE DB数据提供程序和数据源之间的连接。只有当数据源的连接被建立之后,才能产生会话对象,可以调用Open来打开数据源的连接。
CSession类
CSession所创建的对象代表了一个单独的数据库访问的会话。一个用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类用于对数据库的简单访问,用数据源的名称得到行集,从而得到数据。
CCommand类
CCommand类用于支持命令的数据源。可以用Open()函数来执行SQL命令,也可以Prepare()函数先对命令进行准备,对于支持命令的数据源,可以提高程序的灵活性和健壮性。
在stdafx.h头文件里,加入如下代码。
#include <atlbase.h>
extern CComModule _Module;
#include <atlcom.h>
#include <atldbcli.h>
#include <atldbsch.h> // if you are using schema templates
在stdafx.cpp文件里,加入如下代码。
#include <atlimpl.cpp>
CComModule _Module;
决定使用何种类型的存取程序和行集。
获取数据
在打开数据源,会话,行集对象后就可以获取数据了。所获取的数据类型取决于所用的存取程序,可能需要绑定列。按以下步骤。
1、 用正确的命令打开行集对象。
2、 如果使用CManualAccessor,在使用之前与相应列进行绑定。要绑定列,可以用函数GetColumnInfo,如下所示:
// Get the column information
ULONG ulColumns      = 0;
DBCOLUMNINFO* pColumnInfo  = NULL;
LPOLESTR pStrings      = NULL;
if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)
AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo);
struct MYBIND* pBind = new MYBIND[ulColumns];
rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);
for (ULONG l=0; l<ulColumns; l++)
rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue, NULL, &pBind[l].dwStatus);
rs.Bind();
3、 用while循环来取数据。在循环中,调用MoveNext来测试光标的返回值是否为S_OK,如下所示:
while (rs.MoveNext() == S_OK)
{
  // Add code to fetch data here
  // If you are not using an auto accessor, call rs.GetData()
}
4、 在while循环内,可以通过不同的存取程序获取数据。
1) 如果使用的是CAccessor类,可以通过使用它们的数据成员进行直接访问。如下所示:
2) 如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 类,可以通过GetValue或GetColumn函数来获取数据。可以用GetType来获取所用数据类型。如下所示:
while (rs.MoveNext() == S_OK)
{
  // Use the dynamic accessor functions to retrieve your
  // data
  ULONG ulColumns = rs.GetColumnCount();
  for (ULONG i=0; i<ulColumns; i++)
  {
    rs.GetValue(i);
  }
}
3) 如果使用的是CManualAccessor,可以指定自己的数据成员,绑定它们。就可以直接存取。如下所示:
while (rs.MoveNext() == S_OK)
{
  // Use the data members you specified in the calls to
  // AddBindEntry.
  wsprintf("%s", szFoo);
}
决定行集的数据类型
在运行时决定数据类型,要用动态或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函数得到行集的列信息。从这里可以得到数据类型。
5.4    总结
由于现在有多种数据源,,想要对这些数据进行访问管理的唯一途径就是通过一些同类机制来实现,如OLE DB。高级OLE DB结构分成两部分:客户和提供者。客户使用由提供者生成的数据。
就像其它基于COM的多数结构一样,OLE DB的开发人员需要实现很多的接口,其中大部分是模板文件。
当生成一个客户对象时,可以通过ATL对象向导指向一个数据源而创建一个简单的客户。ATL对象向导将会检查数据源并创建数据库的客户端代理。从那里,可以通过OLE DB客户模板使用标准的浏览函数。
当生成一个提供者时,向导提供了一个很好的开端,它们仅仅是生成了一个简单的提供者来列举某一目录下的文件。然后,提供者模板包含了OLE DB支持的完全补充内容。在这种支持下,用户可以创建OLE DB提供者,来实现行集定位策略、数据的读写以及建立书签。
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 如果要使用 OleDb 连接非本机的 Oracle 数据库,需要在连接字符串中指定数据库的 IP 地址和端口号。具体步骤如下: 1. 引用 OleDb 命名空间。 ```csharp using System.Data.OleDb; ``` 2. 创建连接字符串。 ```csharp string connectionString = "Provider=MSDAORA;Data Source=IP_ADDRESS:PORT/SERVICE_NAME;User ID=yourUsername;Password=yourPassword;"; ``` 其中,Data Source 中的 IP_ADDRESS 和 PORT 分别指定了要连接的数据库服务器的 IP 地址和端口号,SERVICE_NAME 指定了数据库的服务名或 SID。如果不知道服务名或 SID,可以在数据库服务器上运行命令 `lsnrctl status` 查看。 3. 创建 OleDbConnection 对象。 ```csharp OleDbConnection connection = new OleDbConnection(connectionString); ``` 4. 打开数据库连接。 ```csharp connection.Open(); ``` 5. 执行 SQL 命令。 ```csharp OleDbCommand command = new OleDbCommand("SELECT * FROM yourTable", connection); OleDbDataReader reader = command.ExecuteReader(); while (reader.Read()) { // 处理查询结果 } ``` 6. 关闭数据库连接。 ```csharp connection.Close(); ``` 需要注意的是,以上代码仅供参考,实际应用中可能需要根据具体情况进行调整。另外,如果使用的是 .NET Core,需要使用 Oracle 提供的 .NET Core 数据库驱动程序,而不是 OleDb。 ### 回答2: OleDb连接非本机的Oracle数据库的流程如下: 1. 安装Oracle客户端软件:在本地计算机上安装Oracle客户端软件,可以从Oracle官方网站下载并安装适合的版本。安装Oracle客户端软件后,可以使用其中的OleDb驱动程序来连接远程Oracle数据库。 2. 配置Oracle客户端软件:在安装完成后,需要配置Oracle客户端软件以便正确连接到远程Oracle数据库。配置的过程包括设置远程数据库的IP地址、端口号、用户名和密码等信息。 3. 编写连接代码:使用编程语言(如C#、VB.NET等)编写连接远程Oracle数据库的代码。在代码中引用OleDb命名空间,并创建OleDbConnection对象。然后,设置连接字符串,包括远程数据库的IP地址、端口号、数据库实例名、用户名和密码等信息。 4. 打开连接:使用OleDbConnection对象的Open方法来打开与远程Oracle数据库的连接。如果配置信息正确且网络正常,连接将成功建立。 5. 执行SQL语句:连接成功后,可以使用OleDbConnection对象创建OleDbCommand对象,并通过该对象执行SQL语句。可以执行查询、插入、更新等操作。 6. 关闭连接:执行完所需的操作后,应当使用OleDbConnection对象的Close方法来关闭与远程Oracle数据库的连接。 总结:OleDb连接非本机的Oracle数据库的流程涵盖了安装Oracle客户端软件、配置软件、编写连接代码、打开连接、执行SQL语句以及关闭连接等步骤。通过正确配置和编写代码,可以实现与远程Oracle数据库的连接和操作。 ### 回答3: OleDb是一种用于连接和操作数据库的API,可以通过它来连接非本机的Oracle数据库。下面是连接非本机Oracle数据库的流程: 1. 安装Oracle客户端软件:在本机上安装Oracle客户端软件。该软件可从Oracle官方网站上下载并按照安装向导进行安装。 2. 配置Oracle客户端软件:安装完成后,需要进行一些配置。打开Oracle客户端软件的目录,找到和安装相关的文件,例如 tnsnames.ora 或者 sqlnet.ora。 3. 编辑tnsnames.ora文件:打开tnsnames.ora文件,该文件包含了数据库的连接信息。在其中添加一个新的连接条目,包括数据库的名字、主机名、端口号等。 4. 测试连接:使用OleDb连接字符串指定新添加的连接条目,并进行连接测试。例如:Provider=OraOLEDB.Oracle;Data Source=连接条目名称;User ID=用户名;Password=密码; 5. 编写代码:使用OleDb API编写代码来连接数据库并执行相应的操作。首先,使用OleDbConnection对象建立与数据库的连接。然后,可以使用OleDbCommand对象执行SQL语句或存储过程。 6. 执行操作:编写相应的SQL语句或存储过程,使用OleDbCommand对象的ExecuteNonQuery、ExecuteScalar或ExecuteReader方法执行相应的操作。 7. 关闭连接:在完成操作后,使用OleDbConnection对象的Close方法关闭数据库连接。 需要注意的是,连接非本机的Oracle数据库需要正确配置Oracle客户端软件,并确保网络连通。此外,还需要提供正确的数据库连接信息,包括数据库的名字、主机名、端口号、用户名和密码等。以上是连接非本机Oracle数据库的简要流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值