使用Oracle的MVC3使用ADO.NET想要一种使用IEnumerable的好方法

时间:2011-06-14 16:25:08

标签: asp.net asp.net-mvc-3 ado.net ienumerable oracle9i

我正在将Web表单应用程序转换为mvc3,对于当前正在调用asmx Web服务返回数据集的数据库。由于我正在重建相当多的应用程序,我真的不需要或不想使用数据集。实体框架对于老板等是不可能的......因此这是现有类型的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个列表,当前的webmethod输出是一个数据集。提前感谢。

2 个答案:

答案 0 :(得分:2)

如果使用Command.ExecuteNonQuery(),则每个ref游标参数都应包含一个值为OracleDataReader或OracleRefCursor的值,具体取决于参数的内部设置。

所以,你应该能够从这样的事情开始:

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

如果事实证明它是OracleRefCursor,你可以在其上使用GetDataReader以达到同样的效果。

由于在这种情况下内容很简单,你可以直接将其转换为IEnumerable;否则,您可能需要填写通用列表或集合。

答案 1 :(得分:0)

使用DataSet表中的DefaulViews,它们实现了IEnumberable。

关于msdn文档中的Dataview: '表示DataTable的数据表,自定义视图,用于排序,过滤,搜索,编辑和导航。'

更新:如果您想直接使用集合作为输出,请查看this site(格式可怕:/)

正如您在文章中看到的那样,您还必须在Oracle过程中更改某些内容。例如,如果要使用plsql关联数组,则输出参数不能是refcursors,但必须是plsql表。