none
Hinzufügen eines Datensatzes zu einem DataSet wird nicht dauerhaft gespeichert RRS feed

  • Frage

  • Hallo,

    ich habe ein einem Formular ein DataGridView-Element, in dem ich Daten aus einer Access-Datenbank anzeige. Per Button soll der Datenbank ein Datensatz eingefügt werden. Dies funktioniert soweit auch. Nach dem Hinzufügen wird der neue Datensatz im Grid angezeigt. Wenn ich aber nun das Fomular schließe und neu aufrufe, ist der soeben angelegte Datensatz nicht mehr vorhanden.

    Könnte mir jemand helfen und sagen, ob ich noch einen speziellen "Speichern"-Befehl verwenden muss?

    P.D.: Das DB-Feld "ID" ist ein Auto-Inc.-Feld. Was muss ich da beachten?? Liegt da vielleicht der Fehler?

        Private Sub ButtonEinsatzInDBübernehmen_Click(sender As Object, e As EventArgs) Handles ButtonEinsatzInDBübernehmen.Click
    
            If DataGridView1.RowCount > 1 Then MsgBox("Achtung: Einsatz bereits vorhanden!") : Exit Sub
    
    
            ' Konvertierung Einsatzdurchmesser
            Dim ED As String = Nothing
            If Len(TextBoxWalzenmantelAusdrehdurchmesser.Text) = 2 Then
                ED = "0" & TextBoxWalzenmantelAusdrehdurchmesser.Text
            Else
                ED = TextBoxWalzenmantelAusdrehdurchmesser.Text
            End If
    
            ' Konvertierung Lagerbezeichnung
            Dim EBez As String
            If ComboBoxLagerungFestlagerLager.Text Like "12??" _
                Or ComboBoxLagerungFestlagerLager.Text Like "60??" _
                Or ComboBoxLagerungFestlagerLager.Text Like "62??" Then
                EBez = Mid(ComboBoxLagerungFestlagerLager.Text, 2, 3)
            Else
                EBez = ComboBoxLagerungFestlagerLager.Text
            End If
    
            Dim NeuerEinsatz As WalzenmanagerDataSet.StandardEinsätzeRow
            NeuerEinsatz = WalzenmanagerDataSet.StandardEinsätze.NewStandardEinsätzeRow()
    
            With NeuerEinsatz
                '.ID = nothing
                .Einsatzbezeichnung = "E" & ED & "." & EBez & "." & ComboBoxEinsätzeMaterial.Text & "." & ComboBoxEinsätzeAusführung.Text
                .Material = ComboBoxEinsätzeMaterial.Text
                .Lagerbezeichnung = ComboBoxLagerungFestlagerLager.Text
                .Lageraußendurchmesser = TextBoxLagerDa.Text
                .Lagerbreite = TextBoxLagerB.Text
                .Lagerinnendurchmesser = TextBoxLagerDi.Text
                .Einsatzaußendurchmesser = TextBoxWalzenmantelAusdrehdurchmesser.Text
                .Einsatzbreite = TextBoxEinsatzBreite.Text
                .Lagersitzdurchmesser = TextBoxLagerDa.Text
                .Lagersitztiefe = TextBoxLagersitztiefe.Text
                .Anschlagdurchmesser = TextBoxAnschlagdurchmesser.Text
                .Segeringdurchmesser = TextBoxSiRingD3.Text
                .Segeringbreite = TextBoxSiRingS.Text
                .Segeringnutdurchmesser = TextBoxSiRingD2.Text
                .Segeriungnutbreite = TextBoxSiRingM.Text
                .Einstichvorderkante = TextBoxEinstichVorderkante.Text
                .Anschlagtiefe = TextBoxAnschlagtiefe.Text
                ._Achsdurchlass_Durchmesser = TextBoxAchsDurchlassDurchmesser.Text
                .Außenabsatzdurchmesser = TextBoxAußenabsatzDurchmesser.Text
                .Außenabsatztiefe = TextBoxAußenabsatzTiefe.Text
                .ErstelltVonAm = Date.Now.ToShortDateString & "/" & My.User.Name
                .AchsEinfädelFase = TextBoxAchsEinfädelFase.Text
                ._Kragenbreite_CFK_ = TextBoxKragenBreite.Text
                .Kragenausführung = ComboBoxEinsätzeAusführung.Text
                .Kragendurchmesser = TextBoxKragenDurchmesser.Text
            End With
    
            WalzenmanagerDataSet.StandardEinsätze.Rows.Add(NeuerEinsatz)
            WalzenmanagerDataSet.StandardEinsätze.AcceptChanges()
            WalzenmanagerDataSet.StandardEinsätze.DataSet.AcceptChanges()
            If WalzenmanagerDataSet.StandardEinsätze.DataSet.HasErrors Then MsgBox("Fehler bei WalzenmanagerDataSet.dataset")
            If WalzenmanagerDataSet.HasErrors Then MsgBox("Fehler bei WalzenmanagerDataSet")
            Me.StandardEinsätzeTableAdapter.Update(WalzenmanagerDataSet.StandardEinsätze)
            Me.Validate()
    
            ButtonEinsatzInDBübernehmen.Visible = False
            GroupBoxNeu.Visible = False
            ButtonNeuenEinsatzErstellen.Show()
    
    
        End Sub
    

    Donnerstag, 28. November 2013 12:06

Antworten

  • Hallo,

    lasse die beiden AcceptChanges vor dem Update weg, denn damit ist der Datensatz nicht mehr "neu" und der TableAdapter sieht keinen Anlass ihn in die Datenbank zu übertragen.

    Desweiteren:

    Der Aufruf von Validate() sollte vor dem Übertragen der Steuerelemente in den Datensatz erfolgen, siehe Validierung von Benutzereingaben in Windows Forms

    Im übrigen könntest Du Dir durch den Einsatz der Datenbindung viel (potentiell fehleranfälligen) Code ersparen. Felder wie Durchmesser sind meiner Erfahrung eigentlich meist numerisch.

    Gruß Elmar

    • Als Antwort markiert Mib76 Donnerstag, 28. November 2013 12:34
    Donnerstag, 28. November 2013 12:19
    Beantworter

Alle Antworten

  • Hallo,

    lasse die beiden AcceptChanges vor dem Update weg, denn damit ist der Datensatz nicht mehr "neu" und der TableAdapter sieht keinen Anlass ihn in die Datenbank zu übertragen.

    Desweiteren:

    Der Aufruf von Validate() sollte vor dem Übertragen der Steuerelemente in den Datensatz erfolgen, siehe Validierung von Benutzereingaben in Windows Forms

    Im übrigen könntest Du Dir durch den Einsatz der Datenbindung viel (potentiell fehleranfälligen) Code ersparen. Felder wie Durchmesser sind meiner Erfahrung eigentlich meist numerisch.

    Gruß Elmar

    • Als Antwort markiert Mib76 Donnerstag, 28. November 2013 12:34
    Donnerstag, 28. November 2013 12:19
    Beantworter
  • Hallo,
    wie genau hast du denn die Datenbank geladen? Ich habe mal schnell ein Beispiel anhand diesen Codes (C#) geschrieben:
        'Daten für die DB-Anbindung
        Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\test\test.mdb" 'ConnectionString
        Dim query As String = "SELECT * FROM mytable" 'Abfragequery
        Dim dAdapter As OleDbDataAdapter 'Adapter
        Dim dTable As New DataTable 'DataTable
    
        'Table laden
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            dAdapter = New OleDbDataAdapter(query, connString)
            dAdapter.Fill(dTable)
            DataGridView1.DataSource = dTable
        End Sub
    
        'DB aktualisieren
        Private Sub OnSaveDB(sender As Object, e As EventArgs) Handles Button2.Click
            dAdapter.Update(dTable)
        End Sub
    Die Fetter Zeile, ist das was dich interessieren dürfte. Die aktualisiert die eigentliche DB.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 28. November 2013 12:20
    Moderator
  • Hallo Elmar,

    Dankeschön, das war der richtige Tipp. Nach Entfernen der AccepChanges-Anweisungen funktioniert es.

    @Tom:

    Da ich (immer noch) kein VB.NET-Profi bin, habe ich die Datenbankanbindung nicht manuell per Code, sondern per Designer vorgenommen. (Neue Datenquelle hinzufügen). Die dadurch ebenfalls eingebundenen Elemente TableAdapter und BindingSource verwende ich dann zum Filtern der Einträge. Ich weiß, dass es eleganter geht, aber soweit bin ich halt noch nicht :o)

    Donnerstag, 28. November 2013 12:37