2011-05-26 2 views
8

Quelqu'un peut-il me dire la différence entre ces deux morceaux de code? Pourquoi utiliser IDataReader?C# IDataReader Différence 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 
    } 
} 

Répondre

16

SqlDataReader implémente l'interface IDataReader. Donc, tous les autres pilotes ADO.NET (Oracle, MySql, etc). Vous pouvez utiliser IDataReader, de sorte que si vous prévoyez de changer de moteur de base de données un jour, vous n'avez pas besoin de réécrire toutes vos références SqlDataReader.

va de même pour IDbConnection, IDbCommand, etc. Bien sûr, lorsque la création la connexion, vous devrez spécifier quel moteur que vous utilisez, mais à part cela, vous ne devez définir explicitement base de données moteur que vous utilisez.

Notez que IDataReader ne possède pas la propriété HasRows, et vous devez utiliser les méthodes Create...() pour créer des commandes et paramètres:

IDbCommand command = myDbConnection.CreateCommand(); 

Au lieu de:

SqlCommand command = new SqlCommand(myDbConnection); 

EDIT: Au lieu d'utiliser les interfaces dont vous souhaitez utiliser la classe abstraite DbConnection héritent de tous les fournisseurs ADO.NET. Ils fournissent des fonctionnalités supplémentaires telles que l'obtention d'informations de schéma et la propriété HasRows susmentionnée pour le DbDataReader. Voir http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/759fa77b-8269-4c4a-be90-3c2bdce61d92/ pour la raison pour laquelle l'interface n'a pas suivi la classe abstraite.

+0

Grande réponse, vous me devança :) – mdm

1

Les IDataReader et les interfaces IDataRecord permettent une classe héritant de mettre en œuvre une classe DataReader, qui fournit un moyen de lecture d'un ou plusieurs avant uniquement les flux ensembles de résultats For more details see this