Hallo Bennie,
im Prinzip kann es so gemacht werden.
Es gibt nur einen
wirklichen Fehler dabei: die
DbConnection wird nur geöffnet, aber nicht geschlossen. Das sollte keinesfalls sein; unter ADO.NET bleibt eine Verbindung nur für einen Befehl geöffnet und wird sofort wieder geschlossen. (Ausnahme: wenn kurz hintereinander mehrere Befehle ausgeführt werden sollen, kann sie vor dem ersten geöffnet und nach dem letzten geschlossen werden.)
Es gibt aber einige
ungünstige Verfahren. Ich möchte dies zunächst erläutern und abschließend eine kurze Gesamtlösung bringen.
Die
DbConnection sollte nicht nur kurzfristig geöffnet sein, sondern überhaupt nur kurzfristig existieren. (Warum das sinnvoll ist, würde eine lange Diskussion heraufführen; lies lieber die vielen Artikel in der SDK-Doku.) Deshalb ist ein eigenständiger
using-Block sinnvoll.
Die
Gänsefüßchen bei "user" deuten darauf hin, dass der Name der Tabelle ungünstig gewählt ist, weil "user" auch ein interner Begriff einer DB sein kann. Das kann bei der Formulierung von SQL-Befehlen immer wieder einmal zu Problemen führen. Vielleicht bist Du auch nur daran gewohnt; unter SQL werden Tabellennamen grundsätzlich ohne Anführung geschrieben. (Es gibt Ausnahmen, z.B. bei Verknüpfungen unter MS-SQL mit bestimmten DBs oder bei Sonderzeichen oder ...)
In der Regel werden
nicht alle Daten einer Tabelle eingelesen. Gewöhne Dir von Anfang an an, nur die in der konkreten Situation benötigten Zeilen und Spalten zu holen: beispielsweise Nachschlagetabellen und Name/PLZ/Ort eines bestimmten Kunden. (Für eine neue Bestellung interessiert Dich höchstens, dass der Kunde existiert und keine Schulden hat, aber weder sein Geburtstag noch seine Kontonummer...)
Das
DataSet wird doch nicht nur für das Einlesen der Daten benötigt, sondern während des gesamten Programmablaufs. Also gehört es nicht zum Datenabruf, sondern in eine eigene Klasse "Datenvorrat" (Suche nach "Singleton"). Durch die IDE kann es auch einem Formular zugeordnet werden; aber das ist unpraktisch, denn dieselben Daten gehören ja meistens zu mehreren Formularen.
Der Zugriff auf einzelne Daten geschieht üblicherweise
nicht über ToString() - das ist nur bei der Kontrolle über MessageBox akzeptabel -, sondern über ein
cast auf den betreffenden Datentyp:
C#-Quelltext
1:
| string str = (string)row["name"]; |
Vor allem am Anfang des Lernprozesses sind vermutlich
typisierte Datasets vorzuziehen; das ist aber ein ganz anderer Themenkomplex.
Bei Verwendung des
DbDataAdapters kann con.Open (fast immer - siehe oben) entfallen: dieser öffnet und schließt die Verbindung selbständig.
"in eine Funktion packen": (Unter C# spricht man einheitlich von Methoden.) Selbstverständlich, das geht doch mit allem, was wiederholt benutzt wird. Ich nutze eine eigene Klasse DbConnector, die die Zusammenarbeit mit der DB steuert, mit verschiedenen SQL-Befehlen aufgerufen wird und passende Datenmengen zurückliefert.
Eine Methode (ohne eigene Klasse) kann also so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| string commandString = "SELECT * FROM user WHERE ID = ?;"; public void SelectData(DataSet ds, string commandString, int userID) { string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=database.mdb;"; using(OleDbConnection con = new OleDbConnection(connectionString)) { OleDbCommand cmd = new OleDbCommand(commandString, con); cmd.Parameters.AddWithValue("userid", userID); OleDbDataAdapter dbda = new OleDbDataAdapter(cmd); dbda.Fill(ds); } } |
Einmal programmiert, kann diese Methode in jeder Situation immer wieder neu aufgerufen werden. Lediglich für die flexible Parameter-Übergabe muss man sich deutlich mehr Gedanken machen als ich hier mit diesem Beispiel.
Ich hoffe, ich habe mit meinen Erklärungen geholfen. Jürgen