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
    }
}
    

解决方法

SqlDataReader
实现接口
IDataReader
。其他所有ADO.NET驱动程序(Oracle,MySql等)也是如此。您可以使用
IDataReader
,这样,如果您打算在某一天更改数据库引擎,则不必重写所有
SqlDataReader
引用。
IDbConnection
IDbCommand
等也是如此。当然,在创建连接时,您需要指定所使用的引擎,除此之外,您将不必显式定义您的数据库引擎,正在使用。 请注意,
IDataReader
不具有
HasRows
属性,并且必须使用
Create...()
方法来创建命令和参数:
IDbCommand command = myDbConnection.CreateCommand();
代替:
SqlCommand command = new SqlCommand(myDbConnection);
编辑:您可能不希望使用接口,而是要使用所有ADO.NET提供程序继承的抽象类
DbConnection
。它们提供了一些其他功能,例如获取架构信息,以及前面提到的
DbDataReader
HasRows
属性。请参阅http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/759fa77b-8269-4c4a-be90-3c2bdce61d92/,以了解接口为何未与抽象类保持一致。     ,IDataReader和IDataRecord接口允许继承类实现DataReader类,该类提供了一种读取结果集的一个或多个正向流的方法。有关更多详细信息,请参见     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...