Datenbanktabelle auf einmal leeren funktioniert nur sporadisch

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von gino-28.

    Datenbanktabelle auf einmal leeren funktioniert nur sporadisch

    Hallo zusammen,

    ich versuche seit Tagen eine Datenbanktabelle in einer for each schleife zu löschen und upzudaten! Das funktioniert auch aber nur sporadisch
    dann kommt immer der Fehler (siehe Anhang).

    Hier mein Code:

    VB.NET-Quellcode

    1. Private Sub DELETE_Bontabelle()
    2. Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(daBon)
    3. Try
    4. con.Open()
    5. Dim row As DataRow
    6. Dim i As Integer
    7. Dim dtBon As DataTable = dsBon.Tables("Bon")
    8. 'alle Zeilen des DataTable durchlaufen
    9. For Each row In dtBon.Rows
    10. row.Delete() 'DataRow löschen
    11. i += 1
    12. Debug.WriteLine(i)
    13. Next
    14. 'Datenbank updaten
    15. daBon.Update(dsBon, "Bon")
    16. DataGridView1.Refresh()
    17. Catch ex As OleDbException
    18. MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK,
    19. MessageBoxIcon.Exclamation)
    20. Finally
    21. con.Close()
    22. End Try
    23. End Sub


    Vielen Dank für euere Hilfe

    Gruß Gino

    Edit by hal2000: Code-Tags eingefügt
    Bilder
    • vb-net.png

      63,98 kB, 861×818, 142 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    Du quälst deine Datenbank, und das nimmt sie dir übel, wie man sieht. Folgendes passiert im Hintergrund:
    - Die Tabelle wird vollständig aus der DB in den Speicher geladen: SELECT * FROM tabelle (oder je nach SelectCommand im CommandBuilder)
    - Die Schleife entfernt Zeile für Zeile aus der Kopie
    - Du schreibst die Änderungen zurück; was folgt ist ein DELETE für jede Zeile der Tabelle (DeleteCommand des CommandBuilders)

    Fazit: Unendlich viel Last auf Netzwerk und Datenbank - absolut nicht sinnvoll. Erstelle stattdessen eine einzelne Abfrage der Form DELETE FROM tabelle und sende sie mit ExecuteNonQuery() ab. Danach kannst du dein DataSet via DataAdapter neu laden.

    VB.NET-Quellcode

    1. Dim conn As New OleDbConnection("bla")
    2. conn.Open()
    3. Dim cmd As New OleDbCommand("DELETE FROM tabelle", conn)
    4. cmd.ExecuteNonQuery()
    5. ' DataAdapter.Fill(DataSet)


    Edit: Möglicherweise (!) genügt auch schon ein DataSet.Tables("tabelle").Clear() mit anschließendem Update. Wahrscheinlich kommt aber dennoch der DeleteCommand aus dem CommandBuilder zum Einsatz, der benutzerdefiniert sein kann. Deshalb kann Clear() diesen nicht einfach übergehen.

    Du schreibst, dass du "eine Tabelle löschen" möchtest. Tatsächlich entfernst du aber nur die Inhalte der Tabelle. Ich nehme mal an, dass das auch das Ziel ist.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „hal2000“ ()

    Ahoi,

    je nach DB-System ist zum Leeren einer Tabelle ein Truncate sinnvoller, da hierbei z.B. auch auto-indizes gelöscht werden und das Zählen dieser von vorn beginnt.
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de