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

标签 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

最佳答案

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

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;

关于C# 从 Oracle 存储过程返回结果集并填充 DataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1305214/

相关文章:

sql - Oracle 空字符串/NULL

sql - SQL 的内置多线程功能是否令人满意?

c# - 配置 DI 后 ASP.NET Core 初始化单例

php - oci_fetch 与 oci_fetch_array

c# - 如何使用 Entity Framework 和存储过程来避免 TimeOut 异常?

stored-procedures - 编译存储过程挂起 Oracle SQL Developer

c# - 大型站点上的 SQL 执行缓慢(调用存储过程)

c# - 在 DateTimeAxis 中定位轴标签

c# - 为什么使用 ArcGIS 9.3 对象编写的程序在升级到 ArcGIS 10 后不再运行?

c# - List<IJob>.AddRange(List<Job>) 不起作用