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, который обеспечивает средство чтения одного или нескольких потоковых наборов результатов только для пересылки. Подробнее см. Здесь