65.9K
CodeProject 正在变化。 阅读更多。
Home

使用企业库 2.0 在 ASP.NET 2.0 应用程序中使用 Oracle 数据库实现动态连接字符串和游标处理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (10投票s)

2006年6月14日

2分钟阅读

viewsIcon

96992

downloadIcon

456

本文将探讨在 ASP.NET 2.0 应用程序中使用企业库 2.0 处理动态连接字符串和游标的一些解决方案,该应用程序使用 Oracle 数据库。

1. 引言

企业库是一个包含七个通用应用程序块的库,这些块是可重用、可扩展的源代码组件,为常见的开发挑战提供指导。 其最新的主要版本是 2006 年 1 月发布的企业库 2.0 (EL 2.0),它被重新设计为使用 .NET Framework 2.0 的新功能。 数据访问应用程序块 (DAAB) 是企业库中的应用程序块之一,它简化了实现常见数据访问功能的开发任务。

在我的使用 Oracle 数据库的 ASP.NET 2.0 项目中,选择了 EL 2.0 作为基础应用程序块。 这一决定遇到了以下挑战:一是关于动态连接字符串的问题,它将 Oracle 用户 ID、密码和数据库实例传递给 Oracle,而不是从 web.config 中检索静态连接字符串;另一个是处理 Oracle 存储过程返回的游标。

2. 动态连接字符串

EL 2.0 现在支持可以通过业务逻辑创建的动态连接字符串。 一个简单的例子如下,其中“_user_id”是 Oracle 用户 ID,“_password”是 Oracle 密码,而“_data_source”是 Oracle 数据库实例的名称。

string dBConnection = "USER ID=" + _user_id + 
       ";PASSWORD=" + _password + ";DATA SOURCE=" + _data_source;
Database odb = new OracleDatabase(dBConnection);
string sqlCommand = "Select * From your_table";
DbCommand dbCommand = odb.GetSqlStringCommand(sqlCommand);
DataSet ds = odb.ExecuteDataSet(dbCommand);

可以在一个包中的存储过程如下调用,其中“schema_name”是 Oracle 模式,“procedure_name”是包“package_name”中的存储过程名称。

Database odb = new OracleDatabase(dynamic_Connection_string);
DbCommand dbCommand = 
  odb.GetStoredProcCommand("schema_name.package_name.procedure_name");

您还可以使用接口 IOraclePackage 来访问 Oracle。

class OraclePackage : IOraclePackage
{
    string _name, _prefix;
    public OraclePackage()
    {
        _name = string.Empty;
        _prefix = string.Empty;
    }
    public OraclePackage(string name, string prefix)
    {
        _name = string.Empty;
        _prefix = string.Empty;
    }
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    public string Prefix
    {
        get { return _prefix; }
        set { _prefix = value; }
    }
}
IOraclePackage op = new OraclePackage(package_name, prefix);
IList<IOraclePackage> packages = new List<IOraclePackage>();
packages.Add(op);
OracleDatabase odb = new OracleDatabase(
   dynamic_Connection_string, packages);

3. 游标处理

游标是一种通过命名一个 "select 语句" 并操作该 SQL 语句中的信息来使用的机制。 .NET 通过 DataSet 处理 Oracle 返回的引用游标非常方便。 EL 2.0 以特殊的方式处理 Oracle 游标。 首先,我们需要声明一个引用游标,并且一个过程在过程规范中返回一个游标。 此引用游标的名称必须是“cur_OUT”,并且必须是“IN OUT”。

TYPE t_cursor IS REF CURSOR;
PROCEDURE get_data_set (
  cur_OUT   IN OUT t_cursor,
  o_retcode OUT    PLS_INTEGER,
  o_message OUT    VARCHAR2
);

然后,我们需要从数据库检索一个数据集,并在过程主体中返回一个引用游标。

PROCEDURE get_data_set (
  cur_OUT   IN OUT t_cursor,
  o_retcode OUT    PLS_INTEGER,
  o_message OUT    VARCHAR2)
IS
  v_cursor  t_cursor;
BEGIN
  BEGIN
    OPEN cur_OUT
    FOR
      SELECT * 
      FROM your_table
      WHERE your_condition;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      OPEN cur_OUT
      FOR
        SELECT * 
        FROM your_table
        WHERE 1 <> 1;
      o_retcode := -1;
      o_message := 'No Data Found';
      RETURN;
    WHEN OTHERS THEN
      o_retcode := SQLCODE;
      o_message := SQLERRM;
      RETURN;
  END;
  o_retcode := SQLCODE;
  o_message := 'selection is successful';
  EXCEPTION
    WHEN OTHERS THEN
      o_retcode := SQLCODE;
      o_message := SQLERRM;
END get_data_set;

在 .NET 端,我们不需要向 DbCommand 添加任何 IN/OUT 游标参数。 它可以自动为我们处理它们。

OracleDatabase odb = new OracleDatabase(dynamic_Connection_string);
DbCommand dbCommand = odb.GetStoredProcCommand("get_data_set");
odb.AddOutParameter(dbCommand, "o_retcode", DbType.Int32, 10);
odb.AddOutParameter(dbCommand, "o_message", DbType.String, 100);
DataSet ds = odb.ExecuteDataSet(dbCommand);

4. 结论

本文说明了我们在 ASP.NET 2.0 应用程序中使用企业库 2.0 处理动态连接字符串和游标的解决方案,这些应用程序使用 Oracle 数据库。 它们在我们的 Web 应用程序中运行良好。

© . All rights reserved.