Datenbankeinträge mit ODBC kopieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von commander.

    Datenbankeinträge mit ODBC kopieren

    Hallo liebe Gemeinde :)

    ich versuche aus einer Access-DB bestimmte Werte auszulesen, diese dann zu ändern und wieder zurückzuschreiben.
    Die alten Einträge sollen aber erhalten bleiben...

    Das Auslesen und Ändern der Daten funktioniert einwandfrei.
    Beim zurückschreiben werden jedoch die alten Werte upgedatet, anstatt neu geschrieben.
    Ich hätte die Werte gern als zusätzliche Einträge in der DB

    Mein Code dafür:

    VB.NET-Quellcode

    1. Using connection As New OdbcConnection(connectionString)
    2. Dim adapter As New OdbcDataAdapter(queryString, connection)
    3. Try
    4. connection.Open()
    5. adapter.Fill(dataSet)
    6. Dim dt As New DataTable
    7. dt = dataSet.Tables(0)
    8. For Each row As DataRow In dt.Rows
    9. row("Company") = tb_company_nach.Text
    10. row("Auftragsnummer") = tb_auftrag_nach.Text
    11. row("ID") = row("ID") + 10000000
    12. Next
    13. dgv.DataSource = dataSet.Tables(0)
    14. Dim builder As OdbcCommandBuilder = New OdbcCommandBuilder(adapter)
    15. adapter.Update(dataSet)
    16. Catch ex As Exception
    17. MessageBox.Show("Es ist ein Fehler aufgetreten:" & vbNewLine & ex.Message, "Fehler...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    18. End Try
    19. End Using
    20. Return dataSet


    Der Aufruf erfolgt so:

    VB.NET-Quellcode

    1. Daten_kopieren(ds, "DSN=xxx;UID=xxx;PWD=xxx", "select * from DB where company = " & cb_company_von.SelectedItem & " and auftragsnummer = " & tb_auftrag_von.Text)



    Ich hoffe, das mir von euch jemand helfen kann...

    Vielen Dank schon mal :)
    wenn du datensätze zufügen willst, dann füge sie hinzu.
    Ein Ändern bestehender DataRows führt natürlich dazu, dass diese Datensätze auch in der DB "nur" geändert werden - neue werden dabei nicht erzeugt.

    hinzufügen geht - wer hätte das gedacht? - mit der DataRowCollection.Add() - Methode. Die gibts sogar in 2 Überladungen.
    Erst einmal Danke für die schnelle Antwort...

    Da die DB 119 rows hat und ich ja glaube ich dann auch 119 mal DataRowCollection.ADD() schreiben müsste,
    hab ich mir das jetzt so gedacht, dass ich das DataTable kopiere, in der Kopie die Werte änder und die beiden DataTables dann zusammenführe.

    Ich hab mir das zusammengefügte DataTable in einem DGV anzeigenlassen.
    Sieht soweit auch genau so aus, wie ich das eigentlich haben möchte.

    Wenn ich das ganze jetzt mittels

    VB.NET-Quellcode

    1. adapter.Update(dt)

    updaten möchte ( er müsste jetzt ja bei Tables schreiben ), werden trotzdem nur die alten Werte geändert...
    Hier nochmal der Code:

    VB.NET-Quellcode

    1. Using connection As New OdbcConnection(connectionString)
    2. Dim adapter As New OdbcDataAdapter(queryString, connection)
    3. Try
    4. connection.Open()
    5. adapter.Fill(dataSet)
    6. Dim dt As New DataTable
    7. dt = dataSet.Tables(0)
    8. Dim dt_copy As DataTable
    9. dt_copy = dt.Copy()
    10. For Each row As DataRow In dt_copy.Rows
    11. row("Company") = tb_company_nach.Text
    12. row("Auftragsnummer") = tb_auftrag_nach.Text
    13. row("ID") = row("ID") + 10000000
    14. Next
    15. dt.Merge(dt_copy)
    16. dgv.DataSource = dt
    17. Dim builder As OdbcCommandBuilder = New OdbcCommandBuilder(adapter)
    18. adapter.Update(dt)
    19. Catch ex As Exception
    20. MessageBox.Show("Es ist ein Fehler aufgetreten:" & vbNewLine & ex.Message, "Fehler...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    21. End Try
    22. End Using
    23. Return dataSet


    Mit den Schleifen funktioniert nicht...
    (warum machst du eiglich so viele Leerzeilen in deinen Code? mir ist mein Bildschirm immer zu klein - das letzte was ich bräuchte wären Leerzeilen, die nichts bedeuten)

    Ansonsten denke ich, dass die Copy-Methode auch den RowState der Rows kopiert, mit dem Ergebnis, dass die neuen Rows auch Rowstate.Unchanged haben.
    Da hilft - in einer Schleife - Datarow.SetAdded() aufzurufen.

    Ansonsten denk auch mal über den Gebrauch von TryCatch nach - ob die von dir da durchgeführte Fehlerbehandlung wirklich einen Fehler behandeln würde, oder im Gegenteil es nur noch schlimmer machte.
    Auf jeden Fall das Debuggen erschwerst du dir damit.

    TryCatch ist ein heißes Eisen
    Danke, danke, danke... jetzt läuft es :)

    VB.NET-Quellcode

    1. Using connection As New OdbcConnection(connectionString)
    2. Dim adapter As New OdbcDataAdapter(queryString, connection)
    3. connection.Open()
    4. adapter.Fill(dataSet)
    5. Dim dt As New DataTable
    6. dt = dataSet.Tables(0)
    7. Dim dt_copy As DataTable
    8. dt_copy = dt.Copy()
    9. For Each row As DataRow In dt.Rows
    10. row("Company") = tb_company_nach.Text
    11. row("Auftragsnummer") = tb_auftrag_nach.Text
    12. row("ID") = row("ID") + 10000000
    13. Next
    14. For i = 0 To dt_copy.Rows.Count - 1
    15. dt_copy.Rows(i).SetAdded()
    16. Next
    17. dt.Merge(dt_copy)
    18. dgv.DataSource = dt
    19. Dim builder As OdbcCommandBuilder = New OdbcCommandBuilder(adapter)
    20. adapter.Update(dt)
    21. End Using
    22. Return dataSet