Montag, 15. August 2011

August 2011 / C# AccessDB auf DataGridView

Zugriff auf Access-DB mit C#

Auftrag:
In der Firma bekam ich den Auftrag, ein Testprogramm zu schreiben, welches eine Möglichkeit bietet, Daten aus einer Access-Datenbank zu lesen, zu manipulieren und zu schreiben.
Als erstes erstellte ich mir eine ganz simple Access Datenbank mit 1. Tabelle.
Anschliessend versuchte ich einmal eine Datenbankverbindung herzustellen und das ganze einer Listview zuzuweisen, da ich in einem Anderen Projekt Erfahrungen mit diesem Objekt gesammelt habe.
Die Verbindung konnte ich zwar nach kleineren Problemen Herstellen, doch schlussendlich hat es nicht so funktioniert, wie ich wollte. Das Handling der Listview ist für diese Situation nicht sehr angenehm.
Ich stiess auf das Objekt DataGridView, welches genau dazu da ist, Daten anzuzeigen.

Code:
Zuerst muss ein Connecting-String definiert werden. Im Internet findet man Oftmals folgendes dazu:

String strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Datenbank.mdb";

Mit diesem String wird meines Wissens auf eine Datenbank von Access 2003 oder älter zugegriffen.
Zumindest hat er bei mir nicht funktioniert.
Für Access 2007 habe ich folgenden Connecting-String erfolgreich verwendet:

String strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\\Datenbank.accdb;"

Anschliessend wird ein Select-Statement in einem String gespeichert. In meinem Fall sah das so aus:

strAbfrage = "Select * FROM TestTabelle";

Nun muss ein OleDbDataAdapter erstellt werden. Er dient als Brücke zwischen dem DataTable und der Datenbank. Als Parameter werden das Select-Statement und der ConnectingString mitgegeben:

OleDbDataAdapter dAdapter = new OleDbDataAdapter(strAbfrage, StrConnect);

Das nächste Objekt heisst OleDbCommandBuilder. Es generiert automatisch SQL-Code um die Änderungen, welche wir an unserem DataTable machen, der Datenbank mitzuteilen:

OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);

Natürlich brauchen wir noch ein DataTable. Dieses Objekt speichert unsere Daten Temporär, damit wir sie später wieder in die Datenbank schreiben können:

DataTable dTable = new DataTable();

Nun füllen wir das DataTable noch mit den Daten:

dAdapter.Fill(dTable);

Nun haben wir die Daten ins DataTable gefüllt.
Jetzt müssen wir sie noch mit dem DataGridView synchronisieren.
Dazu erstellen wir ein BindingSource-Objekt:

BindingSource bSource = new BindingSource();

Natürlich muss der BindingSource noch das DataTable und dem DataGridView die BindingSource bekannt gemacht, also zugewiesen werden:

bSource.DataSource = dTable;
dgvTest.DataSource = bSource;

Nun funktioniert alles bis auf das synchronisieren mit der Datenbank, denn der OleDbDataAdapter synchronisiert die Daten ja nicht immer mit der Datenbank, sondern nur mit folgendem Befehl:

dAdapter.Update(dTable);

Diesen Befehl kann man nun z.B. per Knopfdruck, beim Verlassen einer Zelle oder beim Validating Event des DataGridViews aufrufen.

Wichtig wäre nun noch ein korrektes Error-Handling.
Was ich bis jetzt eingebaut habe ist das Error-Handling bei falschen Daten. Wenn man also Text anstelle von Zahlen eingibt, wo zahlen gefordert werden.
Wird das gemacht, wird dar DataError-Event ausgelöst. Dort kann dann reagiert werden.

Keine Kommentare:

Kommentar veröffentlichen