Announcement

Collapse
No announcement yet.

Mit DataAdapter in 2 Datenbanken/Tabellen schreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mit DataAdapter in 2 Datenbanken/Tabellen schreiben

    Hallo Zusammen,

    ich habe einmal eine Frage zu DataAdaptern. Recherhiert habe ich schon, bin aber leider bis jetzt noch nicht auf eine Lösung gekommen.

    Ich möchte den Inhalt eines Datagridviews in 2 identische Tabellen von 2 Datenbanken schreiben.

    [highlight=vbnet]
    Dim conn_string As String = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDBatabase Password=" & DBPassword & ";Data Source=" & Datenbankpfad
    Dim query As String
    query = "SELECT * FROM COLUMN where id = " & ID
    Main.objDataAdapterDetails = New System.Data.OleDb.OleDbDataAdapter(query, conn_string)
    Main.objDataTableDetails = New DataTable()
    Dim cmd As System.Data.OleDb.OleDbCommandBuilder = New System.Data.OleDb.OleDbCommandBuilder(Main.objData AdapterDetails)
    Main.objDataAdapterDetails.FillSchema(Main.objData TableDetails, SchemaType.Source)
    Main.objDataAdapterDetails.Fill(Main.objDataTableD etails)
    Main.dgv.DataSource = (Main.objDataTableDetails)

    '.... Hier kommen die Benutzeränderungen

    Main.objDataAdapterDetails.Update(Main.objDataTabl eDetails)
    [/highlight]

    Soweit funktioniert auch alles -> In der ersten Tabelle sind die Werte gespeichert. Nun soll in die 2. Tabelle der anderen DB gespeichert werden, das funktioniert jedoch nicht. Mein Code ist folgender:

    [highlight=vbnet]
    conn_string = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDBatabase Password=" & DBPassword & ";Data Source=" & Datenbankpfad_secondDB
    objDataAdapterDetails_secondDB = New System.Data.OleDb.OleDbDataAdapter(query, conn_string)
    Dim cmd2 As System.Data.OleDb.OleDbCommandBuilder = New System.Data.OleDb.OleDbCommandBuilder(objDataAdapt erDetails_secondDB)

    objDataAdapterDetails_secondDB.Update(Main.objData TableDetails)
    [/highlight]

    Bei diesem Update passiert einfach nichts, auch keine Fehlermeldung kommt hoch. Lasse ich das erste Update weg, funktioniert das zweite Update.

    Meine Vermutung geht dahin, dass nach dem ersten Update in dem DataTable "objDataTableDetails" keine Änderungen mehr vorhanden sind und daher beim 2. Update nichts mehr zu schreiben gibt.

    Evtl. gehe ich die Sache auch falsch an, ggf. habt ihr ja einen Tipp für mich.

    Viele Grüße, derOptimist

  • #2
    Dein Ziel ist das der Inhalt von beiden Tabellen identisch ist.
    Kannst du das nicht über DB-Mittel wie z.B. eine Replikation oder einen DB-Link erreichen?

    Comment


    • #3
      Hi, leider nein da ich nicht davon ausgehen kann, dass die 2. DB erreichbar ist.

      Bzw. die Ansteuerung der 2. DB ist optional und soll konfiguriert werden können.

      Comment


      • #4
        Originally posted by derOptimist View Post
        Meine Vermutung geht dahin, dass nach dem ersten Update in dem DataTable "objDataTableDetails" keine Änderungen mehr vorhanden sind und daher beim 2. Update nichts mehr zu schreiben gibt.
        Ich hab wenig Praxis damit, aber meine Gedankten dazu lauten:
        Also wenn das 2. Update ohne das 1. Update funktioniert, sind offenbar ja die entsprechenden Commandos richtig verdrahtet.

        Der Effekt deutet dann tatsächlich darauf hin, was Du in Deiner Vermutung sagst. Dies würde bedeuten, dass die Komponenten den Recordstatus über die Datatable selbst verwalten unabhängig vom Dataadapter. Das wird glaub ich über rowstate gemacht.
        Wenn Du deine Änderungen also woanders "ablegen" willst, müsstest Du Dir vor dem ersten Update den Rowstate merken.

        Das Verfahren setzt natürlich voraus, dass Du eindeutigen Zugriff auf die 2. DB hast. Wenn andere Clients auf der gleichen 2. DB rumturnen, dann macht es keinen Sinn. Ebenso, wenn Du nicht alle Updates von der 1. DB mitbekommst.
        Gruß, defo

        Comment


        • #5
          Solange die beiden Tabellen in den beiden Datenbanken nicht nur strukturgleich sondern auch inhaltsgleich sind gibt es keine einfache Lösung.
          Du könntest zwar einfach AcceptChangesDuringUpdate am DataAdapter auf false setzen damit die Änderungen nach dem Update in die erste Datenbank erhalten bleiben und diese dann auch auf einer 2.ten Datenbank ausführen. Das wird aber nicht wirklich richtig funktionieren wenn der Ausgangszustand in den beiden Datenbanken nicht gleich war.

          Stellen wir uns vor du hast aus der ersten DB gelesen einen Datensatz geändert und möchtest den zurückschreiben. Da der Datensatz in der DB vorhanden war und nur geändert wurde wird der DataAdapter dafür ein Update Statement erzeugen. Wenn der Datensatz in der 2.ten Datenbank nicht existiert läuft der Update auf der 2.ten Datenbank ins leere. Du bräuchtest eigentlich einen Insert.

          Der DataAdapter erzeugt SQL Statement für die Differenz für das aus der DB gelesenen und des lokal in der DataTable geänderten Daten und nicht für die Differenz zwischen der DataTable und dem Zustand der Datenbank zum Zeitpunkt des Updates.

          Die ~harte~ ~einfache~ Methode (die nur unter engen Grenzen möglich ist) wäre die Daten in der 2.ten DB zu löschen und aus der DateTable neu zu inserten. Dazu alles wie bisher machen und nach dem 1.ten Update über alle Rows iterieren und den RowState auf added setzen. Da musst du aber natürlich bezüglich der referenziellen Integrität aufpassen und aufpassen das du gleiche Primary Keys bekommst. Je nach Einstellungen des DataAdapters und der Datenbank ist das gezielte setzen des Primary Key eventuell nicht erlaubt bzw. je nach Datenbank Model nicht möglich.

          Comment

          Working...
          X