循环 Oracle 数据读取器返回不一致的结果
Posted
技术标签:
【中文标题】循环 Oracle 数据读取器返回不一致的结果【英文标题】:Looping Oracle Data Readers returns inconsistent results 【发布时间】:2011-03-11 18:27:03 【问题描述】:我有问题。我为两个函数的统计分析设置了一个循环。第一次通过循环,这两个函数都很好。第二次通过循环第二个函数不返回任何结果。
我不明白为什么第一次通过循环我从 dataReader 获得结果,而随后的每一次我都一无所获 (datareader.hasRows == false
)
任何帮助都会很棒。提前谢谢你。
下面是循环结构和第二个函数(失败)的代码概要
startDate = new DateTime(2010, 1, 1);
for(int i = 0; i < 20; i++)
for(int j = 1; j <= 12; j++)
endDate = new DateTime(2010, j, 1);
schedule = new Schedule();
scheduleXml = string.Empty;
ISession newSession = session.SessionFactory.OpenSession();
scheduleXml = GetScheduleXml(startDate, endDate, locationIds, newSession);
schedule = GetSchedule(schedule, startDate, endDate, locationIds, newSession);
newSession.Close();
public static Schedule GetSchedule(Schedule schedule, DateTime startDate, DateTime endDate, int locationIds, ISession session)
string sqlGetActivitiesTreatmentsRegimens = // Custom SQL Select Statement (I have verified it returns results)
using (OracleCommand comm = new OracleCommand(sqlGetActivitiesTreatmentsRegimens, (OracleConnection)session.Connection))
try
OracleParameter plantIdParam = comm.CreateParameter();
plantIdParam.DbType = DbType.Int32;
plantIdParam.Value = plantId;
comm.Parameters.Add(plantIdParam);
OracleParameter startDateParam = comm.CreateParameter();
startDateParam.DbType = DbType.DateTime;
startDateParam.Value = startDate;
comm.Parameters.Add(startDateParam);
OracleParameter endDateParam = comm.CreateParameter();
endDateParam.DbType = DbType.DateTime;
endDateParam.Value = endDate;
comm.Parameters.Add(endDateParam);
using(OracleDataReader dr = comm.ExecuteReader())
while(dr.Read())
// does stuff here
catch (Exception ex)
throw new Exception("Source:GetRegimensEx:" + ex.Message, ex.InnerException);
return new Schedule();
【问题讨论】:
【参考方案1】:据我所知,除了明显的语法错误外,您发布的代码都很好。错误要么在GetScheduleXml
中,要么在实现ISession
的类的实现中。
【讨论】:
【参考方案2】:同意丹尼尔。另外,你在using语句中使用了session.Connection,但是方法签名中的参数是newSession。
DataReader 正在使用中,以便处理关闭。无需额外的 .Close() 调用。
【讨论】:
我对参数也有同样的想法,但如果第一次循环迭代有效,那不应该是这样吗? 我一般同意,但是因为函数是静态的,我们看不到 GetScheduleXml 或实现 ISession 的类对静态变量做了什么,我们不知道。 hmmmm... 这给了我一些想法。我将研究 ISession 是如何实现的。本质上,GetScheduleXml 是从存储过程中读取并返回一个基于存储过程输出的 xml 字符串。 当我将代码提取为更简单的格式时,newSession 与会话变量也是一个错字。 运气好吗?我建议用“using(OracleConnection conn = new OracleConnection(connString)”包装“using(OracleCommand comm..”。这将使执行数据库调用的函数处理连接(包括关闭和处置),并且只要您使用连接池,您就不会看到任何性能损失。这样您就不必担心在循环的迭代之间维护连接状态。以上是关于循环 Oracle 数据读取器返回不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章
如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀