有人能告诉我这两段代码的区别吗?为什么使用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引用。
这同样适用于IDbConnectionIDbCommand等。当然,在创建连接时,您需要指定正在使用的引擎,但除此之外,您永远不必显式定义正在使用的数据库引擎。
注意IDataReader没有HasRows属性,您必须使用Create...()方法创建命令和参数:

IDbCommand command = myDbConnection.CreateCommand();

而不是:
SqlCommand command = new SqlCommand(myDbConnection);

编辑:不使用您可能希望使用的接口,而是使用所有ado.net提供程序继承自的抽象类。它们提供了一些额外的特性,比如获取模式信息,以及前面提到的DbConnection属性。请参见http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/759fa77b-8269-4c4a-be90-3c2bdce61d92/了解为什么接口没有跟上抽象类。

08-16 17:55