2016-06-13 11 views
2

为了提高性能,我试图消除数据集使用&实现DataReader。在这里,当我将第一个记录集加载到第一个DataTable中时,我的Oracle过程返回两个refcursors &,下一个不会加载。使用DataTable.Load()方法在DataReader返回的情况下返回两个结果集不起作用

示例代码看起来是这样的:

DataSet ds = new DataSet(); 
     using (OracleConnection db = new OracleConnection(conString)) 
     { 
      try 
      { 
       using (OracleCommand mycom = new OracleCommand()) 
       { 
        mycom.CommandText = "myPkg.pr_mySP"; 
        mycom.Connection = db; 
        mycom.CommandType = CommandType.StoredProcedure; 

        mycom.Parameters.Add("ref_list1", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
        mycom.Parameters.Add("ref_list2", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
        //mycom.FetchSize = mycom.FetchSize * 64; 

        db.Open(); 
        using (OracleDataReader reader = mycom.ExecuteReader()) 
        { 

         DataTable custMapList = new DataTable("dtcustMapList"); 
         custMapList.Load(reader); 

         reader.NextResult(); // POST THIS THE SECOND DATATABLE DOESNOT GETTING POPULATED 
         DataTable custMapSubList = new DataTable("dtcustMapSubList"); 
         custMapSubList.Load(reader); 

         ds.Tables.Add(custMapList); 
         ds.Tables.Add(custMapSubList); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       returnString += "Error, " + ex.Message; 
      } 

我知道有喜欢使用,而循环的替代方法(reader.Read())...... &然后用reader.NextResult()会工作,但在这种情况下,如果上述工作正常,我必须更改其他许多我认为可以避免的代码。

欣赏早期回复。

+0

我不能肯定,但IIRC的DataReader的使用了高速连续流管道模型。这意味着你必须完全使用一个数据集,然后才能进入下一个数据集。 – RBarryYoung

回答

4

查看DataTable.Load方法的reference source,很明显该方法在退出之前调用NextResult(),因此您不需要这样做。

.... 
if(!reader.IsClosed && !reader.NextResult()) 
     reader.Close(); 
.... 

顺便说一句,没有必要去源。此外MSDN说:

Load方法消耗的第一个结果从加载 IDataReader的设置,并成功完成后,将读者的 位置到下一个结果集,如果有的话。

所以,你只需要删除此行

// reader.NextResult(); // POST THIS THE SECOND DATATABLE DOESNOT GETTING POPULATED 
+0

感谢您的线索史蒂夫! – Biki

+0

我希望DataTable.Load()方法与通过保持while循环逐行循环和检索值一样好。 – Biki

+0

如果您正在寻找最高性能,那么您可能会在DataReader上使用自己的循环。很大程度上取决于您检索的数据在哪里以及在做什么。关于DataAdapter.Fill和DataTable.Load的性能有很多问题,例如:http://stackoverflow.com/questions/334658/is-datareader-quicker-than-dataset-when-populating-a-datatable – Steve

相关问题