2016-06-13 6 views
2

パフォーマンスを向上させる動機で、データセットの使用を排除しようとしています& DataReaderを実装しています。ここで私のOracleプロシージャは、最初のDataTableに最初のレコードセットをロードするときに2つのリフレクタ&を返します。次のレコードはロードされません。DataReaderによって返された2つの結果セットでDataTable.Load()メソッドが機能しない場合

サンプル・コードは、このようなものになります。私はreader.NextResultを(使用して、その後しばらく(reader.Read())... &を使用して、ループのような代替方法がある知っている

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; 
      } 

)が動作しますが、そのような場合は、上記の作業がうまくいけば避けることができる他の多くのコードを変更する必要があります。

早期回答をお待ちしております。

+0

を削除する必要がありますが、IIRCのDataReaderの使用高速シーケンシャルストリーミングパイプラインモデル。これは、次のデータセットに移動する前に、1つのデータセットを完全に消費しなければならないことを意味します。 – 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

手がかりSteve !!!ありがとう! – 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

関連する問題