使用DataTable.Load()方法在DataReader返回的情况下返回两个结果集不起作用
问题描述:
为了提高性能,我试图消除数据集使用&实现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()会工作,但在这种情况下,如果上述工作正常,我必须更改其他许多我认为可以避免的代码。
欣赏早期回复。
答
查看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
我不能肯定,但IIRC的DataReader的使用了高速连续流管道模型。这意味着你必须完全使用一个数据集,然后才能进入下一个数据集。 – RBarryYoung