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






4.64/5 (10投票s)
2006年6月14日
2分钟阅读

96992

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 应用程序中运行良好。