【问题标题】:c# return resultset from Oracle store procedure and fill a DataTablec#从Oracle存储过程返回结果集并填充一个DataTable
【发布时间】:2010-11-21 06:29:59
【问题描述】:

我是一名 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

【问题讨论】:

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


    【解决方案1】:

    设置 CommandType 属性,

    dbCmd.CommandType=StoredProcedure;
    

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

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

    【讨论】:

    • 正确以及如何正确Oracle存储过程返回结果集。
    【解决方案2】:

    你真的必须支持 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;
    

    【讨论】:

    • 谢谢,我如何在 C# 中使用它?并填写数据表?
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多