Selbst wenn Sie von SqlDataReader erben könnten, wäre das egal, weil Sie SqlCommand nicht dazu bringen könnten, eine Instanz Ihrer abgeleiteten Klasse zu erstellen.
Die Implementierung von IDataReader in einem Wrapper ist wirklich nicht schwierig, wenn Sie nur auf den zugrunde liegenden SqlDataReader verzichten. Es ist nur ein bisschen zeitaufwendig, aber nicht so schlimm.
Aber ich bin neugierig, ist die Ressource, die Sie möchten, die Verbindung entsorgt? Wenn dies der Fall ist, gibt es ein CloseConnection-Mitglied der CommandBehavior-Enumeration, das sicherstellt, dass die Verbindung geschlossen wird, wenn der Datenleser geschlossen wird.
var reader = command.ExecuteReader(CommandBehavior.CloseConnection);
...
reader.Close(); // also closes connection
Beachten Sie, dass Close/Dispose auf SqlDataReader die gleiche Sache sind.
Endlich, hier ist ein letzter Vorschlag, der mir in der Vergangenheit gut gedient hat. Beachten Sie, dass Sie im folgenden lockeren Beispiel den SqlDataReader vom Anfang bis zum Ende besitzen, obwohl Sie bei jedem Datensatz dem Aufrufer "nachgeben".
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
Was meinen Sie nicht vererbbar? Ist es eine versiegelte Klasse? Würden Sie die Schnittstellen näher erläutern? Müssen Sie diese nicht umsetzen? Auch, warum willst du nicht? –
SqlDataReader ist nicht versiegelt, so dass es vererbbar ist, aber seine Konstruktoren sind privat, so dass Sie den Basiskonstruktor nicht erfüllen können, wenn Sie davon erben - ich bin nur pingelig über Details, aber Sie haben Recht. –
Zusätzlich zu meinem Kommentar zu silkys Antwort kann ich mich nicht wundern ... was könnte man brauchen, um mit einem 'SqlDataReader' zu verpacken? Ich hoffe wirklich, dass es kein 'SqlCommand' oder' SqlConnection' ist ... – Aaronaught