Bik*_*iki 4 c# datatable ado.net sqldatareader
为了提高性能,我试图消除Dataset的使用并实现DataReader。在这里,我的Oracle Procedure返回两个引用,并且当我将第一个记录集加载到第一个DataTable中时,下一个永远不会加载。
示例代码如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
我知道还有其他方法,例如使用while(reader.Read())循环...然后使用reader.NextResult()可以工作,但是在那种情况下,我必须更改许多其他代码,如果以上工作正常。
赞赏早期反应。
查看该方法的参考源,DataTable.Load很明显该方法会NextResult()在退出之前调用,因此您不需要这样做。
....
if(!reader.IsClosed && !reader.NextResult())
reader.Close();
....
Run Code Online (Sandbox Code Playgroud)
顺便说一句,没有必要去寻找源头。另外MSDN说:
Load方法使用已加载的IDataReader的第一个结果集,并在成功完成后将读取器的位置设置为下一个结果集(如果有)。
所以你只需要删除这行
// reader.NextResult(); // POST THIS THE SECOND DATATABLE DOESNOT GETTING POPULATED
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |