Hallo,
die Konstruktion ist im wesentlichen richtig (abgesehen davon, dass das Ganze als static-Bestandteile einer Klasse nicht so sinnvoll ist; aber ich nehme an, dass du das jetzt nur zu Demo-Zwecken so gebastelt hast).
Der DbDataReader macht es einem tatsächlich schwerer, weil er (wie in dem anderen Thread besprochen) die DbConnection häufig blockiert, bis er selbst geschlossen wird. Deshalb kann er auch nicht per return zurückgegeben werden, weil die DbConnection sofort geschlossen werden sollte und damit auch der Reader, der an diese DbConnection gebunden ist, verloren geht.
Die Lösung des Problems liegt darin, dass zwischen den verschiedenen Ebenen getrennt werden soll (am liebsten würde ich "muss" sagen, aber es kann abweichende Situationen geben): die Datenmenge im Arbeitsspeicher z.B. im typisierten DataSet auf der einen Seite, die Datenmenge auf der Festplatte (Datenbank) auf der anderen Seite. Die Verknüpfung zwischen beiden, z.B. eine Klasse für DbConnection und DbDataAdapter, füllt die Datenmenge im Arbeitsspeicher mit Werten - je nach Situation mit dem Rückgabewert einer DataTable oder mit einem einzelnen return-Wert oder mit einer List<T> als return-Wert oder mit Änderungen in einem DataSet oder was das Execute-Ergebnis sonst zurückliefert.
Ich hoffe, ich habe keine weitere Verwirrung hervorgerufen. Jürgen
PS. Lies übrigens auch einmal
NET Richtlinien für Namen durch, vor allem hinsichtlich Groß- und Kleinschreibung.