Benutzer mit den meisten Antworten
Hinzufügen eines Datensatzes zu einem DataSet wird nicht dauerhaft gespeichert

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
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
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
-
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. -
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)