使用Oracle.ManagedDataAccess从全局临时表中读取

时间:2015-11-03 13:00:35

标签: c# oracle

我们正在使用涉及多个全局临时表和PL SQL数组的存储过程,以避免使用动态SQL查询,并且由于我们可能返回大量记录。但是,当我们尝试从结果中读取时,我们遇到了一些问题。

我们过去的模式是使用如下代码读取结果:

DataTable result = new DataTable();
const string procName = "some proc";
using (var connection = new OracleConnection("some connection string"))
using (var command = new OracleCommand(procName, connection))
{
   command.CommandType = CommandType.StoredProcedure;
   command.BindByName = true;
   command.Parameters.Add(new OracleParameter("my_ref_cursor", OracleDbType.RefCursor)
   {
      Direction = ParameterDirection.Output
   });
   connection.Open();
   using (var reader = command.ExecuteReader())
   {
     while (reader.Read())
     {
         // some logic here
     }
   }
   connection.Close();
}

但是,当我们尝试从读取器读回结果时,它会跳过解析循环,就像没有数据一样。当我们在TOAD中复制调用时,我们会毫无问题地返回结果。

我们猜测驱动程序正在执行提交,而我们正在尝试回读结果,但我们不确定如何解决这个问题。我们尝试过使用以下内容:

connection.BeginTransaction(IsolationLevel.ReadUncommitted);

但这引发了一个可爱的异常,虽然明确,但并没有帮助我真正解决问题。

System.ArgumentException was unhandled by user code
  HResult=-2147024809
  Message=IsolationLevel must be ReadCommitted or Serializable
Parameter name: isolationLevel
  Source=Oracle.ManagedDataAccess
  ParamName=isolationLevel
  StackTrace:
       at Oracle.ManagedDataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel)

关于我们是否可以做我们正在尝试做的事情的任何想法?

1 个答案:

答案 0 :(得分:2)

如错误消息中所述,不允许隔离级别IsolationLevel.ReadUncommitted。您必须使用ReadCommitted(默认值)或Serializable

您是否使用ON COMMIT DELETE ROWS(默认值)创建了全局临时表?

尝试使用

创建表格
CREATE GLOBAL TEMPORARY TABLE ....
(
...
)
ON COMMIT PRESERVE ROWS;