c # вернуть набор результатов из процедуры хранилища Oracle и заполнить DataTable

2

Я разработчик С# SQL Server для программирования Oracle. Код ниже работает для установки cmdText: "select * from myTable". Я хотел бы сейчас положить это в хранимую процедуру, Мне нужна помощь в том, как написать эту хранимую процедуру Oracle и получить результаты в 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, а также ODBC-соединения с Oracle, которые требуются на сайте.

Обновление

Я могу заставить это работать, используя:

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

Однако я не могу получить общее решение для работы с использованием DbParameter или IDataParameter, как это сделать для поддержки ODBC и ODP.net?

Теги:
stored-procedures
ado.net
odp.net

2 ответа

1
Лучший ответ

Вам действительно нужно поддерживать 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;
  • 0
    Спасибо, и как мне потреблять это в C #? и заполнить DataTable?
1

Задайте свойство CommandType,

dbCmd.CommandType=StoredProcedure;

Метод заполнения открывает и закрывает соединение с базой данных неявно, поэтому нет необходимости открывать и закрывать соединение с базой данных.

Используйте метод cmd.Parameter.AddWithValue(), чтобы нажать оба параметра и значение.

  • 0
    Право и как исправить хранимую процедуру Oracle, чтобы вернуть набор результатов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню