如何将Oracle ODP.net ExecuteReader与以C#格式返回光标的SP一起使用?

如何将Oracle ODP.net ExecuteReader与以C#格式返回光标的SP一起使用?,c#,oracle,odp.net,C#,Oracle,Odp.net,我有一个返回ref游标的过程。它需要4个参数,我使用的是C#。我在网上到处找例子,但都找不到 这就是我所拥有的 public static int test(int test_id, int progr, int setID, string BFilter) { object cur1 = System.DBNull.Value; string spname = "SP.GetValues"; using (Oracle.DataAccess.Client.OracleComman

我有一个返回ref游标的过程。它需要4个参数,我使用的是C#。我在网上到处找例子,但都找不到

这就是我所拥有的

public static int test(int test_id, int progr, int setID, string BFilter)
{
  object cur1 = System.DBNull.Value;
  string spname = "SP.GetValues";

  using (Oracle.DataAccess.Client.OracleCommand command = DB.GetStoredProcCommand(spname, test_id, progr, setID, BFilter, cur1))
  {
    using (OracleDataReader reader = command.ExecuteReader())
    {
      while (reader.Read())
      {
        //load array
      }
    }
  }

  int t = 1;
  return t;
}
我使用的数据集工作得很好,只是每次需要20秒才能得到500行,我必须这样做800次。我认为使用datareader,将其加载到数组中,然后在数组上循环将比读取数据集更快。SP本身需要1秒才能返回,它在填充行中花费19秒。

Mark William的博客在使用Oracle参考光标时有一个错误。非常有趣的阅读,可能是一个很好的开始一个样本


它有点老(我承认,我已经有几年没有接触过ODP.NET了),但我怀疑ODP.NET是否已经彻底改变了它的位置。

您需要将其指定为ref.cursor类型的输出参数,
查看以下链接了解更多详细信息:

@user72226-如果问题在于性能而不是功能,您是否尝试过从游标(例如SQL*Plus)中提取数据?Oracle甚至可以在开始执行查询之前打开游标,因此完全有可能快速打开游标,但当您开始提取数据时,实际执行查询需要时间。尝试了这一点,它会在不到一秒钟的时间内完成。延迟在于在C#端填充数据集。我想测试datareader是否会更快,但找不到任何示例。然而,有趣的提示依赖于使用不受支持的hack。这将在生产环境中使用,这将导致故意使用不受支持的功能终止!我将不得不看看我是否能找到上次玩ODP和ref游标时使用的代码。我认为这仍然是合适的(尽管甲骨文已经被称为通过一个新版本彻底改造轮子)。马克·威廉姆斯的博客不再需要这种破解,因为Rowsize现在是OracleDataReader的官方财产。请记住,ODP.NET向后支持较旧的Oracle数据库版本,例如,ODP.NET 11.2支持Oracle 9.2。因此,无需停留在ODP.NET的古老版本上。