Datenbankanbindung über Formular in VB 2010

  • VB.NET

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

    Datenbankanbindung über Formular in VB 2010

    Hallo Zusammen,

    ich habe die Suche schon bemüht, konnte allerdings nicht wirklich bzgl. meines Problemes fündig werden. Hoffe, ihr könnt mir helfen!
    Ich habe eine relativ simple Tabelle in Access erstellt und möchte diese über ein Formular , erstellt in VB 2010, anzeigen und füllen lassen. Ich habe dabei die Galileo Plattform genutzt, um mir das Ganze selber beizubringen.
    Die Anzeige der Daten aus der DB im Formular klapp wunderbar, ich möchte aber einen Schritt weitergehen und die Daten ändern, löschen oder hinzufügen.
    Ich komme nun nicht mehr weiter an der Stelle, an der die angehängten Änderungen im DataSet an die DB übergeben werden.
    Wenn ich Daten hinzufüge, dann scheinen diese zwar im DataSet auch vorhanden, aber werden nicht an die DB übergeben.
    Was mache ich falsch, könnt ihr mir helfen?

    Achso, die DB habe ich nicht in das Projekt eingefügt, diese soll autark bleiben!

    Vielen Dank vorab!

    VB.NET-Quellcode

    1. 'Import der Klasse(n) um die Objekte freizugeben
    2. Imports System.Data
    3. Imports System.Data.OleDb
    4. Public Class Form1
    5. 'objConnection = Provider verbindet zur Quelle, DataAdapter = Datenmenge aus Quelle über SQL,
    6. 'DataSet=Puffer/Zwischenspeicher für angezeigte und veränderte Daten, DataView = Bereitstellung der Daten auf Formular
    7. Dim objConnection As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=C:\Tools\KKontakt\KKontakt.mdb")
    8. Dim objDataAdapter As OleDb.OleDbDataAdapter
    9. Dim objDataSet As DataSet
    10. Dim objDataView As DataView
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. 'Wertzuweisung für definierte Objekte
    13. objDataView = Nothing
    14. 'neues DataSet für Prozedur
    15. objDataSet = New DataSet()
    16. 'Verbindung öffnen
    17. objConnection.Open()
    18. 'Adapter wird definiert, Referenz über SQL-Anweisung
    19. objDataAdapter = New OleDb.OleDbDataAdapter("SELECT ID, Datum, Bearbeiter, Quelle, Klasse FROM [Kontaktklassifizierung E-Mail] Order by Datum", objConnection)
    20. 'Adapter wird gefüllt
    21. objDataAdapter.Fill(objDataSet, "Kontaktklassifizierung E-Mail")
    22. 'DataView wird auf DB referenziert
    23. objDataView = New DataView(objDataSet.Tables("Kontaktklassifizierung E-Mail"))
    24. 'Steuerelemente an Datenfelder(DB) binden (DataBinding)
    25. With Me
    26. .TextBox1.DataBindings.Add("Text", objDataView, "Datum")
    27. .TextBox2.DataBindings.Add("Text", objDataView, "Bearbeiter")
    28. .TextBox3.DataBindings.Add("Text", objDataView, "Quelle")
    29. .TextBox4.DataBindings.Add("Text", objDataView, "Klasse")
    30. End With
    31. 'Ereignissanzeige für Sub AnzDatensatz
    32. AddHandler Me.BindingContext(objDataView).PositionChanged, AddressOf AnzDatensatz
    33. 'explizites anstoßen des Ereignisses
    34. Me.AnzDatensatz(objDataView, New System.EventArgs())
    35. End Sub
    36. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    37. 'Anhängen eines neuen Datensatz in die DB (über Steuerfelder)
    38. 'Deklarieren einer neuen Zeile (DataRow) als Objekt
    39. Dim objTabelle As DataTable
    40. Dim objZeile As DataRow
    41. objTabelle = objDataSet.Tables("Kontaktklassifizierung E-Mail")
    42. 'Objekt wird als Eigenschaft "neue Zeile" der DB gesetzt
    43. objZeile = objTabelle.NewRow()
    44. With objZeile
    45. 'der Wert der Textbox wird in den Datensatz/Datenfeld (DataAdapter) geschrieben
    46. .Item("Datum") = TextBox1.Text
    47. .Item("Bearbeiter") = TextBox2.Text
    48. .Item("Quelle") = TextBox3.Text
    49. .Item("Klasse") = TextBox4.Text
    50. End With
    51. 'an das DataSet werden die im Adapter gespeicherten neuen Werte angehängt
    52. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows.Add(objZeile)
    53. 'Änderungen bestätigen
    54. objDataSet.AcceptChanges()
    55. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    56. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    57. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Twace“ () aus folgendem Grund: weitere Information:

    Du musst einen Update-Command fürs ändern und einen Delete-Command fürs Löschen einfügen.

    VB.NET-Quellcode

    1. objDataAdapter = New OleDb.OleDbDataAdapter("UPDATE TABELLE_1 SET Spalte_1", objConnection)

    VB.NET-Quellcode

    1. objDataAdapter = New OleDb.OleDbDataAdapter("DELETE FROM TABELLE_1 WHERE Test = '" & TextBox1.Text & "'", objConnection)



    Das müsste dir eig. weiterhelfen.

    LG

    Wenn ich dir geholfen habe, du kennst ja den BEDANKEN-Button ;)
    Erst einmal vielen Dank für deine schnelle Antwort!

    Jetzt mal ne ganz dumme Frage, wo muss ich das einfügen?

    VB.NET-Quellcode

    1. objDataAdapter = New OleDb.OleDbDataAdapter("SELECT ID, Datum, Bearbeiter, Quelle, Klasse FROM [Kontaktklassifizierung E-Mail] Order by Datum", objConnection)


    habe ich ja in Form_Load zugewiesen?! Erfolgt nochmals ene Zuweisung als

    VB.NET-Quellcode

    1. objDataAdapter = New OleDb.OleDbDataAdapter("UPDATE TABELLE_1 SET Spalte_1", objConnection)
    ?

    Ich sehe, ich muss auch die Datenfelder/Spaöte angeben, muss dies sein? Kann ich dem Adapter nicht sagen "alles updaten"?
    Also erstmal würd ich ne Private Sub() für den Datenbank zugriff machen, dann kannste das immer ändern, ohne die ganze Form zu durchsuchen. Desweiteren kannst du natürlich auch sagen

    VB.NET-Quellcode

    1. "UPDATE Tabelle_1" 'oder vllt. auch "UPDATE Tabelle_1 SET *"


    So müsste das eig funktionieren, aber mach doch einfach mehrere Subs und dann kannste jeder Sub die Commands einfügen, und wenn du Updaten willst, rufst du die Sub Datenbank_Update() ab oder wenn du etwas löschen willst die Sub Datenbank_Löschen. Musst du natürlich vorher anlegen und definieren.

    Gruß
    Also ich habe es jetzt einfach(!) mal so probiert:

    VB.NET-Quellcode

    1. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    2. 'Anhängen eines neuen Datensatz in die DB (über Steuerfelder)
    3. 'Deklarieren einer neuen Zeile (DataRow) als Objekt
    4. Dim objTabelle As DataTable
    5. Dim objZeile As DataRow
    6. objTabelle = objDataSet.Tables("Kontaktklassifizierung E-Mail")
    7. 'Objekt wird als Eigenschaft "neue Zeile" der DB gesetzt
    8. objZeile = objTabelle.NewRow()
    9. objDataAdapter = New OleDb.OleDbDataAdapter("UPDATE [Kontaktklassifizierung E-Mail] SET *", objConnection)
    10. With objZeile
    11. 'der Wert der Textbox wird in den Datensatz/Datenfeld (DataAdapter) geschrieben
    12. .Item("Datum") = TextBox1.Text
    13. .Item("Bearbeiter") = TextBox2.Text
    14. .Item("Quelle") = TextBox3.Text
    15. .Item("Klasse") = TextBox4.Text
    16. End With
    17. 'an das DataSet werden die im Adapter gespeicherten neuen Werte angehängt
    18. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows.Add(objZeile)
    19. 'Änderungen bestätigen
    20. objDataSet.AcceptChanges()
    21. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    22. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    23. End Sub


    Sollte ja eigentlich so funktionieren, für das anhängen eines Datensatzes, oder?
    Das DataSet scheint diesen auch inne zu haben, aber es wird einfach nicht in die DB übertragen! Wenn ich also das Programmin VB 2010 stoppe und in die DB gehe, ist der angehängte Datensatz nicht enthalten.
    Also eing. sollte das funktionieren.

    VB.NET-Quellcode

    1. Private Sub Datenbank_Update()
    2. Dim objTabelle As DataTable
    3. Dim objZeile As DataRow
    4. objTabelle = objDataSet.Tables("Kontaktklassifizierung E-Mail")
    5. objZeile = objTabelle.NewRow()
    6. objDataAdapter = New OleDb.OleDbDataAdapter("UPDATE Kontaktklassifizierung E-Mail", objConnection) ' wie gesagt vllt. auch "UPDATE Kontaktklassifizierung E-Mail SET *", objConnection
    7. With objZeile
    8. .Item("Datum") = TextBox1.Text
    9. .Item("Bearbeiter") = TextBox2.Text
    10. .Item("Quelle") = TextBox3.Text
    11. .Item("Klasse") = TextBox4.Text
    12. End With
    13. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows.Add(objZeile)
    14. objDataSet.AcceptChanges()
    15. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    16. End Sub

    Bei meinem Prog funktioniert das ganze zwar mit SQL aber kannste ja sicherlich umschreiben

    VB.NET-Quellcode

    1. Dim conn As New SqlClient.SqlConnection
    2. Dim myCommand As New SqlClient.SqlCommand
    3. Dim myAdapter As New SqlClient.SqlDataAdapter
    4. Dim myData As New DataTable
    5. Dim sql_update_query As String = "UPDATE Table_1"
    6. conn.ConnectionString = "Data Source=.\SQLExpress;Integrated Security=true; AttachDbFilename=|DataDirectory|\USER.mdf;User Instance=true;"
    7. conn.Open()
    8. myCommand.Connection = conn
    9. myCommand.CommandText = sql_update_query
    10. myAdapter.SelectCommand = myCommand
    11. myAdapter.Fill(myData)


    Starte das Programm doch mal ohne VB-Studio und teste dies doch mal.
    Wenn du das Programm beendest und wieder aufrufst sollte eig. alles noch da sein.
    Ach verdammt, jetzt bin ich auf den "Erledigt" Button gekommen. Na super...

    ...also ich habe es compiliert...auch da geht es nicht...das macht mich irre!
    Naja mit dem umschreiben von SQL auf eine OleDb hab ich schon ein paar Problemchen! :)

    Also ich frage mich überhaupt, wo der Fehler liegen könnte...hab alles so gemacht, wie es Galileo Computing auch beschrieben hat.
    Hier nochmal mein kompletter Code:

    VB.NET-Quellcode

    1. 'Import der Klasse(n) um die Objekte freizugeben
    2. Option Explicit On
    3. Imports System.Data
    4. Imports System.Data.OleDb
    5. Public Class Form1
    6. 'objConnection = Provider verbindet zur Quelle, DataAdapter = Datenmenge aus Quelle über SQL,
    7. 'DataSet=Puffer/Zwischenspeicher für angezeigte und veränderte Daten, DataView = Bereitstellung der Daten auf Formular
    8. Dim objConnection As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=C:\Tools\KKontakt\KKontakt.mdb")
    9. Dim objDataAdapter As OleDb.OleDbDataAdapter
    10. Dim objDataSet As DataSet
    11. Dim objDataView As DataView
    12. 'Dim CMB As OleDb.OleDbCommandBuilder = New OleDbCommandBuilder()
    13. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. 'CMB.DataAdapter = objDataAdapter
    16. 'Wertzuweisung für definierte Objekte
    17. objDataView = Nothing
    18. 'neues DataSet für Prozedur
    19. objDataSet = New DataSet()
    20. 'Verbindung öffnen
    21. objConnection.Open()
    22. 'Adapter wird definiert, Referenz über SQL-Anweisung
    23. objDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM [Kontaktklassifizierung E-Mail] Order by Datum", objConnection)
    24. 'Adapter wird gefüllt
    25. objDataAdapter.Fill(objDataSet, "Kontaktklassifizierung E-Mail")
    26. 'DataView wird auf DB referenziert
    27. objDataView = New DataView(objDataSet.Tables("Kontaktklassifizierung E-Mail"))
    28. 'Steuerelemente an Datenfelder(DB) binden (DataBinding)
    29. With Me
    30. .TextBox1.DataBindings.Add("Text", objDataView, "Datum")
    31. .TextBox2.DataBindings.Add("Text", objDataView, "Bearbeiter")
    32. .TextBox3.DataBindings.Add("Text", objDataView, "Quelle")
    33. .TextBox4.DataBindings.Add("Text", objDataView, "Klasse")
    34. End With
    35. 'Ereignissanzeige für Sub AnzDatensatz
    36. AddHandler Me.BindingContext(objDataView).PositionChanged, AddressOf AnzDatensatz
    37. 'explizites anstoßen des Ereignisses
    38. Me.AnzDatensatz(objDataView, New System.EventArgs())
    39. End Sub
    40. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    41. Private Sub AnzDatensatz(ByVal sender As System.Object, ByVal e As System.EventArgs)
    42. 'Prozedur für die Label-Anzeige der Datensatz-Position und Gesamtanzahl
    43. 'Deklaration einer Variable der Datensatz-Position
    44. Dim dblPos As Double
    45. 'Bindung an das Objekt(DataView und der Eigenschaft Position
    46. dblPos = Me.BindingContext(objDataView).Position
    47. Me.Label1.Text = dblPos + 1 & " von " & objDataView.Count
    48. End Sub
    49. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    50. Private Sub frmDB3_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
    51. 'Prozedur, um beim Entladen/Schliessen des Formulars die Verbindung zur DB geschlossen wird
    52. objConnection.Close()
    53. 'DataSet wird geleert/entladen
    54. objDataSet = Nothing
    55. End Sub
    56. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    57. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    58. 'erster Datensatz in DB
    59. Me.BindingContext(Me.objDataView).Position = 0
    60. End Sub
    61. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    62. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    63. 'letzter Datensatz in DB
    64. Me.BindingContext(Me.objDataView).Position = Me.BindingContext(Me.objDataView).Count
    65. End Sub
    66. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    67. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    68. 'Datensatz - 1 (vorheriger)
    69. Me.BindingContext(Me.objDataView).Position -= 1
    70. End Sub
    71. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    72. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    73. 'Datensatz + 1 (nächster)
    74. Me.BindingContext(Me.objDataView).Position += 1
    75. End Sub
    76. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    77. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    78. 'vorhandene Textfelder löschen/leeren
    79. With Me
    80. .TextBox1.Clear()
    81. .TextBox2.Clear()
    82. .TextBox3.Clear()
    83. .TextBox4.Clear()
    84. End With
    85. 'oder per Schleife:
    86. 'Dim ctl As Control
    87. 'For Each ctl In Me.Controls
    88. ' If ctl.Name.StartsWith("Text") = True Then
    89. ' ctl.Text = ""
    90. ' End If
    91. 'Next
    92. End Sub
    93. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    94. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    95. 'Anhängen eines neuen Datensatz in die DB (über Steuerfelder)
    96. 'Deklarieren einer neuen Zeile (DataRow) als Objekt
    97. Dim objTabelle As DataTable
    98. Dim objZeile As DataRow
    99. objTabelle = objDataSet.Tables("Kontaktklassifizierung E-Mail")
    100. 'Objekt wird als Eigenschaft "neue Zeile" der DB gesetzt
    101. objZeile = objTabelle.NewRow()
    102. objDataAdapter = New OleDb.OleDbDataAdapter("UPDATE [Kontaktklassifizierung E-Mail] SET *", objConnection)
    103. With objZeile
    104. 'der Wert der Textbox wird in den Datensatz/Datenfeld (DataAdapter) geschrieben
    105. .Item("Datum") = TextBox1.Text
    106. .Item("Bearbeiter") = TextBox2.Text
    107. .Item("Quelle") = TextBox3.Text
    108. .Item("Klasse") = TextBox4.Text
    109. End With
    110. 'an das DataSet werden die im Adapter gespeicherten neuen Werte angehängt
    111. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows.Add(objZeile)
    112. 'Änderungen bestätigen
    113. objDataSet.AcceptChanges()
    114. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    115. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    116. End Sub
    117. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    118. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    119. 'Verändern eines Datensatzes
    120. 'Deklarieren eines Objektes Datensatz-Position
    121. Dim dblPos As Double
    122. 'Wert/Eigenschaft an Objekt hängen
    123. dblPos = Me.BindingContext(objDataView).Position
    124. 'Umgang mit der Tabelle(n-Eigenschaft) Reihe (der aktuellen Position dblPos) im DataSet
    125. With objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows(dblPos)
    126. .Item("Datum") = TextBox1.Text
    127. .Item("Bearbeiter") = TextBox2.Text
    128. .Item("Quelle") = TextBox3.Text
    129. .Item("Klasse") = TextBox4.Text
    130. End With
    131. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    132. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    133. End Sub
    134. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    135. Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
    136. 'Löschen eines Datensatzes über die Methode delete
    137. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows(2).Delete()
    138. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    139. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    140. End Sub
    141. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    142. Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    143. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    144. Me.Close()
    145. End Sub
    146. End Class

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

    Also wie gesagt, zum Löschen brauchst du einen DELETE-Command und keine Update. Desweiteren brauchst du um neue Datensätze einzutragen den INSERT-Command und zum ändern von vorhandenen Datensätzen den UPDATE-Command.
    Jetzt sollte eig. alles so funktionieren wie du es möchtest, wenn du das beachtest!
    Du lieber Himmel!
    Spoiler anzeigen

    Twace schrieb:

    Ach verdammt, jetzt bin ich auf den "Erledigt" Button gekommen. Na super...

    ...also ich habe es compiliert...auch da geht es nicht...das macht mich irre!
    Naja mit dem umschreiben von SQL auf eine OleDb hab ich schon ein paar Problemchen! :)

    Also ich frage mich überhaupt, wo der Fehler liegen könnte...hab alles so gemacht, wie es Galileo Computing auch beschrieben hat.
    Hier nochmal mein kompletter Code:

    VB.NET-Quellcode

    1. 'Import der Klasse(n) um die Objekte freizugeben
    2. Option Explicit On
    3. Imports System.Data
    4. Imports System.Data.OleDb
    5. Public Class Form1
    6. 'objConnection = Provider verbindet zur Quelle, DataAdapter = Datenmenge aus Quelle über SQL,
    7. 'DataSet=Puffer/Zwischenspeicher für angezeigte und veränderte Daten, DataView = Bereitstellung der Daten auf Formular
    8. Dim objConnection As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=C:\Tools\KKontakt\KKontakt.mdb")
    9. Dim objDataAdapter As OleDb.OleDbDataAdapter
    10. Dim objDataSet As DataSet
    11. Dim objDataView As DataView
    12. 'Dim CMB As OleDb.OleDbCommandBuilder = New OleDbCommandBuilder()
    13. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. 'CMB.DataAdapter = objDataAdapter
    16. 'Wertzuweisung für definierte Objekte
    17. objDataView = Nothing
    18. 'neues DataSet für Prozedur
    19. objDataSet = New DataSet()
    20. 'Verbindung öffnen
    21. objConnection.Open()
    22. 'Adapter wird definiert, Referenz über SQL-Anweisung
    23. objDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM [Kontaktklassifizierung E-Mail] Order by Datum", objConnection)
    24. 'Adapter wird gefüllt
    25. objDataAdapter.Fill(objDataSet, "Kontaktklassifizierung E-Mail")
    26. 'DataView wird auf DB referenziert
    27. objDataView = New DataView(objDataSet.Tables("Kontaktklassifizierung E-Mail"))
    28. 'Steuerelemente an Datenfelder(DB) binden (DataBinding)
    29. With Me
    30. .TextBox1.DataBindings.Add("Text", objDataView, "Datum")
    31. .TextBox2.DataBindings.Add("Text", objDataView, "Bearbeiter")
    32. .TextBox3.DataBindings.Add("Text", objDataView, "Quelle")
    33. .TextBox4.DataBindings.Add("Text", objDataView, "Klasse")
    34. End With
    35. 'Ereignissanzeige für Sub AnzDatensatz
    36. AddHandler Me.BindingContext(objDataView).PositionChanged, AddressOf AnzDatensatz
    37. 'explizites anstoßen des Ereignisses
    38. Me.AnzDatensatz(objDataView, New System.EventArgs())
    39. End Sub
    40. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    41. Private Sub AnzDatensatz(ByVal sender As System.Object, ByVal e As System.EventArgs)
    42. 'Prozedur für die Label-Anzeige der Datensatz-Position und Gesamtanzahl
    43. 'Deklaration einer Variable der Datensatz-Position
    44. Dim dblPos As Double
    45. 'Bindung an das Objekt(DataView und der Eigenschaft Position
    46. dblPos = Me.BindingContext(objDataView).Position
    47. Me.Label1.Text = dblPos + 1 & " von " & objDataView.Count
    48. End Sub
    49. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    50. Private Sub frmDB3_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
    51. 'Prozedur, um beim Entladen/Schliessen des Formulars die Verbindung zur DB geschlossen wird
    52. objConnection.Close()
    53. 'DataSet wird geleert/entladen
    54. objDataSet = Nothing
    55. End Sub
    56. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    57. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    58. 'erster Datensatz in DB
    59. Me.BindingContext(Me.objDataView).Position = 0
    60. End Sub
    61. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    62. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    63. 'letzter Datensatz in DB
    64. Me.BindingContext(Me.objDataView).Position = Me.BindingContext(Me.objDataView).Count
    65. End Sub
    66. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    67. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    68. 'Datensatz - 1 (vorheriger)
    69. Me.BindingContext(Me.objDataView).Position -= 1
    70. End Sub
    71. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    72. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    73. 'Datensatz + 1 (nächster)
    74. Me.BindingContext(Me.objDataView).Position += 1
    75. End Sub
    76. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    77. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    78. 'vorhandene Textfelder löschen/leeren
    79. With Me
    80. .TextBox1.Clear()
    81. .TextBox2.Clear()
    82. .TextBox3.Clear()
    83. .TextBox4.Clear()
    84. End With
    85. 'oder per Schleife:
    86. 'Dim ctl As Control
    87. 'For Each ctl In Me.Controls
    88. ' If ctl.Name.StartsWith("Text") = True Then
    89. ' ctl.Text = ""
    90. ' End If
    91. 'Next
    92. End Sub
    93. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    94. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    95. 'Anhängen eines neuen Datensatz in die DB (über Steuerfelder)
    96. 'Deklarieren einer neuen Zeile (DataRow) als Objekt
    97. Dim objTabelle As DataTable
    98. Dim objZeile As DataRow
    99. objTabelle = objDataSet.Tables("Kontaktklassifizierung E-Mail")
    100. 'Objekt wird als Eigenschaft "neue Zeile" der DB gesetzt
    101. objZeile = objTabelle.NewRow()
    102. objDataAdapter = New OleDb.OleDbDataAdapter("UPDATE [Kontaktklassifizierung E-Mail] SET *", objConnection)
    103. With objZeile
    104. 'der Wert der Textbox wird in den Datensatz/Datenfeld (DataAdapter) geschrieben
    105. .Item("Datum") = TextBox1.Text
    106. .Item("Bearbeiter") = TextBox2.Text
    107. .Item("Quelle") = TextBox3.Text
    108. .Item("Klasse") = TextBox4.Text
    109. End With
    110. 'an das DataSet werden die im Adapter gespeicherten neuen Werte angehängt
    111. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows.Add(objZeile)
    112. 'Änderungen bestätigen
    113. objDataSet.AcceptChanges()
    114. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    115. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    116. End Sub
    117. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    118. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    119. 'Verändern eines Datensatzes
    120. 'Deklarieren eines Objektes Datensatz-Position
    121. Dim dblPos As Double
    122. 'Wert/Eigenschaft an Objekt hängen
    123. dblPos = Me.BindingContext(objDataView).Position
    124. 'Umgang mit der Tabelle(n-Eigenschaft) Reihe (der aktuellen Position dblPos) im DataSet
    125. With objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows(dblPos)
    126. .Item("Datum") = TextBox1.Text
    127. .Item("Bearbeiter") = TextBox2.Text
    128. .Item("Quelle") = TextBox3.Text
    129. .Item("Klasse") = TextBox4.Text
    130. End With
    131. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    132. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    133. End Sub
    134. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    135. Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
    136. 'Löschen eines Datensatzes über die Methode delete
    137. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows(2).Delete()
    138. 'Anstoß der Aktualisierung über DataSet in DB/Befehl Update verlangt ein DataSet und den Namen der Tabelle (DB)
    139. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    140. End Sub
    141. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    142. Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    143. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    144. Me.Close()
    145. End Sub
    146. End Class


    Probierma die Sache mehr Designergestützt aufzuziehen, gugge "Datenbank in 10 Minuten" auf Movie-Tuts
    Vor Galileo warne ich zB auch, wennich mich zum Thema Buch Lesen verbreiter ;)
    @ ErfinderDesRades:

    Ja richtig, ich kann den Assistenten nehmen, aber ich möchte doch auch verstehen, was ich mache und den Code danach auch anpassen können!
    Und es klappt immer noch nicht. Hat wer noch eine Idee analog zu meinem code, den ich hier schon gepostet habe. Fakt ist, dass die Daten aus der DB übernommen werden, Fakt ist, dass ich die Daten im Adapter auch abändern kann, es scheitert hier nur an der Übertragung in die DB.

    Help me...pls.

    Twace schrieb:

    Ja richtig, ich kann den Assistenten nehmen, aber ich möchte den Code danach auch anpassen können!
    Kannst du doch. Rechtsklick auf den TableAdapter, und "Abfrage hinzufügen".

    Twace schrieb:

    aber ich möchte doch auch verstehen, was ich mache
    Natürlich solltest du verstehen, was du machst.
    Zunächstmal liegt das Verständnis eines designeten TableAdapter aber auf einer abstrakteren Ebene. Also du weißt, was der abfragt, und wie mans aufruft.
    Dassis eiglich, was du wissen mußt, um ordentlich damit arbeiten zu können.
    Wenn du nochmehr wissen willst, guck dir den Designer-Code an - evtl. kannst du da auch lernen, wie du selbst DataAdapter konfigurieren kannst (naja, eher nicht, DataAdapter selbst konfigurieren macht man besser mittm CommandBuilder).

    Zur Frage: Das ist schon geklärt, dass die DB-Datei nicht im Projekt eingebunden ist, mit der Eigenschaft "ins Ausführungsverzeichnis kopieren" = immer?

    Weil normalerweise testen die Leuts den Daten-Abruf nicht mittels eines DatenAbruf-Buttons, sondern indem sie die App zumachen, und mit F5 neu starten.
    Nur - F5 ist ein neuer Testlauf, und die IDE ist defaultmäßig bestrebt, die Testbedingungen identisch wieder herzustellen, also eine evtl. verwüstete DatenDatei neu ins Ausführungsverzeichnis zu kopieren.
    Hmm...ok...
    ...es muss doch aber trotzdem funktionieren?! Lesen kann er ja schonmal die Daten aus der DB. Wunderbar sogar!

    Die DB liegt ja völlig autark in einem anderen Verzeichnis...wo muss ich das "ins Ausführungsverzeichnis kopieren" denn einstellen?

    Habe ich dich richtig verstanden, dass VB die DB mit dem Status zum Start des Codes omplett überschreibt und ich daher keinen Änderungen sehe??

    Twace schrieb:

    Habe ich dich richtig verstanden, dass VB die DB mit dem Status zum Start des Codes omplett überschreibt und ich daher keinen Änderungen sehe??

    VB macht das nicht, sowas kann die VS-IDE machen, wenn sie entsprechend eingerichtet ist. Nämlich, wenn die DB-Datei als Element im ProjektExplorer hinzugefügt ist.

    Aber ich glaub das ist bei dir nicht der Fall - jdfs. scheint mir ein Fragment deiner Code-Wüste darauf hinzudeuten.

    Auf deinen Code gehe ich so nicht ein, das ist mir echt zu viel, und zu unstrukturiert. Wo zum Kuckuck, versuchst du da überhaupt abzuspeichern? button1_Click? button2_Click? button3_Click? button4_Click?

    Schon sone Benamung ist NoGo.
    Ok...auch da gebe ich dir Recht, die Benennung der Ereignisse und Elemente ist absolut suboptimal. Darum versuche ich mal kurz, etwas Übersicht hineinzubringen.

    Zuerst heisst es:

    VB.NET-Quellcode

    1. Option Explicit On
    2. Imports System.Data
    3. Imports System.Data.OleDb


    ...dann die Klassendeklaration:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim objConnection As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=C:\Tools\KKontakt\KKontakt.mdb")
    3. Dim objDataAdapter As OleDb.OleDbDataAdapter
    4. Dim objDataSet As DataSet
    5. Dim objDataView As DataView


    ...dann Ereignis Form laden:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. objDataView = Nothing
    3. objDataSet = New DataSet()
    4. objConnection.Open()
    5. objDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM [Kontaktklassifizierung E-Mail] Order by Datum", objConnection)
    6. objDataAdapter.Fill(objDataSet, "Kontaktklassifizierung E-Mail")
    7. objDataView = New DataView(objDataSet.Tables("Kontaktklassifizierung E-Mail"))
    8. With Me
    9. .TextBox1.DataBindings.Add("Text", objDataView, "Datum")
    10. .TextBox2.DataBindings.Add("Text", objDataView, "Bearbeiter")
    11. .TextBox3.DataBindings.Add("Text", objDataView, "Quelle")
    12. .TextBox4.DataBindings.Add("Text", objDataView, "Klasse")
    13. End With
    14. End Sub


    ...Ereignis beim Schliessen der Form

    VB.NET-Quellcode

    1. Private Sub frmDB3_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
    2. objConnection.Close()
    3. objDataSet = Nothing
    4. End Sub


    ...bei Klick Anhängen eines neuen Datensatzes:

    VB.NET-Quellcode

    1. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    2. Dim objTabelle As DataTable
    3. Dim objZeile As DataRow
    4. objTabelle = objDataSet.Tables("Kontaktklassifizierung E-Mail")
    5. objZeile = objTabelle.NewRow()
    6. objDataAdapter = New OleDb.OleDbDataAdapter("UPDATE Kontaktklassifizierung E-Mail SET *", objConnection)
    7. With objZeile
    8. .Item("Datum") = TextBox1.Text
    9. .Item("Bearbeiter") = TextBox2.Text
    10. .Item("Quelle") = TextBox3.Text
    11. .Item("Klasse") = TextBox4.Text
    12. End With
    13. objDataSet.Tables("Kontaktklassifizierung E-Mail").Rows.Add(objZeile)
    14. objDataSet.AcceptChanges()
    15. objDataAdapter.Update(objDataSet, "Kontaktklassifizierung E-Mail")
    16. End Sub


    Die Tabelle heisst "Kontaktklassifizierung E-Mail", bestehend aus den Datenfeldern "ID", "Datum", "Bearbeiter", "Quelle" und "Klasse".
    Über eine simple Form sollen nun die Datensaätze angezeigt werden oder durch füllen der Textfelder plus Button_Klick ein Datensatz angehängt werden.
    Vielleicht gibst du mir, trotz der nicht "feinen" Benennung, die Chance, mal ein Auge auf den Quelltext zu werfen.

    Wie gesagt...auslesen der Daten aus der Tabelle in die Steuerelemente funktioniert wunderbar...auch das anhängen während der Prozedur in im Adapter funktioniert...nur nicht das zurückschreiben in die Tabelle!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Twace“ () aus folgendem Grund: vervollständigen von Informationen!

    Das ist der Lump:

    VB.NET-Quellcode

    1. objDataSet.AcceptChanges()

    Von AcceptChanges die Finger lassen!

    Das setzt alle DataRows auf Unchanged, und unchanged Rows werden natürlich nicht geupdated.

    AcceptChanges ist eiglich eine interne Hilfs-Methode, die das Change-Tracking im Dataset unterstützt, und die nur die DataAdapter intern aufrufen sollte.

    (Ich weiß, es hat keinen Sinn, es nochmal zu betonen, aber: Mit Designer wär das nicht passiert ;))
    ja, da steht doch klippnklar:
    Bei der Konfiguration des DataAdapters hast du vergessen, ein Insert-Command zu konfigurieren.
    Ich kann dir auch schon die nächste Fehlermeldung sagen:
    Bei der Konfiguration des DataAdapters hast du vergessen, ein Update-Command zu konfigurieren.
    Noch eine?
    Bei der Konfiguration des DataAdapters hast du vergessen, ein Delete-Command zu konfigurieren.

    Warum eiglich erst, nachdem das Ding funzt?

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

    Also InsertCommand a la:

    VB.NET-Quellcode

    1. cmd = New OleDbCommand("INSERT INTO [Kontaktklassifizierung E-Mail] VALUES (ID, '" & objZeile.Item("Datum") & "','" & objZeile.Item("Bearbeiter") & "','" & objZeile.Item("Quelle") & "','" & objZeile.Item("Klasse") & "')", objConnection)
    2. objDataAdapter.InsertCommand = cmd


    Wäre dies so richtig?

    Delete und Update folgen in den Ereignissen "Datensatz löschen" und "Datensatz ändern". Ich will ja erstmal nur das "Datensatz anhängen" fertig bekommen.

    Erst in dem nächsten Projekt, weil ich einmal damit angefangen habe, es ja nun eine Lösung geben muss und ich gern die Dinge beende, die ich angefangen habe! Dann möchte ich es sehr gern mit dem Designer versuchen.

    ErfinderDesRades schrieb:

    Ich kann dir auch schon die nächste Fehlermeldung sagen:
    Bei der Konfiguration des DataAdapters hast du vergessen, ein Update-Command zu konfigurieren.
    Noch eine?
    Bei der Konfiguration des DataAdapters hast du vergessen, ein Delete-Command zu konfigurieren.
    Wenn du doch weisst, welche Fehlermeldung als nächstes resultieren kann, warum schreibst du dann nicht einfach, wie ich das Problem lösen kann. Ich bin hier in diesem Forum, um lösungsorientierte Ansätze zu finden und nicht, um mir problemorientierte Kommentare durchlesen zu müssen. Und schon gar nicht, um mir irgendwelche Sprichwörter per Link/Referenz auf Google anzeigen zu lassen. Sorry, geht mal gar nicht!

    Warum ich weiter in dem Quelltext arbeiten möchte, habe ich schon erwähnt, dass es nicht die eleganteste Lösung, habe ich auch schon erwähnt. Doch das diese Methode auch in mehreren Tutorials im Netz beschrieben wird, kann ja nun auch nichts schlechtes heissen. Ich möchte dabei NUR LERNEN und mir keine Sprüche anhören müssen. Über einen Workflow eine Datenbank-Anbindung zu basteln kann ich auch noch danach machen, ich will es verstehen...verstehen, warum der Code nicht so funzt, wie es beschrieben wurde!

    Schade..einfach nur schade!