c#IDataReader与SqlDataReader的区别

时间:2011-05-26 10:41:38

标签: c# sqldatareader idatareader

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

答案 0 :(得分:17)

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

同样适用于IDbConnectionIDbCommand等。当然创建连接时,您需要指定您正在使用的引擎,但请放在一边从那里你永远不必明确定义你正在使用的数据库引擎。

请注意,IDataReader没有HasRows属性,您必须使用Create...()方法创建命令和参数:

IDbCommand command = myDbConnection.CreateCommand();

而不是:

SqlCommand command = new SqlCommand(myDbConnection);

编辑:您可能希望使用所有ADO.NET提供程序继承的抽象类DbConnection,而不是使用接口。它们提供了一些其他功能,例如获取架构信息以及HasRows的上述DbDataReader属性。有关接口未跟上抽象类的原因,请参阅http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/759fa77b-8269-4c4a-be90-3c2bdce61d92/

答案 1 :(得分:1)

IDataReader和IDataRecord接口允许继承类实现DataReader类,该类提供了一种读取一个或多个仅向前的结果集流的方法For more details see this