Autor Beitrag
hakshift
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Sa 13.10.07 15:18 
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.

Dabei habe ich jetzt keine Ahnung wie ich manuelle Änderungen im Programm und neue Einträge
in die Datenbank speichern kann.

Danke im Voraus, für Eure Vorschläge... ;-) liebe grüße
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 13.10.07 16:38 
user profile iconhakshift 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:
ausblenden 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";
  //  analog Parameter vorbereiten
  //  Verbindung öffnen
  conn.Open();
  //  danach die Werte für die Parameter übertragen, ggf. per Schleife
  foreach(DataGridViewRow row in ...) {
    if (row.Changed) {
      cmd1.Parameters[0].Value = ...
      cmd1.Parameters[1].Value = ...
      //  erste Tabelle aktualisieren
      cmd1.ExecuteNonQuery();
      //  analog für jede weitere Tabelle
    }
  }
  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.