hakshift hat folgendes geschrieben: |
Hallo Leute,
ich habe ein Problem mit dem speichern von Daten von einem DataGridView in
eine Access-Datenbank.
Und zwar hole ich von der Datenbank mehrere Werte die in verschiedenen Tabellen stehen
in mein DGV. Also keine ganzen Tabellen, sondern nur Teile davon um diese anderst im DGV
anzuordnen. |
In diesem Fall gibt es (offensichtlich) keine eineindeutige Beziehung zwischen den Tabellenstrukturen in der Datenbank und der DGV-Datenmenge. Also musst Du das
Speichern manuell regeln, z.B. für jede Tabelle einen eigenen DbCommand verwenden:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| using( DbConnection conn = new DbConnection(connString) { DbCommand cmd1 = conn.CreateCommand(); cmd1.CommandText = "UPDATE Tabelle1 SET Name = @Name WHERE ID = @ID"; cmd1.Parameters.Add("@ID", DbType.Int32); cmd1.Parameters.Add("@Name", DbType.String); cmd2.CommandText = "UPDATE Tabelle2 SET PLZ = @PLZ WHERE ID = @ID"; conn.Open(); foreach(DataGridViewRow row in ...) { if (row.Changed) { cmd1.Parameters[0].Value = ... cmd1.Parameters[1].Value = ... cmd1.ExecuteNonQuery(); } } conn.Close(); } |
Entsprechende Befehle brauchst Du für INSERT und DELETE.
Alternative: In der Datenbank eine
StoredProcedure definieren, die alle Parameter "am Stück" erhält und nacheinander die einzelnen Tabellen mit den Änderungen versorgt. Vorteile: nur ein Aufruf aus der Anwendung heraus, alle DB-Operationen erfolgen innerhalb der DB, die DB selbst kann das optimieren. Nachteile: komplexere Vorarbeiten nötig, kann das Access überhaupt?
Gruß Jürgen
PS. Ich verwende generell die Bezeichnung per
Db*; das ist natürlich zu ersetzen durch die speziellen Klassen des DbProvider. "row.Changed" ist Pseudo-Code, und "DbType" ist teilweise Db-spezifisch; beides muss angepasst werden. Ob die DbParameter bei Access mit '@' oder '?' oder ':' sowie mit oder ohne Namen angegeben werden müssen, weiß ich nicht; das macht jeder DbProvider anders - bitte prüfen.