随着提高性能的动机,我试图消除数据集的使用&实现DataReader。在这里,我的Oracle Procedure返回两个refcursors&当我将第一个记录集加载到第一个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;
}
我知道有其他方法,比如使用while(reader.Read())循环...&然后使用reader.NextResult()将工作,但在这种情况下,我必须更改许多其他代码,我认为如果上述工作正常可以避免。
欣赏早期回应。
答案 0 :(得分:5)
查看@Interceptor
public class StateCheckInterceptor {
@EJB
private MasterEJB masterEJB;
@AroundInvoke
public Object checkIfReady(InvokedContext context) throws Exception {
// check if your masterEJB has done its job
return context.proceed();
}
方法的reference source,很明显该方法在退出之前会调用DataTable.Load
,因此您无需执行此操作。
NextResult()
顺便说一下,没有必要去找源头。 MSDN也说:
Load方法使用加载的第一个结果集 IDataReader,成功完成后,设置读者 定位到下一个结果集,如果有的话。
所以你只需要删除这一行
....
if(!reader.IsClosed && !reader.NextResult())
reader.Close();
....