2011-05-26 54 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