Anche se è possibile ereditare da SqlDataReader, non importa comunque perché non è possibile creare in SqlCommand un'istanza della classe derivata.
L'implementazione di IDataReader in un wrapper non è affatto difficile quando si rimanda al SqlDataReader sottostante. È solo un po 'di tempo, ma non così male.
Ma io sono curioso, è la risorsa che si desidera disporre la connessione? In tal caso, esiste un membro CloseConnection dell'enumerazione CommandBehavior che garantisce che la connessione venga chiusa quando il lettore di dati viene chiuso.
var reader = command.ExecuteReader(CommandBehavior.CloseConnection);
...
reader.Close(); // also closes connection
Si noti che Chiudi/Disponi sono la stessa cosa su SqlDataReader.
Infine, ecco un ultimo suggerimento che mi ha servito bene in passato. Si noti che nell'esempio successivo che segue, si possiede SqlDataReader dall'inizio alla fine anche se si sta "cedendo" al chiamante su ciascun record.
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
Cosa intendi per non ereditabile? È una lezione sigillata? Vuoi approfondire le interfacce? Non DEVI implementare quelli? Inoltre, perché NON vuoi? –
SqlDataReader non è sigillato, quindi è ereditabile, ma i suoi costruttori sono privati, quindi non puoi soddisfare il costruttore di base quando ne erediti: sto solo facendo il pignolo sui dettagli, ma hai ragione. –
Oltre al mio commento sulla risposta di silky, non posso fare a meno di chiedermi ... cosa potresti aver bisogno di impacchettare con un 'SqlDataReader'? Spero davvero che non sia un 'SqlCommand' o' SqlConnection' ... – Aaronaught