VB.net + Access - Datensatz verändern

KCH

Grünschnabel
Hallo.

Um ein bisschen in die .net Sprachen einzusteigen, hab ich mir mal das Galileo Computing Tutorial angesehen und arbeite mich grade durch. Bin schon bei Kapitel 9.4 bei der Stelle ungebundene Formulare

Hab alles so gemacht, wie es im Tutorial beschrieben steht, wenn ich allerdings den Datensatz ändern möchte, oder einen neuen Hinzufügen will bekomme ich immer eine Fehlermeldung: "Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' ist in system.data.dll aufgetreten.

Zusätzliche Informationen: Aktualisieren erfordert einen gültigen UpdateCommand, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird."

Hier der Quelltext:
Code:
Imports System.Data
Public Class frmDBAnsicht
    Inherits System.Windows.Forms.Form
    Dim objConnection As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=D:\Eigene Dateien\Access Datenbanken\Galileo.mdb")
    Dim objDataAdapter As OleDb.OleDbDataAdapter
    Dim objDataSet As DataSet
    Dim objDataView As DataView
.
.
. 

Private Sub frmDBAnsicht_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        objDataView = Nothing
        objDataSet = New DataSet
        objConnection.Open()

        objDataAdapter = New OleDb.OleDbDataAdapter _
        ("SELECT * FROM t_Kunden", objConnection)
        objDataAdapter.Fill(objDataSet, "t_Kunden")
        objDataView = New DataView(objDataSet.Tables("t_Kunden"))

        With Me
            .txtVorname.DataBindings.Add("Text", _
               objDataView, "Vorname")
            .txtZuname.DataBindings.Add("Text", objDataView, _
               "Zuname")
            .txtStraße.DataBindings.Add("Text", objDataView, _
               "Straße")
            .txtPLZ.DataBindings.Add("Text", objDataView, "Plz")
            .txtOrt.DataBindings.Add("Text", objDataView, "Ort")
            .chkInfopost.DataBindings.Add("Checked", objDataView, _
               "Infopost")
        End With
        AddHandler Me.BindingContext(objDataView).PositionChanged, AddressOf Datensatz_Ändern
        Me.Datensatz_Ändern(objDataView, New System.EventArgs)
    End Sub

.
.
.

Private Sub butAnhängen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butAnhängen.Click
        Dim objZeile As DataRow
        objZeile = objDataSet.Tables("t_Kunden").NewRow()
        With objZeile
            .Item("Vorname") = txtVorname.Text
            .Item("Zuname") = txtZuname.Text
            .Item("Straße") = txtStraße.Text
            .Item("Plz") = txtPLZ.Text
            .Item("Ort") = txtOrt.Text
            .Item("Infopost") = chkInfopost.Checked
            If optFrau.Checked = True Then
                .Item("Geschlecht") = 1
            Else
                .Item("Geschlecht") = 2
            End If
        End With
        objDataSet.Tables("t_Kunden").Rows.Add(objZeile)
        objDataAdapter.Update(objDataSet, "t_Kunden")
    End Sub

Wenn ich die Zeile
Code:
objDataSet.Tables("t_Kunden).AcceptChanges
oder
Code:
objDataSet.AcceptChanges()
hinzufüge, erhalte ich zwar keine Fehlermeldung mehr; beim erneuten Öffnen ist Der Eintrag jedoch nicht hinzugefügt worden!
 
Hi,

Du musst für den DataAdapter auch einen Insert bzw. Update-Command angeben, welcher genutzt werden soll, wenn du Datensätze ändern bzw. erstellen willst.
Beides sind Properties von DataAdapter.
 
also wenn ich das richtig verstanden haben, dann verändere ich doch erstmal nur eine Zeile
Code:
objZeile = objDataSet.Tables("t_Kunden").NewRow()
und füge diese dann in die tabelle aus dem data set ein
Code:
objDataSet.Tables("t_Kunden").Rows.Add(objZeile)
dann wird per data adapter das dataset mit der neuen tabelle (die nun eine zeile mehr hat) aktualisiert.
Code:
objDataAdapter.Update(objDataSet, "t_Kunden")

Dann brauch ich doch keinen Insert Befehl mehr, das geschieht doch alles über das Update oder nicht? erklär mir des mal bitte genauer
 
Zuletzt bearbeitet:
Okay jetzt wirds strange....

Durch Hinzufügen der Zeile
Code:
Dim cb As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(objDataAdapter)
klappt das ganze - Also Anhängen ist überhaupt kein Problem - Löschen auch nicht!

allerdings geht das ändern nicht - bis auf - ja bis auf die Option Mann oder Frau! Die kann verändert werden - alle anderen Daten nicht. Ich find das ein bisschen seltsam. Hier nochmal der Quelltext fürs ändern

Code:
 Private Sub butÄndern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butÄndern.Click
        Dim dblPos As Double
        Dim cb As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(objDataAdapter)
        dblPos = Me.BindingContext(objDataView).Position
        With objDataSet.Tables("t_Kunden").Rows(dblPos)
            .Item("Vorname") = txtVorname.Text
            .Item("Zuname") = txtZuname.Text
            .Item("Straße") = txtStraße.Text
            .Item("Plz") = txtPLZ.Text
            .Item("Ort") = txtOrt.Text
            .Item("Infopost") = chkInfopost.Checked
            If optFrau.Checked = True Then
                .Item("Geschlecht") = 1
            Else
                .Item("Geschlecht") = 2
            End If
        End With
        objDataAdapter.Update(objDataSet, "t_Kunden")
    End Sub

natürlich könnte ich mir einfach die vorhergegangene Position merken die Spalte löschen und dann die neue an der stelle einfügen, aber das war irgendwie nicht vater des gedankens

Das ist schon ziemlich seltsam, denn die Option Anhängen schaut ja im Prinzip genauso aus, wie oben ja recht gut zu sehen ist!

was mir außerdem aufgefallen ist, ist das der datensatz an sich schon geändert wird - ich habe nämlich nochmal ein data grid ins fenster gebaut und lasse es bei jeder änderung aktualisieren. Ändere ich jetzt zum Beispiel den Wert "Hölle" einer Person in den Wert "Himmel" wird das im DataGrid angezeigt, nur irgendwie nicht in den tatsächlichen Datensatz geschrieben.
 
Zuletzt bearbeitet:
habe genau das selbe problem: anfügen geht problemlos, doch löschen geht nicht und beim ändern ändert er den datensatz zwar im dataset aber nicht in der datenbank...

hoffe jemand weiß einen rat, wäre wichtig!
 
Hallo zusammen,

habe mit Intresse nach gelesen. Stehe vor dem gleichen Problem.
Daten Anhängen und löschen = Ok
Aber Datensatz ändern nicht. Es werden keine Daten in der Datenbank geschrieben.!!
Würde auch kerne noch eine Suchfuntion einfügen, finde aber keine Lösung.
Der Quellcode aus dem Buche haut bie mir nicht hin.
Hat einer eine Lösung gefunden. Wenn ja würde ich mich über diese sehr freuen.

Danke
Karl H.

PS. Arbeite mit VB.Net 2002 und Framework 1
 
Zurück