Зацикливание Oracle Data Readers возвращает противоречивые результаты - PullRequest
0 голосов
/ 11 марта 2011

У меня проблема.У меня есть цикл, настроенный для статистического анализа двух функций.Первый раз через цикл все нормально в обеих функциях.Во второй раз через цикл вторая функция не возвращает никаких результатов.

Я не понимаю, почему в первый раз через циклы я получаю результаты из 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 ]

1 голос
/ 11 марта 2011

Насколько я вижу, код, который вы выложили, хорош, кроме явных синтаксических ошибок. Ошибка либо в GetScheduleXml, либо в реализации класса, который реализует ISession.

0 голосов
/ 11 марта 2011

Согласен с Даниилом. Также вы используете session.Connection в операторе using, но параметр в сигнатуре метода - newSession.

DataReader используется, поэтому обрабатывает закрытие. Нет необходимости в дополнительном вызове .Close ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...