Datenbank speichert Änderungen nicht

  • VB.NET
  • .NET (FX) 4.0

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

    Datenbank speichert Änderungen nicht

    Hallo zusammen,

    Arbeite mich gerade in Datenbankprogrammierung ein. Stehe noch ganz am Anfang, glaubte aber den Code unten zu verstehen. Er funktioniert auch super bis man das Programm neu startet. Dann sind nämlich alle Änderungen, die ich in die Access-Datenbank übernommen geglaubt hatte (durch Klicken des zweiten Buttons) einfach nicht mehr vorhanden und die Datenbank präsentiert sich (durch klicken des ersten Buttons) im DataGridView so, als wäre sie nie durch das Programm angefasst worden.

    Programmoberfläche: ein DataGridView, zwei Buttons...

    Funktionalität:
    - Beim Klicken des ersten Buttons wird das DataGridView mit Daten aus der bekannten Nordwind.mdb (Access-Datenbank) gefüllt.
    - Nun können im DataGridView Zeilen gelöscht, hinzugefügt oder geändert werden.
    - Beim Klicken des zweiten Buttons werden die Änderungen im DataGridView zurück in die Datenbank Nordwind.mdb geschrieben.

    Code:

    Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Form1
    3. Private conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Nordwind.mdb")
    4. Private da As OleDbDataAdapter = Nothing
    5. Private ds As DataSet = Nothing
    6. ''' Liefert gefülltes DataSet au der Datenbank
    7. Public Function getArtikel() As DataSet
    8. Dim selStr As String = "SELECT ArtikelNr, Artikelname, Einzelpreis, Mindestbestand FROM Artikel ORDER BY Artikelname"
    9. da = New OleDbDataAdapter(selStr, conn)
    10. 'Neu hinzugefügte Datensätze erhalten sofort einen Primärschlüssel
    11. da.MissingSchemaAction = MissingSchemaAction.AddWithKey
    12. conn.Open()
    13. Dim ds As New DataSet()
    14. da.Fill(ds, "Artikel")
    15. conn.Close()
    16. Return ds
    17. End Function
    18. ''' Zurückschreiben der im DataSet vorgenommenen Änderungen in die Datenbank
    19. Public Sub setArtikel(ByRef ds As DataSet)
    20. Dim cb As New OleDbCommandBuilder(da)
    21. 'Anwenden
    22. conn.Open()
    23. da.Update(ds, "Artikel")
    24. conn.Close()
    25. End Sub
    26. '' Anzeigen
    27. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    28. DataGridView1.DataSource = Nothing
    29. ds = getArtikel()
    30. DataGridView1.DataSource = ds
    31. DataGridView1.DataMember = "Artikel"
    32. 'Aufruf der Routine zum Formatieren des DataGridViews
    33. formatDataGridView(DataGridView1)
    34. End Sub
    35. ''' Aktualisieren
    36. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    37. Dim ds1 As DataSet = ds.GetChanges()
    38. If ds1 IsNot Nothing Then
    39. Try
    40. setArtikel(ds1)
    41. ds.Merge(ds1)
    42. ds.AcceptChanges()
    43. MessageBox.Show("Datenbank wurde aktualisiert!", "Erfolg")
    44. Catch ex As Exception
    45. ds.RejectChanges()
    46. MessageBox.Show(ex.Message, "Fehler")
    47. End Try
    48. End If
    49. End Sub
    50. Private Sub formatDataGridView(dgv As DataGridView)
    51. dgv.Columns.Remove("Einzelpreis")
    52. Dim tbc As New DataGridViewTextBoxColumn()
    53. tbc.DataPropertyName = "Einzelpreis"
    54. tbc.HeaderText = "Einzelpreis"
    55. tbc.Width = 80
    56. tbc.DefaultCellStyle.Format = "c"
    57. tbc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
    58. tbc.DefaultCellStyle.Font = New Font(DataGridView1.Font, FontStyle.Bold)
    59. tbc.DisplayIndex = 2
    60. dgv.Columns.Add(tbc)
    61. End Sub
    62. End Class


    Kann mir jmd sagen, wieso Änderungen beim Neustart des Programms verloren gehen. Wenn ich Button1 nach vorgenommenen und gespeicherten Änderungen klicken, ohne das Programm neu zu starten, scheint er korrekt die geänderte Datenbank zu laden...

    Danke für jede Hilfe!!!

    icekuhn

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

    Es ist oft bei den Datei-Eigenschaften der eingebundenen Datenbank Ins Ausgabeverzeichnis kopieren: Immer eingestellt.
    Bei einem neuen Testlauf wird dann automatisch die im vorigen Testlauf geänderte DB überschrieben und man glaubt - es wurden keine Änderungen gespeichert. Überprüfe diese Einstellung einmal...

    icekuhn schrieb:

    Arbeite mich gerade in Datenbankprogrammierung ein.
    Ich empfehle immer, erst ganz zuletzt die DB einzubinden, und zuvor ohne DB zu entwickeln.
    Und solange man nicht wesentliche Vorraussetzungen erlernt hat, erst recht nicht anfangen mit Datenbank-Zugriffen.
    Bei deim Code ist überaus krude, was du da mit Getchanges, Merge und AcceptChanges treibst.
    Aber dass du schoma einen CommandBuilder verwendest ist immerhin sehr erfreulich :thumbsup:
    Nur solltest du nicht für jedes Abspeichern einen neuen davon erzeugen - einer reicht pro DataAdapter.

    Egal - lass die Finger von diesen Dingen, bis du dir erstmal relationale Datenmodellierung und Databinding angeeignet hast (und das geht einfacher ohne Db)
    Datenverarbeitungs-Vorraussetzungen

    (So, das war mein Standard-Sprüchlein für Db-Anfänger. Andere raten anderes, aber guck dir zumindest den Link und v.a. die von da aus weiterführenden Links an, guck sie alle an, sorgfältig, ohne Ausnahme, und auch die Videos etc pp...)