10

有人能告诉我这两段代码的区别吗?为什么使用 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
    }
}
4

2 回答 2

18

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 提供程序继承自的抽象类,而不是使用接口。它们提供了一些额外的功能,例如获取模式信息,以及前面提到HasRowsDbDataReader. 请参阅http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/759fa77b-8269-4c4a-be90-3c2bdce61d92/了解接口没有跟上抽象类的原因。

于 2011-05-26T10:44:19.847 回答
1

IDataReader 和 IDataRecord 接口允许继承类实现 DataReader 类,该类提供了一种读取结果集的一个或多个只进流的方法有关详细信息,请参阅此

于 2011-05-26T10:49:00.310 回答