Интерфейс IDataReader наследуется от IDataRecord. Метод Read() изменяет состояние средства чтения, чтобы вы могли получить поля:
var reader = new SomeIDataReader();
while (reader.Read()) {
var firstField = reader[0];
}
IDataReader содержит как средство чтения, так и запись. На мой взгляд, это смешивает две проблемы в одном классе. Я бы вернул объект записи и использовал его так:
var reader = new MyDataReader();
do {
var record = reader.Read();
if (record == null) break;
var firstField = record[0];
} while (true);
Это разделяет задачи чтения данных и контейнера данных и позволяет выполнять чтение из одного и того же источника с использованием двух потоков.
Мое решение лучше? Каковы некоторые преимущества предоставления читателю возможности содержать результат? Зачем кому-то выбирать подход IDataReader?