Как лучше перебрать пакет результатов с помощью C # DbDataReader - PullRequest
0 голосов
/ 02 апреля 2009

Я выполняю несколько SQL-запросов в виде пакета, а затем возвращаю все наборы результатов обратно в пакет. То, как мой код в настоящее время составляется, первый набор результатов пропускается. Теперь, когда я это знаю, я мог бы просто добавить другой оператор вне моего цикла, который получает первый результат, однако мне интересно, есть ли более элегантное решение этой проблемы.

Вот некоторый sudo-код происходящего:

DbDataReader reader= /*some stuff that returns a batch of results...*/;

while (reader.NextResult())
{
   while (reader.Read())
   {
       if (!reader.IsDBNull(0))
       {
           //do things with the data....
       }
   }
}

Теперь я ожидал бы, что NextResult () продвигает вас к первому результату при первом вызове, что, похоже, делает Read (). Однако то, что он действительно делает, это приводит вас ко второму результату при первом вызове. Я неправильно понимаю, как вы собираетесь использовать этот метод, или вы действительно должны сделать что-то вроде следующего:

DbDataReader reader= /*some stuff that returns a batch of results...*/;

//this deals with the row in the the very first result
while (reader.Read())
{
    if (!reader.IsDBNull(0))
    {
        //do things with the data....
    }
}

//this deals with the rest of the rows...
while (reader.NextResult())
{
   while (reader.Read())
   {
       if (!reader.IsDBNull(0))
       {
           //do exact same things with the data....
           //is this not pretty klugey?
       }
   }
}

Это кажется мне гнилым стилем программирования, но я не вижу выхода из этого. Кто-нибудь знает более изящное решение для этого?

Ответы [ 3 ]

9 голосов
/ 02 апреля 2009

Просто поместите NextResult в конец цикла вместо начала:

do {
   while (reader.Read()) {
      if (!reader.IsDBNull(0)) {
         //do things with the data....
      }
   }
} while (reader.NextResult());
3 голосов
/ 02 апреля 2009

В подавляющем большинстве случаев вы будете возвращать только один результирующий набор с любым заданным вызовом, поэтому для разработчиков не имеет смысла требовать "NextResultSet" каждый раз, когда вы используете читателя.

Таким образом, ваш второй пример действительно содержит , если вы извлекаете несколько наборов результатов. Другая вещь, которая заставляет меня задаться вопросом, заключается в том, почему вы будете делать «точно такие же вещи с данными», если вы извлекаете несколько наборов результатов - разве структура данных не будет настолько различной, чтобы вы не будет делать то же самое?

То есть, ваш пример заставляет меня задуматься, нет ли у вас какой-то ошибки в мышлении о том, как работают функции управления данными.

0 голосов
/ 02 апреля 2009

Я обычно делаю это:

if(reader.HasRows)
    {
      while(reader.Read())
       {

          // Do Stuff
       }
    }

Надеюсь, это поможет

...