Как лучше перебрать пакет результатов с помощью C# DbDataReader
Я выполняю несколько 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 ответа
Просто поместите NextResult в конец цикла вместо начала:
do {
while (reader.Read()) {
if (!reader.IsDBNull(0)) {
//do things with the data....
}
}
} while (reader.NextResult());
В подавляющем большинстве случаев вы будете возвращать только один результирующий набор с любым заданным вызовом, поэтому для разработчиков не имеет смысла требовать "NextResultSet" каждый раз, когда вы используете читателя.
Таким образом, ваш второй пример действительно имеет место, если вы извлекаете несколько наборов результатов. Другая вещь, которая заставляет меня задаться вопросом, заключается в том, почему вы будете делать "точно такие же вещи с данными", если будете извлекать несколько наборов результатов - разве структура данных не будет настолько различной, чтобы вы делать то же самое?
То есть, ваш пример заставляет меня задуматься, нет ли у вас какой-то ошибки в мышлении о том, как работают функции управления данными.
Я обычно делаю это:
if(reader.HasRows)
{
while(reader.Read())
{
// Do Stuff
}
}
Надеюсь, поможет