Même si vous pouviez hériter de SqlDataReader, cela n'aurait aucune importance car vous ne pourriez pas faire en sorte que SqlCommand crée une instance de votre classe dérivée.
L'implémentation d'IDataReader dans un wrapper n'est vraiment pas difficile du tout lorsque vous ne faites que passer à SqlDataReader sous-jacent. C'est juste un peu de temps mais pas si mal.
Mais je suis curieux, est la ressource que vous souhaitez disposer de la connexion? Si c'est le cas, il existe un membre CloseConnection de l'énumération CommandBehavior qui garantit que la connexion sera fermée lorsque le lecteur de données est fermé.
var reader = command.ExecuteReader(CommandBehavior.CloseConnection);
...
reader.Close(); // also closes connection
Notez que Fermer/Disposer est la même chose sur SqlDataReader.
Enfin, voici une dernière suggestion qui m'a bien servi dans le passé. Notez que dans l'exemple libre suivant, vous possédez le SqlDataReader du début à la fin, même si vous "cédez" à l'appelant à chaque enregistrement.
private static IEnumerable<IDataRecord> GetResults(this SqlCommand command) {
using (var myTicket = new MyTicket())
using (var reader = command.ExecuteReader()) {
while (reader.Read()) {
yield return reader;
}
}
// the two resources in the using blocks above will be
// disposed when the foreach loop below exits
}
...
foreach (var record in myCommand.GetResults()) {
Console.WriteLine(record.GetString(0));
}
// when the foreach loop above completes, the compiler-generated
// iterator is disposed, allowing the using blocks inside the
// above method to clean up the reader/myTicket objects
Que voulez-vous dire non héritable? Est-ce une classe scellée? Pourriez-vous élaborer sur les interfaces? N'avez-vous pas à les mettre en œuvre? Aussi, pourquoi ne veux-tu pas? –
SqlDataReader n'est pas scellé donc il est héritable, mais ses constructeurs sont privés donc vous ne pouvez pas satisfaire le constructeur de base quand vous en héritez - je ne fais que copier des détails mais pourtant, vous avez raison. –
En plus de mon commentaire sur la réponse de Silky, je ne peux pas m'empêcher de me demander ... qu'est-ce que vous pourriez avoir besoin d'empaqueter avec 'SqlDataReader'? J'espère vraiment que ce n'est pas un 'SqlCommand' ou' SqlConnection' ... – Aaronaught