C# IDataReader SqlDataReader разница

Может кто-нибудь сказать мне разницу между этими двумя частями кода? Зачем использовать 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 ответа

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/ чтобы узнать, почему интерфейс не поспевает за абстрактным классом.

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

Другие вопросы по тегам