C#中的IDataReader和SqlDataReader有什么区别?

12

有人能告诉我这两段代码之间的区别吗?为什么要使用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个回答

19

SqlDataReader 实现了接口 IDataReader 。其他所有 ADO.NET 驱动程序(Oracle、MySql等)也是如此。你可以使用 IDataReader ,这样,如果有一天你计划更改数据库引擎,你就不必重写所有的 SqlDataReader 引用。

对于 IDbConnectionIDbCommand 等也是一样。当然,在 创建 连接时,你需要指定你正在使用的引擎,但除此之外,你永远不需要明确定义你正在使用的数据库引擎。

注意,IDataReader 没有 HasRows 属性,你需要使用 Create...() 方法来创建命令和参数:

IDbCommand command = myDbConnection.CreateCommand();

不要使用:

SqlCommand command = new SqlCommand(myDbConnection);

编辑:不必使用接口,您可能希望使用所有ADO.NET提供程序继承的抽象类DbConnection。它们提供了一些其他功能,例如获取模式信息以及上述DbDataReaderHasRows属性。请参见http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/759fa77b-8269-4c4a-be90-3c2bdce61d92/,了解为什么接口没有跟上抽象类。


很棒的答案,你比我先回答了 :) - mdm

2
IDataReader和IDataRecord接口允许继承类实现一个DataReader类,该类提供了一种读取一个或多个只向前的结果集流的方法。点击此处了解更多详情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接