Probleme Datensätze in einer Access Datei löschen

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Probleme Datensätze in einer Access Datei löschen

    Hallo zusammen,

    ich bin am verzweifeln ;(

    Ich schreibe Datensätze in eine Access Datenbank (Kassenprogramm) Anzahl, Artikel, Preis. Diese sind auch mit einem Datagridview angezeigt.
    Nun möchte ich immer einen Datensatz stornieren (deleten). Das funktioniert meistens, aber sporadisch auch nicht und ich finde den verdammten Fehler
    nicht! Ich habe hier mal die Funktion die ich geschrieben habe!

    Es kommt dann der Fehler:

    Ein Ausnahmefehler des Typs "System.Data.DBConcurrencyException" ist in System.Data.dll aufgetreten.
    Zusätzliche Informationen: Parallelitätsverletzung: Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

    Vielleicht hat mir jemand ein Beispiel wo ich immer den letzten Datensatz löschen kann.

    Vielen Dank!


    Private Sub Stornofunktion()
    Dim cbs As OleDbCommandBuilder = New OleDbCommandBuilder(daBon)
    Dim row As DataRow
    Dim i As Integer
    Dim BonIDDgv As Integer = 0


    Try
    con.Open()

    Dim dt As DataTable = dsBon.Tables("Bon")
    BonIDDgv = DataGridView1.CurrentRow.Cells(6).Value
    Label6.Text = BonIDDgv

    For Each row In dt.Rows
    If row!BonID = BonIDDgv Then
    row.Delete() 'DataRow löschen
    Exit For
    End If
    Next

    If dsBon.HasChanges Then

    'Datenbank updaten
    daBon.Update(dsBon, "Bon")

    dsBon.Clear()
    daBon.Fill(dsBon, "Bon")

    End If

    i = 0
    GDSumme = 0
    For i = 0 To DataGridView1.RowCount - 1
    GDSumme = GDSumme + DataGridView1.Rows(i).Cells("Preis").Value
    Next
    ' TextBox1.Text = TextBox1.Text & vbCrLf & GDSumme.ToString
    GridSumme.Text = "Summe: " & Format(GDSumme, "##0.00")

    If DataGridView1.RowCount < 1 Then
    Storno.Enabled = False
    Storno2.Enabled = False
    Istgleich.Enabled = False
    Istgleich2.Enabled = False
    End If

    Catch ex As OleDbException
    MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK,
    MessageBoxIcon.Exclamation)
    Finally

    con.Close()
    DataGridView1.Refresh()
    End Try
    End Sub
    Bitte poste deinen Code im VB.NET-Quelltext, damit man ihn besser lesen kann...
    Verwendest du in der Tabelle einen PrimeKey mit AutoIncrement zur eindeutigen Unterscheidung deiner Datensätze?
    Wieso leerst du das ganze DS und füllst du es nachher wieder?
    Bitte Try/Catch-Zweig entfernen, damit du weist, welche Zeile den Fehler verursacht!

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

    Normalerweise muss man da nur ein DELETE * FROM TABELLE WHERE KassenBuchEintragPrimaryKeyID = 123 an Access senden und danach die Tabelle neu laden und anzeigen. Was du da machst sieht nach übler wurschtelei aus, genau kan ichs nicht sagen weil dein Code nicht formatiert ist und mir bereits in der ersten Zeile die Augen weh taten...

    Zudem stellt sich die (rechtliche) Frage, ob ein Storno überhaupt gelöscht werden darf. Buchhalterisch sicher nicht ganz sauber...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    ein DELETE * FROM TABELLE WHERE KassenBuchEintragPrimaryKeyID = 123 an Access senden und danach die Tabelle neu laden ...
    Das ist bereits "üble wurstelei".
    Wenn man sich des vorhandenen Instrumentariums richtig bedient, dann braucht man nicht eine ganze Tabelle erneut zu laden, nur weil man einen Datensatz gelöscht hat.
    Sondern man löscht den Datensatz aus den lokalen Daten (wird sofort sichtbar) und synchronisiert die lokalen Daten dann mit der DB (das schickt genau diese Löschung an die Db - kein weiterer Traffic).
    Ist ausserdem viel weniger Code, v.a., wenn man Databinding mit Designern einrichtet, und evtl. gibts sogar generierte, fertig eingerichtete TableAdapter für die Db-Synchronisation.
    Hallo zusammen,

    vielen Dank erstmal. Die Tipps haben mir geholfen! Ein nicht gewurstel Beispiel hätte mir wahrscheinlich noch mehr geholfen!

    Ich habe es jetzt so gemacht!

    VB.NET-Quellcode

    1. Private Sub Stornofunktion()
    2. im Sql As String = "DELETE * from Bon WHERE Autowert = (SELECT max(Autowert) FROM Bon )"
    3. execNQuery(Sql)
    4. dsBon.Clear()
    5. daBon.Fill(dsBon, "Bon")
    6. end Sub
    7. Private Sub execNQuery(cmdText As String)
    8. Dim cmd As New OleDbCommand(cmdText, con)
    9. Try
    10. con.Open()
    11. cmd.ExecuteNonQuery()
    12. Catch ex As Exception
    13. MsgBox(ex.Message)
    14. Finally
    15. con.Close()
    16. End Try
    17. con.Close()
    18. End Sub


    Mal schauen was ihr zu dieser Wurstelei sagt!

    Viele Grüße

    gino-28 schrieb:

    Ein nicht gewurstel Beispiel hätte mir wahrscheinlich noch mehr geholfen!
    hmm - ja, ich bastel dann immer gleich eine Lösung für alles, und dann ists nicht für jeden einfach, da durchzublicken: Dataset->Db
    wie gesagt: das ist für alles, einlesen, ändern, löschen, zufügen, und auch für andere Tabellen.
    Wo das eingebaut ist, synchronisiert man die Db mit einer Zeile Code.

    Aber was du da hast -das sieht ja sogar aus wie ein DataAdapter! daBon - wieso rufst du nicht einfach daBon.Update() auf, und gut ist?
    Dann sparste dir ja genau den wurstel-Roundtrip, wo du die Db änderst, statt deine Daten, und dann die ganze Tabelle neu laden musst, damit deine Daten das auch anzeigen.

    Statt deine Daten direkt zu ändern, und die Änderung upzudaten.

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