c#从Oracle存储过程返回结果集并填充DataTable

时间:2009-08-20 10:21:42

标签: c# oracle stored-procedures ado.net odp.net

我是c#SQL Server开发人员 Oracle编程新手。下面的代码适用于将cmdText设置为:“select * from myTable”。我现在想把它放在一个存储过程中,我需要帮助来编写这个Oracle存储过程并将结果放入我的c#代码中的DataTable中。谢谢。代码:

private DbProviderFactory DbFactory
    {
        get
        {
            dbProviderFactory = dbProviderFactory  ?? DbProviderFactories.GetFactory(providerInvariantName);
            return dbProviderFactory;
        }
    }

public DataTable ExecDataTable(string cmdText, params IDataParameter[] cmdParams)
    {
        DataTable resultDT = new DataTable();

        using (DbConnection dbConn = DbFactory.CreateConnection())
        {
            dbConn.ConnectionString = connectionString;
            using (DbCommand dbCmd = DbFactory.CreateCommand())
            {
                dbCmd.CommandText = cmdText;
                dbCmd.Connection = dbConn;

                try
                {
                    dbConn.Open();

                    if (cmdParams != null)
                    {
                        dbCmd.Parameters.AddRange(cmdParams);
                    }

                    using (DbDataAdapter dbDA = DbFactory.CreateDataAdapter())
                    {
                        dbDA.SelectCommand = dbCmd;
                        dbDA.Fill(resultDT);
                    }
                }
                finally
                {
                    dbConn.Close();
                }
            }
        }
        return resultDT;
    }

注意:connectionString,providerInvariantName先前已在代码中设置。

同样对重构我的代码的任何建议表示赞赏这是我采用的支持ODP.net的方法,也是现场需要的与Oracle的ODBC连接。

更新

我可以使用以下方式使用:

new Oracle.DataAccess.Client.OracleParameter("result", Oracle.DataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output);

但是我似乎无法使用 DbParameter或IDataParameter 来获得通用解决方案如何执行此操作支持ODBC和ODP.net

2 个答案:

答案 0 :(得分:1)

设置CommandType属性,

dbCmd.CommandType=StoredProcedure;

填充方法隐式打开和关闭数据库连接,因此无需打开&关闭数据库连接。

使用 cmd.Parameter.AddWithValue()方法推送参数和值。

答案 1 :(得分:1)

你真的必须支持ODBC吗?否则只使用ODP.Net,它已经优化了对Oracle的访问。从Oracle获取数据的最有效方法是使用ref游标,你应该学会使用它。

create or replace
PROCEDURE  SP_GET_TBL (o_rc OUT sys_refcursor) AS
   open o_rc for
        select Col1, Col2, Col3 from Tbl;       
END SP_GET_TBL;