gpt4 book ai didi

c# - 如果 DataReader 返回两个结果集,则使用 DataTable.Load() 方法不起作用

转载 作者:行者123 更新时间:2023-12-02 03:29:06 26 4
gpt4 key购买 nike

出于提高性能的动机,我试图消除数据集的使用并实现 DataReader。这里我的 Oracle 过程返回两个引用,当我将第一个记录集加载到第一个数据表时,下一个记录集永远不会被加载。

示例代码如下所示:

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

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

感谢尽早回复。

最佳答案

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

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

顺便说一下,无需去源头。 MSDN 还说:

The Load method consumes the first result set from the loaded IDataReader, and after successful completion, sets the reader's position to the next result set, if any.

所以你只需要删除这一行

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

关于c# - 如果 DataReader 返回两个结果集,则使用 DataTable.Load() 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37793879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com