Концепция EOF/BOF для sqldatareader?
Я знаю, что EOF и BOF не существуют для SqlDataReader, но мне интересно, есть ли стратегия, которая могла бы дублировать эту идею.
Я знаю, как перебирать с ним строки.
rdr = cmd.ExecuteReader If rdr.HasRows Then While rdr.Read End While End If
Но я хотел бы сделать это вместо этого, потому что очень неудобно использовать приведенный выше код, когда вам нужно что-то сделать в конце каждой группы. Я имею в виду, если у вас есть такой набор данных, как этот:
Клиент CarsOwned
Бекки БМВ
Бекки Форд
Бекки Хонда
Фред Форд
Фред Хонда
Фред Киа
Джордж гроссмейстер
Джордж Мерседес
Джон Ауди
Джон Хонда
Джон Киа
Джон Мерседес
Джон Вольво
Джон Фольксваген
Салли БМВ
Салли Крайслер
Салли Форд
Салли ГМ
Когда вы проходите через все вышесказанное и вам нужно что-то сделать в конце каждого клиента, это боль.
Это намного проще сделать:
'pseudo code: move to the first row While 1=1 'pseudo code: if we're at the end of the dataset, break out of the while here '... other code here 'pseudo code: move to the next row 'if on the next customer or at the very end, do some things here End While
Я часто делаю это в T-SQL и в Delphi. Это конечно было бы неплохо сделать с vb.net
Спасибо,
Птичий
Что я уже пробовал:
Я пытался сделать эту работу и искал решения. Пока не нашел никаких идей.
0x01AA
Довольно некрасиво, но я думаю, что это сделает свою работу (я надеюсь, что формат/отступы выживут в комментарии. Извините, никаких отступов не осталось)
// Псевдокод
string currPerson= строка.Пустой;
bool eof= !rdr.HasRows;
хотя (!ВФ)
{
ВФ= !чт.Читать();
боол команды newgrp= ложь;
если (!eof && !rdr.Пункт("Имя").Метод toString().Равно(currPerson))
{
newGrp= currPerson != строка.Пустой;
currPerson= rdr.Пункт("Имя").Метод toString();
}
if (eof || newGrp)
{
// Сделайте что-нибудь на newGrp или в самом конце
}
}