Access ID macht Probleme

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von pc-werkstatt.

    Access ID macht Probleme

    Hallo,

    zur Zeit schreibe ich ein bisschen mit einer Access Datenbank. Das Einlesen und Schreiben klappt tadellos aber eins macht mir Probleme! :)

    Es geht darum wenn ich einen Eintrag lösche, was auch klappt, dann lösche ich anhand der ID. Diese ID wird dann gelöscht. Das Problem ist, das dann im Listview ein anderer Eintrag diese ID bekommt und ich diese dann nicht mehr löschen kann und das Falsche gelöscht wird weil in der Access DB ganz andere ID's stehen. Gibt es eine möglichkeit die ID's in der Access DB zu Aktualisieren?

    VB.NET-Quellcode

    1. Dim con As New OleDb.OleDbConnection
    2. Dim cmd As New OleDb.OleDbCommand
    3. Dim anzahl As Integer
    4. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Daniel\Desktop\Accounts.accdb;Persist Security Info=False;"
    5. cmd.Connection = con
    6. MessageBox.Show(ListView1.SelectedIndices(0) + 1)
    7. cmd.CommandText = "delete from Accounts where ID = " & ListView1.SelectedIndices(0) + 1
    8. Try
    9. con.Open()
    10. anzahl = cmd.ExecuteNonQuery()
    11. con.Close()
    12. Catch ex As Exception
    13. MsgBox(ex.Message)
    14. End Try
    15. ListView1.Items.Clear()
    16. AccessDBtoListView()




    lg :)
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Hi Daniel,

    hier ein paar Tipps :)

    - Lagere die DB Zugriffe in eine eigene Klasse aus. Das gehört nicht in die GUI.
    - Benenne deine Controls sauber

    Edit: Was passiert hier: AccessDBtoListView()?
    "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

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

    mrMo schrieb:

    Hi Daniel,

    hier ein paar Tipps :)

    - Lagere die DB Zugriffe in eine eigene Klasse aus. Das gehört nicht in die GUI.
    - Benenne deine Controls sauber

    Edit: Was passiert hier: AccessDBtoListView()?


    Hallo und danke für die Tipps! :) -> Wird direkt umgesetzt!

    in AccessDBtoListview wird lediglich die DB in mein Listview geladen:

    VB.NET-Quellcode

    1. Function AccessDBtoListView()
    2. Dim con As New OleDb.OleDbConnection
    3. Dim cmd As New OleDb.OleDbCommand
    4. Dim reader As OleDb.OleDbDataReader
    5. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Daniel\Desktop\Accounts.accdb;Persist Security Info=False;"
    6. cmd.Connection = con
    7. cmd.CommandText = "select * from Accounts"
    8. Try
    9. con.Open()
    10. reader = cmd.ExecuteReader()
    11. Do While reader.Read()
    12. With ListView1.Items.Add(reader("Benutzername"))
    13. .SubItems.Add(reader("Passwort"))
    14. .SubItems.Add(reader("Datum"))
    15. .SubItems.Add(reader("Bemerkung"))
    16. End With
    17. Loop
    18. reader.Close()
    19. con.Close()
    20. Catch ex As Exception
    21. MessageBox.Show(ex.Message)
    22. End Try
    23. End Function


    Ich habe dies hier versucht aber das Klappt nicht:

    VB.NET-Quellcode

    1. Private Function AccessDBrefresh()
    2. Dim con As New OleDb.OleDbConnection
    3. Dim cmd As New OleDb.OleDbCommand
    4. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Daniel\Desktop\Accounts.accdb;Persist Security Info=False;"
    5. cmd.Connection = con
    6. cmd.CommandText = "ALTER TABLE Accounts ALTER COLUMN Position COUNTER(1,1)"
    7. con.Open()
    8. anzahl = cmd.ExecuteNonQuery()
    9. con.Close()
    10. End Function


    Kannst du mir bei meinem Problem helfen?
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „pc-werkstatt“ ()

    Wo wird denn die ID Column in der Methode AccessDBtoListview dem ListView hinzugefügt?

    Schau dir mal den SQL Adapter an, insbesondere die Fill Methode:
    msdn.microsoft.com/de-de/libra…ataadapter(v=vs.110).aspx

    Nur so zur info für mich: Warum ListView und nicht DataGridView?
    "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
    Ich denke, der Fehler ist im Code recht leicht zu erkennen: Als zu löschende ID wird der SelectedIndex des gelöschten ListviewItems übertragen. (+1).
    Das mag genau einmal funktionieren, aber danach rutschen ja alle folgenden ListviewItem eins hoch, und dann haut bei denen diese Art, die ID zu bestimmen, nicht mehr hin.

    ErfinderDesRades schrieb:

    Als zu löschende ID wird der SelectedIndex des gelöschten ListviewItems übertragen. (+1).


    @pc-werkstatt darauf wollte ich hinaus. Der Index des Elements im ListView entspricht nicht(!) der ID des Datensatzes in der DB.

    Daher musst du dir die ID Spalte mit in dein ListView packen um die ID bei Bedarf ermitteln zu können. Ggf. diese Spalte ausblenden (Zugriff ist trotzdem möglich).
    "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:

    ErfinderDesRades schrieb:

    Als zu löschende ID wird der SelectedIndex des gelöschten ListviewItems übertragen. (+1).


    @pc-werkstatt darauf wollte ich hinaus. Der Index des Elements im ListView entspricht nicht(!) der ID des Datensatzes in der DB.

    Daher musst du dir die ID Spalte mit in dein ListView packen um die ID bei Bedarf ermitteln zu können. Ggf. diese Spalte ausblenden (Zugriff ist trotzdem möglich).


    Danke, genau diese art von gedankenstubser habe ich gebraucht!! :)

    lg
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!