循环Oracle数据读取器返回不一致的结果

时间:2011-03-11 18:27:04

标签: c# oracle datareader

我有问题。我有一个循环设置用于两个功能的统计分析。第一次通过循环在两个函数中都很好。第二次通过循环时,第二个函数不会返回任何结果。

我不明白为什么第一次通过循环我从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();
}

2 个答案:

答案 0 :(得分:1)

据我所知,除了明显的语法错误之外,您发布的代码也很好。错误发生在GetScheduleXml或实现ISession的类的实现中。

答案 1 :(得分:0)

同意丹尼尔。此外,您在using语句中使用session.Connection,但方法签名中的参数是newSession。

DataReader处于使用状态,因此处理结束。无需额外的.Close()调用。