2011-05-26 52 views
8

有人能告诉我这两个代码段的区别吗?为什么使用IDataReader?c#IDataReader SqlDataReader的区别

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

回答

16

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

这同样适用于IDbConnectionIDbCommand等。当然,当创建的连接,你需要指定你所使用的引擎,但除了你永远不会有明确定义的数据库你正在使用的引擎。

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

IDbCommand command = myDbConnection.CreateCommand(); 

相反的:

SqlCommand command = new SqlCommand(myDbConnection); 

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

+0

伟大的答案,你打我吧:) – mdm 2011-05-26 10:56:08

1

的IDataReader的和IDataRecord接口允许继承类来实现一个DataReader类,它提供读一个或结果的更多只进流的装置将For more details see this