使用Enterprise Library 5.0将Ref游标作为输出参数调用存储过程

时间:2014-11-26 13:00:33

标签: c# oracle enterprise-library

我是Oracle和Entlib的新手。

我已经编写了一些代码来调用存储过程,但是当我使用Ref cursor作为输出参数调用存储过程时会出现问题。

有没有人帮我提供一些示例代码来使用EntLib访问Oracle数据库中的存储过程,EntLib返回Ref游标作为输出参数?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以查看源代码中的测试。

首先定义cursor

create or replace PACKAGE PKGENTLIB_ARCHITECTURE
IS
TYPE CURENTLIB_ARCHITECTURE IS REF CURSOR;
END PKGENTLIB_ARCHITECTURE;

然后创建stored procedure

CREATE OR REPLACE PROCEDURE "GETCUSTOMERSVIEW" ( cur_OUT OUT PKGENTLIB_ARCHITECTURE.CURENTLIB_ARCHITECTURE)
    AS

BEGIN
   OPEN cur_OUT FOR
    SELECT *
    FROM Customers WHERE CustomerId in ('BLAUS','BLONP','BOLID')
    ORDER BY CustomerID;
END;
/

注意使用cur_out作为引用游标名称 - 这是必需的。

然后是c# code

    [TestMethod]
    [DeploymentItem(@"Testfiles\Customers.xml")]
    [DeploymentItem(@"Testfiles\Products.xml")]
    public void RecordsAreReturnedWhenUsingStoredProc()
    {
        Database db = DatabaseFactory.CreateDatabase("OracleTest");
        string spName = "GetCustomersView";
        using (IDataReader reader = db.ExecuteReader(CommandType.StoredProcedure, spName))
        {
            int columns = dsCustomers.Tables[0].Columns.Count;
            int i = 0;
            while (reader.Read())
            {
                for (int j = 0; j < columns; j++)
                {
                    Assert.AreEqual(dsCustomers.Tables[0].Rows[i][j].ToString().Trim(), reader[j].ToString().Trim());
                }
                i++;
            }
        }
    }

测试使用this configuration file

如果您使用的是ODP.NET,那么您可能希望从使用已弃用的System.Data.OracleClient切换到Oracle.DataAccess.Client。您需要使用EntlibContrib Oracle ODP.NET Data Provider。此外,您可以查看EntLibContrib Quickstart示例ODP.NET配置。