Announcement

Collapse
No announcement yet.

Neuen Datensatz speichern via DataTable

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Neuen Datensatz speichern via DataTable

    Hallo!<br>
    <br>
    Meine Tablle bilde ich auf einer ComboBox ab (DisplayMember / ValueMember).
    Der Code dazu lautet:<pre><hr><font face="Courier New"> Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    DM = New TDM(sDataBasePath)

    </font><font face="Courier New"> CbxPrgCode.ValueMember = FLD_ID
    CbxPrgCode.DisplayMember = FLD_TXT
    CbxPrgCode.DataSource = DM.LoadTable(TBL_PROGS).Tables(0).DefaultView
    End Sub</font><hr>Die Funktion LoadTable lautet:<br><br><font face="Courier New"> Public Function LoadTable(ByVal ATable As String) As DataSet
    Dim lAdapter As OleDb.OleDbDataAdapter
    Dim lCommand As OleDb.OleDbCommand

    </font><font face="Courier New"> Try
    MyConnection.Open()
    lCommand = New OleDb.OleDbCommand("SELECT * FROM " & ATable, MyConnection)
    lAdapter = New OleDb.OleDbDataAdapter(lCommand)
    dsProgs = New Data.DataSet(TBL_PROGS)

    </font><font face="Courier New"> lAdapter.Fill(dsProgs, ATable)
    tblProgs = dsProgs.Tables(0)
    Return dsProgs
    Catch ex As Exception
    Debug.WriteLine("LoadTable('" & ATable & "'): " & ex.Message)
    End Try
    End Function</font><br><br>
    'MyConnection', 'tblProgs' und 'dsProgs' ist globale Variablen der Klasse 'DM'.<hr>
    Der Versuch einen neuen Datensatz hinzuzufügen lautet:<br><br><font face="Courier New"> Private Sub BtnDBAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDBAdd.Click
    Dim LFrmAdd As New FrmAdd
    Dim lRow As Data.DataRow

    </font><font face="Courier New"> Try
    If LFrmAdd.ShowDialog = DialogResult.OK Then
    lRow = DM.tblProgs.NewRow
    'Werte füllen
    lRow(FLD_ID) = additional.DB.NextId(DM.tblProgs)
    ---8X---
    DM.tblProgs.Rows.Add(lRow)
    DM.tblProgs.AcceptChanges()
    End If
    Finally
    LFrmAdd.Dispose()
    End Try
    CbxPrgCode.Update()
    End Sub</font><hr></pre>Ist natürlich klar, das es nicht so funktioniert wie ich will. Der neue Datensatz ist zwar in der Tabelle und wird auch in der ComboBox angezeigt, aber er ist nicht in der Datenbank, d.h. er wird nicht gespeichert. Daraus folgere ich, das ich irgendwas vergessen habe, aber über F1 finde ich keinen Anhaltspunkt und im Forum gehen alle andere Wege...<br><br>Vielen Dank!<br>&nbsp;&nbsp;&nbsp;Nico Stöckigt<br>

  • #2
    ...und wieder einmal führte eigenes Engagement zum Ziel!<br><br><hr><pre><font face="Courier New"> Private Sub BtnDBAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDBAdd.Click
    Dim LFrmAdd As New FrmAdd
    Dim lRow As Data.DataRow

    </font><font face="Courier New"> Try
    If LFrmAdd.ShowDialog = DialogResult.OK Then
    lRow = DM.tblProgs.NewRow
    'Werte füllen
    lRow(FLD_ID) = additional.DB.NextId(DM.tblProgs)
    ---8X---
    <b>Select Case DM.SaveTable(TBL_PROGS, lRow, TDM.eDBChangeMode.dbcmNew, True)
    Case TDM.eDBResult.dbrSuccess
    CbxPrgCode.DataSource = DM.LoadTable(TBL_PROGS).Tables(0).DefaultView
    CbxPrgCode.Refresh()
    Case TDM.eDBResult.dbrExists
    MessageBox.Show("Eintrag besteht bereits und wird verworfen!", "Eintrag hinzufügen", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Case Else
    MessageBox.Show("Unerwarteter Fehler!" & vbNewLine & "Eintrag konnte nicht geschrieben werden!", "Eintrag hinzufügen", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Select</b>
    End If
    Finally
    LFrmAdd.Dispose()
    End Try
    End Sub
    <hr></font><font face="Courier New"> Public Function SaveTable(ByVal ATable As String, ByVal ARow As DataRow, ByVal AMode As eDBChangeMode, ByVal AMustBeUnique As Boolean) As eDBResult
    Dim lCommand As OleDb.OleDbCommand
    Dim sCommand As System.Text.StringBuilder

    </font><font face="Courier New"> Select Case AMode
    Case eDBChangeMode.dbcmNew
    Try
    If (AMustBeUnique AndAlso TableEntryExists(ATable, ARow)) Then
    SaveTable = eDBResult.dbrExists
    Else
    sCommand = New System.Text.StringBuilder
    sCommand.Append("INSERT INTO " & TBL_PROGS)
    sCommand.Append(" VALUES (")
    sCommand.Append(CInt(ARow(FLD_ID)) & ", ")
    ---8X---
    lCommand = New OleDb.OleDbCommand(sCommand.ToString, MyConnection)
    lCommand.ExecuteNonQuery()
    SaveTable = eDBResult.dbrSuccess
    End If
    Catch ex As Exception
    Debug.WriteLine("SaveTable ('" & ATable & "'): " & ex.Message)
    SaveTable = eDBResult.dbrError
    End Try
    Case eDBChangeMode.dbcmEdit
    Try
    sCommand = New System.Text.StringBuilder
    sCommand.Append("UPDATE " & TBL_PROGS)
    sCommand.Append(" SET (" & FLD_TXT & "='" & CStr(ARow(FLD_TXT)) & "', ")
    ---8X---
    lCommand = New OleDb.OleDbCommand(sCommand.ToString, MyConnection)
    lCommand.ExecuteNonQuery()
    SaveTable = eDBResult.dbrSuccess
    Catch ex As Exception
    Debug.WriteLine("SaveTable ('" & ATable & "'): " & ex.Message)
    SaveTable = eDBResult.dbrError
    End Try
    End Select
    End Function<hr></font><font face="Courier New"> Public Shared Function TableEntryExists(ByVal ATable As String, ByVal ARow As DataRow) As Boolean
    Dim lCommand As OleDb.OleDbCommand
    Dim sCommand As New System.Text.StringBuilder

    </font><font face="Courier New"> sCommand.Append("SELECT *")
    sCommand.Append(" FROM " & ATable)
    sCommand.Append(" WHERE (&lt;Bedingung&gt
    lCommand = New OleDb.OleDbCommand(sCommand.ToString, MyConnection)
    Return Not (lCommand.ExecuteScalar Is Nothing)
    End Function</pre>Um sicher zu gehen - und da ich ja irgendwas vergessen zu haben schien - erledige ich das Speichern der Daten jetzt einfach via SQL

    Comment

    Working...
    X