Zitat: |
Ich hab für mein kleines Ticketsystem-Programm versucht alle Datenbankzugriffe in eine eigene Klasse umzulagern |
Um was zu erreichen? Du solltest dich kurz selbst fragen warum du das tust
Ich frage das so provokativ weil der Stil der Klasse inherent problematisch ist. Ich vermute mal das du irgendwie die Handhabung vereinfachen willst. Vereinfachen wird aber dann problematisch wenn man versucht weiter zu vereinfachen als hilfreich. Weil man mehr neue versteckte Problem einbaut als vorher überhaupt da waren.
Ein Beispiel. Du versuchst die Connection so zu kapseln so das sie von außen nicht direkt manipulierbar ist so das ich ein Aufrufer (theoretisch) nicht darum kümmern muss.
Deine Methoden veröffentlichen aber Klassen die ihrerseits die Connection weiterhin brauchen obwohl du sie aus der Reichweite des Users entfernt hast. Ohne die Klasse müßte man das explizit machen, man sieht das zum Beispiel eine Connection und ein DataReader zusammenhängen. Diesen Zusammenhang hast du versteckt (ein Benutzer deiner Klasse sieht das nicht) obwohl man immer noch direkt Wissen muss das es denn gibt damit man nix falsch macht.
Stell dir vor du möchtest mit deiner Klasse ein Massenkopieren (mit kleineren Manipulationen an den Daten) implementieren. Dazu würdest du über dataReader() einen DataReader ranholen und über die Zeilen des DataReaders iterieren. In der Schleife würdest du irgendwas mit der Datenzeile machen und dann in die Datenbank schreiben mit deiner sqlausführen Methode. Das würde nicht funktionieren wenn du das versuchst. sqlausführen würde die Connection schließen wieder öffnen und damit wäre der datareader kaputt der die Connection noch brauchte. Diesen Zusammenhang hast du effektiv versteckt was nicht gut ist. Ein explizites ausprogrammieren sähe aufwendiger aus den Zusammenhang würde man aber sofort erkennen.
Ich würde dir empfehlen die Klasse so zu schreiben das jede aufrufbare Methode die eine Connection braucht die Connection in einer Weise benutzt das sie nach Aufruf der Methode nicht mehr nötig ist und am Ende der jeweiligen Methode auch explizit geschlossen wird. Dann hast du die meisten Lücken geschlossen da du keine irgendwie herumfliegende Connection haben wirst.
Da ich die dataset Methode sinnfrei halte da da immer nur eine DataTable namens Inhalt drin ist und du immer wieder die gleiche DataSet Instanz wiederverwendest mal ein Beispiel für eine Methode die eine DataTable liefert die das wahrscheinlich sinnvollere äquivalent wäre.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| private const string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=datenbank2.accdb"; public DataTable GetDataTable(string sql) { try { using (var con = new OleDbConnection(connectionString)) { con.Open(); using (var adapter = new OleDbDataAdapter(sql, con)) { var dt = new DataTable(); adapter.Fill(dt); return dt; } } } catch (Exception a) { throw; } } |