c # IDataReader SqlDataReader разница - PullRequest
9 голосов
/ 26 мая 2011

Может кто-нибудь сказать мне разницу между этими двумя частями кода? Зачем использовать IDataReader?

using (IDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        // get data from the reader
    }
}

using (SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        // get data from the reader
    }
}

Ответы [ 2 ]

17 голосов
/ 26 мая 2011

SqlDataReader реализует интерфейс IDataReader.Как и все остальные драйверы ADO.NET (Oracle, MySql и т. Д.).Вы можете использовать IDataReader, так что если вы когда-нибудь планируете изменить ядро ​​базы данных, вам не нужно переписывать все ваши ссылки SqlDataReader.

То же самое относится к IDbConnection, IDbCommandи т. д. Конечно, когда создает соединение, вам нужно будет указать, какой движок вы используете, но кроме этого вам никогда не придется явно определять, какой движок базы данных вы используете.

Обратите внимание, что IDataReader не имеет свойства HasRows, и вы должны использовать методы Create...() для создания команд и параметров:

IDbCommand command = myDbConnection.CreateCommand();

Вместо:

SqlCommand command = new SqlCommand(myDbConnection);

РЕДАКТИРОВАТЬ: вместо использования интерфейсов вы можете использовать абстрактный класс DbConnection, от которого наследуются все поставщики ADO.NET.Они предоставляют некоторые дополнительные функции, такие как получение информации о схеме, и вышеупомянутое свойство HasRows для DbDataReader.См. http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/759fa77b-8269-4c4a-be90-3c2bdce61d92/, почему интерфейс не поспевает за абстрактным классом.

1 голос
/ 26 мая 2011

Интерфейсы IDataReader и IDataRecord позволяют наследующему классу реализовывать класс DataReader, который предоставляет средства для чтения одного или нескольких потоковых наборов результатов только для пересылки Подробнее см.

...