MVC3 с Oracle использовать ADO.NET хотел бы хороший способ использования IEnumerable - PullRequest
2 голосов
/ 14 июня 2011

Я конвертирую приложение веб-форм в mvc3, для текущей базы данных оно вызывает веб-сервисы asmx, возвращающие наборы данных.Так как я перестраиваю довольно много приложений, у меня действительно нет необходимости или желания работать с наборами данных.Entity Framework исключен для босса и т. Д. Таким образом, это существующий тип кода Oracle, который возвращает 3 рефкурса, в результате чего набор данных содержит 3 таблицы данных.Вот существующий код:

    connection = new OracleConnection(EnvironmentSettings.connectionString);
            connection.Open();

            command = new OracleCommand("H16B.WEB_FACILITY.get_facility_queue", connection);
            command.CommandType = CommandType.StoredProcedure;

            // Input Parameters
            command.Parameters.Add("pfacility", OracleDbType.Varchar2, facilityCode, ParameterDirection.Input);
            // Output Parameters
            command.Parameters.Add("pqueue", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
            command.Parameters.Add("psubmitting", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
            command.Parameters.Add("psubmitted", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

            adapter = new OracleDataAdapter(command);
            DataSet ds = new DataSet();
            adapter.Fill(ds);

Итак, я хотел бы вместо набора данных использовать коллекцию List или IEnumerable.Может ли кто-нибудь показать мне, как записать данные в список (если бы я хотел 3 списка, текущий вывод веб-метода представляет собой набор данных. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Если вы используете Command.ExecuteNonQuery (), каждый из ваших параметров курсора ref должен содержать значение, являющееся либо OracleDataReader, либо OracleRefCursor, в зависимости от внутренних настроек параметра.

Итак, вам следуетбыть в состоянии начать с чего-то вроде этого:

IDataReader queueReader = (IDataReader)command.Parameters["pqueue"].Value;

Если вместо этого оказывается OracleRefCursor, вы можете использовать для него GetDataReader для того же эффекта.

Поскольку содержимоепросто в этом случае вы можете просто привести его к IEnumerable напрямую;в противном случае вам может потребоваться заполнить общий список или коллекцию.

0 голосов
/ 15 июня 2011

Используйте DefaulViews из таблиц DataSet, они реализуют IEnumberable.

О Dataview в документах MSDN: 'Представляет настраиваемое представление DataTable с возможностью привязки к данным для сортировки, фильтрации, поиска, редактирования и навигации.'

ОБНОВЛЕНИЕ: Если вы хотите использовать коллекции непосредственно в качестве выходных, взгляните на этот сайт (хотя и в ужасном формате: /)

Как вы можете видеть в этой статье, вам также придется что-то изменить в своих процедурах Oracle. Например, если вы хотите использовать ассоциативные массивы plsql, выходные параметры не могут быть рекурсорами, а должны быть таблицами plsql.

...