UPDATE-Anweisung ohne Auswirkung auf MS-Access Datenbank

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von aeleks.

    UPDATE-Anweisung ohne Auswirkung auf MS-Access Datenbank

    Hallo zusammen,
    ich zerbreche mir schon eine Weile den Kopf über folgendes Problem. Ich habe eine kleine Windows-Forms Anwendung, über welche ich Einträge in einer MS-Access Datenbank erstellen, verändern und löschen möchte. Die INSERT INTO und DELETE-Anweisungen funktionieren problemlos - nur die UPDATE-Anweisung bereitet Kopfschmerzen. Ich kann den von mir geschriebenen Code ausführen, ohne das Fehler auftreten. Allerdings erfolgt keine Änderung des Datensatzes. Ich hoffe einer von euch kann mir an dieser Stelle helfen oder kann mich auf Ungereimtheiten in meinem Code hinweisen.
    Viele Grüße

    edit: hier noch ein Bild vom Aufbau meiner Access DB


    VB.NET-Quellcode

    1. Public Class frmAnzeige
    2. Dim cnnDatenbank As New OleDb.OleDbConnection
    3. 'hier steht eigentlich der volle Pfad
    4. Dim pfadDatenbank As String = "*****_datenbank\bestelllisteDB.accdb"
    5. Dim tabDatenbank As String = "listeBestellung"
    6. Private Sub frmAnzeige_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Me.datagridAnzeige.ReadOnly = True
    8. cnnDatenbank = New OleDb.OleDbConnection
    9. cnnDatenbank.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & pfadDatenbank
    10. refreshDatagrid()
    11. End Sub
    12. Public Sub refreshDatagrid()
    13. Dim sqlQry_cmd As String
    14. Call clsDatabase.datenbankOeffnen(cnnDatenbank)
    15. sqlQry_cmd = "SELECT ID, teileBeschreibung, teileHersteller, teileBestellnummer, teileAnzahl, teileStatus, datumEintrag, datumBestellung FROM " & tabDatenbank & " ORDER BY ID DESC"
    16. Dim cmdDatenbank As New OleDb.OleDbDataAdapter(sqlQry_cmd, cnnDatenbank)
    17. Dim dtTemporaer As New DataTable
    18. cmdDatenbank.Fill(dtTemporaer)
    19. Me.datagridAnzeige.DataSource = dtTemporaer
    20. cmdDatenbank.Dispose()
    21. Call clsDatabase.datenbankSchliessen(cnnDatenbank)
    22. End Sub
    23. Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
    24. frmBearbeiten.Show()
    25. clsDatabase.statusBearbeitung = False
    26. End Sub
    27. Private Sub datagridAnzeige_RowHeaderMouseDoubleClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles datagridAnzeige.RowHeaderMouseDoubleClick
    28. clsDatabase.statusBearbeitung = True
    29. clsDatabase.idBearbeitung = Me.datagridAnzeige.CurrentRow.Cells(0).Value
    30. frmBearbeiten.Show()
    31. End Sub
    32. End Class
    33. Public Class frmBearbeiten
    34. Dim cnnDatenbank As New OleDb.OleDbConnection
    35. 'hier steht eigentlich der volle Pfad
    36. Dim pfadDatenbank As String = "*****_datenbank\bestelllisteDB.accdb"
    37. Dim tabDatenbank As String = "listeBestellung"
    38. Private Sub btnSpeichern_Click(sender As Object, e As EventArgs) Handles btnSpeichern.Click
    39. Dim sqlQry_cmd As String
    40. Call clsDatabase.datenbankOeffnen(cnnDatenbank)
    41. If clsDatabase.statusBearbeitung = False Then
    42. sqlQry_cmd = _
    43. "INSERT INTO " & tabDatenbank & _
    44. " (teileBeschreibung, teileHersteller, teileBestellnummer, teileAnzahl, datumEintrag) " & _
    45. "VALUES (@teileBeschreibung, @teileHersteller, @teileBestellnummer, @teileAnzahl, @datumEintrag)"
    46. Dim cmdDatenbank As New OleDb.OleDbCommand(sqlQry_cmd, cnnDatenbank)
    47. cmdDatenbank.Parameters.AddWithValue("@teileBeschreibung", Me.txtBeschreibung.Text)
    48. cmdDatenbank.Parameters.AddWithValue("@teileHersteller", Me.txtHersteller.Text)
    49. cmdDatenbank.Parameters.AddWithValue("@teileBestellnummer", Me.txtBestellnummer.Text)
    50. cmdDatenbank.Parameters.AddWithValue("@teileAnzahl", Me.txtAnzahl.Text)
    51. cmdDatenbank.Parameters.AddWithValue("@datumEintrag", CStr(Date.Today))
    52. cmdDatenbank.ExecuteNonQuery()
    53. cmdDatenbank.Dispose()
    54. ElseIf clsDatabase.statusBearbeitung = True Then
    55. sqlQry_cmd = _
    56. "UPDATE " & tabDatenbank & _
    57. " SET teileBeschreibung = @teileBeschreibung, " & _
    58. "teileHersteller = @teileHersteller, " & _
    59. "teileBestellnummer = @teileBestellnummer, " & _
    60. "teileAnzahl = @teileAnzahl, " & _
    61. "teileStatus = @teileStatus, " & _
    62. "datumEintrag = @datumEintrag, " & _
    63. "datumBestellung = @datumBestellung " & _
    64. "WHERE ID = @id"
    65. Dim cmdDatenbank As New OleDb.OleDbCommand(sqlQry_cmd, cnnDatenbank)
    66. cmdDatenbank.Parameters.AddWithValue("@id", clsDatabase.idBearbeitung)
    67. cmdDatenbank.Parameters.AddWithValue("@teileBeschreibung", Me.txtBeschreibung.Text)
    68. cmdDatenbank.Parameters.AddWithValue("@teileHersteller", Me.txtHersteller.Text)
    69. cmdDatenbank.Parameters.AddWithValue("@teileBestellnummer", Me.txtBestellnummer.Text)
    70. cmdDatenbank.Parameters.AddWithValue("@teileAnzahl", Me.txtAnzahl.Text)
    71. If Me.chckBestellt.Checked = True Then
    72. cmdDatenbank.Parameters.AddWithValue("@teileStatus", "Ja")
    73. ElseIf Me.chckBestellt.Checked = False Then
    74. cmdDatenbank.Parameters.AddWithValue("@teileStatus", "Nein")
    75. End If
    76. cmdDatenbank.Parameters.AddWithValue("@datumEintrag", Me.txtDatumEintrag.Text)
    77. cmdDatenbank.Parameters.AddWithValue("@datumBestellung", Me.txtDatumBestellung.Text)
    78. cmdDatenbank.ExecuteNonQuery()
    79. cmdDatenbank.Dispose()
    80. End If
    81. Call clsDatabase.datenbankSchliessen(cnnDatenbank)
    82. frmAnzeige.refreshDatagrid()
    83. Me.Close()
    84. End Sub
    85. Private Sub frmBearbeiten_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    86. cnnDatenbank = New OleDb.OleDbConnection
    87. cnnDatenbank.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & pfadDatenbank
    88. If clsDatabase.statusBearbeitung = False Then
    89. With Me
    90. .chckBestellt.Checked = False
    91. .chckBestellt.Enabled = False
    92. .btnLoeschen.Enabled = False
    93. End With
    94. ElseIf clsDatabase.statusBearbeitung = True Then
    95. Dim sqlQry_cmd As String
    96. With Me
    97. .chckBestellt.Checked = False
    98. .chckBestellt.Enabled = True
    99. .btnLoeschen.Enabled = True
    100. End With
    101. Call clsDatabase.datenbankOeffnen(cnnDatenbank)
    102. sqlQry_cmd = "SELECT teileBeschreibung, teileHersteller, teileBestellnummer, teileAnzahl, teileStatus, datumEintrag, datumBestellung FROM " & tabDatenbank & _
    103. " WHERE ID = @id"
    104. Dim cmdDatenbank As New OleDb.OleDbCommand(sqlQry_cmd, cnnDatenbank)
    105. cmdDatenbank.Parameters.AddWithValue("@id", clsDatabase.idBearbeitung)
    106. Dim dtTemporaer As New DataTable
    107. dtTemporaer.Load(cmdDatenbank.ExecuteReader)
    108. With Me
    109. .txtBeschreibung.Text = dtTemporaer.Rows(0)("teileBeschreibung")
    110. .txtHersteller.Text = dtTemporaer.Rows(0)("teileHersteller")
    111. .txtBestellnummer.Text = dtTemporaer.Rows(0)("teileBestellnummer")
    112. .txtAnzahl.Text = dtTemporaer.Rows(0)("teileAnzahl")
    113. .txtDatumEintrag.Text = CStr(dtTemporaer.Rows(0)("datumEintrag"))
    114. .txtDatumBestellung.Text = CStr(dtTemporaer.Rows(0)("datumBestellung"))
    115. If dtTemporaer.Rows(0)("teileStatus") = "Ja" Then
    116. .chckBestellt.Checked = True
    117. End If
    118. End With
    119. cmdDatenbank.Dispose()
    120. clsDatabase.datenbankSchliessen(cnnDatenbank)
    121. End If
    122. End Sub
    123. Private Sub btnLoeschen_Click(sender As Object, e As EventArgs) Handles btnLoeschen.Click
    124. Dim sqlQry_cmd As String
    125. Call clsDatabase.datenbankOeffnen(cnnDatenbank)
    126. sqlQry_cmd = _
    127. "DELETE FROM " & tabDatenbank & _
    128. " WHERE ID = @id"
    129. Dim cmdDatenbank As New OleDb.OleDbCommand(sqlQry_cmd, cnnDatenbank)
    130. cmdDatenbank.Parameters.AddWithValue("@id", clsDatabase.idBearbeitung)
    131. cmdDatenbank.ExecuteNonQuery()
    132. cmdDatenbank.Dispose()
    133. Call clsDatabase.datenbankSchliessen(cnnDatenbank)
    134. frmAnzeige.refreshDatagrid()
    135. Me.Close()
    136. End Sub
    137. End Class
    138. Public Class clsDatabase
    139. Public Shared statusBearbeitung As Boolean
    140. Public Shared idBearbeitung As Long
    141. Public Shared Sub datenbankOeffnen(ByRef verbindungDb As OleDb.OleDbConnection)
    142. Try
    143. If Not verbindungDb.State = ConnectionState.Open Then
    144. verbindungDb.Open()
    145. End If
    146. Catch
    147. MsgBox("Erkannter Fehler: Verbindung zur Datenbank fehlgeschlagen.", MsgBoxStyle.Critical, "Fehlermeldung")
    148. End Try
    149. End Sub
    150. Public Shared Sub datenbankSchliessen(ByRef verbindungDb As OleDb.OleDbConnection)
    151. Try
    152. If verbindungDb.State = ConnectionState.Open Then
    153. verbindungDb.Close()
    154. End If
    155. Catch
    156. MsgBox("Erkannter Fehler: Verbindung zur Datenbank konnte nicht getrennt werden.", MsgBoxStyle.Critical, "Fehlermeldung")
    157. End Try
    158. End Sub
    159. End Class

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

    Das Problem hat sich erledigt, lag an zwei Details:

    Zum Einen war wie laut petaod die Reihenfolge der Parameter relevant.

    Zum Anderen kam es nach der Ordnung zu einem Parameterfehler, ausgelöst durch das leere Textfeld, in welchem eigentlich ein Datum stehen musste (laut Access-Vorgabe).

    Vielen Dank für Eure Antworten.