【问题标题】:MVC3 with Oracle use ADO.NET would like a nice way of using IEnumerableMVC3 与 Oracle 使用 ADO.NET 想要一种使用 IEnumerable 的好方法
【发布时间】:2011-09-14 20:43:42
【问题描述】:

我正在将 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);

所以我想做的不是使用数据集,而是使用集合 a List 或 IEnumerable 。谁能告诉我如何将数据捕获到列表中(我想要 3 个列表,当前的 webmethod 输出是一个数据集。提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    所以,你应该可以这样开始:

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

    如果结果是 OracleRefCursor,您可以在其上使用 GetDataReader 以获得相同的效果。

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

    【讨论】:

    • 谢谢里奇。我很感激。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我希望跳过整个数据集,因此DataSet ds = new DataSet(); adapter.Fill(ds); 相反,我想填写一个集合列表。
    • 我使用 ADO 多年,希望跳过使用数据读取器/数据表/数据集,直接从 Oracle 获取数据到集合中,有人知道怎么做吗? (同样,没有实体框架,因此没有 dbcontext / IQueryable 。所有 mvc 示例似乎都使用 EF,但 Oracle EF 处于 beta 版本,甚至不能与 Oracle 9.2 一起使用......我需要调用 Oracle 存储过程并将它们放入集合...一个列表...字典轻量级的东西。然后我会使用 IEnumerable。谢谢,汤姆
    • 我过去曾使用 PLSQLAssociative Array 作为 Oracle 的输出参数。你的意思是这样吗?如果你愿意,我可以展示示例代码。
    • 不,我无法更改现有的存储过程。我只想在轻量级字典中获取数据。如果我需要先将其放入数据阅读器或数据表中,我只是希望有一种方法可以跳过这些并直接进入列表例如我现在可以获取数据集并执行此操作List<IClient> clients = (from c in dataSet.Tables[0].AsEnumerable() ....... 但我希望跳过将数据放入这些数据集/数据表等。谢谢
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多