Insert bei LocalDB schlägt fehl

  • VB.NET

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

    Insert bei LocalDB schlägt fehl

    Hi!
    Ich stehe vor dem Problem, das ich mit Insert keine Daten in meine LocalDB speichern kann. Das Insert-Command wird zwar ohne Fehler ausgeführt, die Ansicht im Datagridview wird auch richtig aktualisiert, aber die Daten finden sich ausschliesslich im Datagridview aber nicht in der Datenbank.
    Ursprünglich wollte ich das Insert über den Commandbuilder lösen, aber das hat auch nicht funktioniert, deswegen habe ich jetzt das Insert-Command versucht.

    Hier der Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Data.SqlClient
    3. Public Class FrmStart
    4. Private myConn As SqlConnection
    5. Private myCmd As SqlCommand
    6. Private Shared DataAdapterKassa As New SqlDataAdapter
    7. Private Shared DataTableKassa As New DataTable
    8. Private KassaBindingSource As New BindingSource
    9. Private KassaCommandBuilder As SqlCommandBuilder
    10. Sub New()
    11. InitializeComponent()
    12. GetKassaData()
    13. End Sub
    14. Private Sub GetKassaData()
    15. Dim strSQL As String = "SELECT ID, Buchungsdatum, Bezeichnung, Einnahme, Ausgabe, Differenz FROM tblBuchungsData ORDER BY Buchungsdatum DESC"
    16. DataTableKassa.Clear()
    17. Try
    18. myConn = GetConnection()
    19. DataAdapterKassa = New SqlDataAdapter(strSQL, myConn)
    20. KassaCommandBuilder = New SqlCommandBuilder(DataAdapterKassa)
    21. DataAdapterKassa.Fill(DataTableKassa)
    22. KassaBindingSource.DataSource = DataTableKassa
    23. DgvKassa.DataSource = KassaBindingSource
    24. DgvKassa.Refresh()
    25. Catch ex As Exception
    26. MessageBox.Show(ex.Message)
    27. End Try
    28. End Sub
    29. Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles BtnSave.Click
    30. SaveData()
    31. GetKassaData()
    32. End Sub
    33. Private Sub SaveData()
    34. Dim strSQL As String = ""
    35. Dim xEin As Double = 0
    36. Dim xAus As Double = 0
    37. Dim xDifferenz As Double = 0
    38. Dim summeAus As Double = 0
    39. Dim summeEin As Double = 0
    40. If ChkEin.Checked = True And ChkAus.Checked = False Then
    41. xAus = 0
    42. xEin = CDbl(String.Format("{0:C2}", Decimal.Parse(tBetrag.Text)))
    43. End If
    44. If ChkAus.Checked = True And ChkEin.Checked = False Then
    45. xEin = 0
    46. xAus = CDbl(String.Format("{0:C2}", Decimal.Parse(tBetrag.Text)))
    47. End If
    48. For i As Integer = 0 To DgvKassa.Rows.Count - 1
    49. If DgvKassa.Rows(i).Cells(3).Value IsNot DBNull.Value Then
    50. summeEin += CInt(DgvKassa.Rows(i).Cells(3).Value)
    51. End If
    52. Next
    53. For i As Integer = 0 To DgvKassa.Rows.Count - 1
    54. If DgvKassa.Rows(i).Cells(4).Value IsNot DBNull.Value Then
    55. summeAus += CInt(DgvKassa.Rows(i).Cells(4).Value)
    56. End If
    57. Next
    58. xDifferenz = (xEin + summeEin) - (summeAus + xAus)
    59. strSQL = "INSERT INTO tblBuchungsData (Buchungsdatum, Bezeichnung, Einnahme, Ausgabe, Differenz) VALUES (@BuDat,@Bezeichnung,@Ein,@Aus,@Diff)"
    60. Try
    61. Using myConn As SqlConnection = GetConnection()
    62. myConn.Open()
    63. Using myCmd As New SqlCommand(strSQL, myConn)
    64. myCmd.Parameters.AddWithValue("@BuDat", dtBuDat.Value)
    65. myCmd.Parameters.AddWithValue("@Bezeichnung", tBezeichnung.Text)
    66. myCmd.Parameters.AddWithValue("@Ein", xEin)
    67. myCmd.Parameters.AddWithValue("@Aus", xAus)
    68. myCmd.Parameters.AddWithValue("@Diff", xDifferenz)
    69. myCmd.ExecuteNonQuery()
    70. End Using
    71. End Using
    72. Catch ex As Exception
    73. MessageBox.Show(ex.Message)
    74. End Try
    75. End Sub
    76. End Class
    Also wenn du in deim DGV den gewünschten Datensatz siehst, nachdem das hier:

    VB.NET-Quellcode

    1. Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles BtnSave.Click
    2. SaveData()
    3. GetKassaData()
    4. End Sub
    durchgelaufen ist, dann ist der Datensatz in der datenbank - definitiv.
    (Es wäre natürlich einfacher mit dem Commandbuilder, aber manche Leute wollen einfach nicht.)

    Ich tippe also darauf, dass du die Datenbank-Datei bei jedem Testlauf neu ins Ausgabeverzeichnis kopierst.
    Das kann man in den Eigenschaften der Datei einstellen, dass Visualstudio das sein lassen soll.
    Danke für den Input, werde ich dann am Abend gleich Mal checken.
    Ursprünglich habe ich auch vorgehabt, das mit dem Commandbuilder zu lösen, da es aber nicht funktioniert hat habe ich es mit dem obigen INSERT-Statement versucht. Werde aber auf jeden Fall wieder auf den Commandbuilder zurückgreifen sofern es läuft.



    Sooo... danke für den Tipp!
    Umgestellt auf "nicht kopieren" und alles passt.
    Das INSERT-Statement ist auch weg, mach es jetzt wie geplant mit dem CommandBuilder:

    VB.NET-Quellcode

    1. Try
    2. Dim NewDataRow As DataRow = DataTableKassa.NewRow
    3. NewDataRow("Buchungsdatum") = dtBuDat.Value
    4. NewDataRow("Bezeichnung") = tBezeichnung.Text
    5. NewDataRow("Einnahme") = xEin
    6. NewDataRow("Ausgabe") = xAus
    7. NewDataRow("Differenz") = xDifferenz
    8. DataTableKassa.Rows.Add(NewDataRow)
    9. DataAdapterKassa.Update(DataTableKassa)
    10. Catch ex As Exception
    11. MessageBox.Show(ex.Message)
    12. End Try


    Beiträge zusammengefügt. ~Thunderbolt

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

    Wie wärs mit typisierter Programmierung?

    VB.NET-Quellcode

    1. Dim NewDataRow = DataTableKassa.NewDataTableKassaRow
    2. NewDataRow.Buchungsdatum = dtBuDat.Value
    3. NewDataRow.Bezeichnung = tBezeichnung.Text
    4. NewDataRow.Einnahme. = xEin
    5. NewDataRow.Ausgabe = xAus
    6. NewDataRow.Differenz = xDifferenz
    7. DataTableKassa.AddDataTableKassaRow(NewDataRow)
    8. DataAdapterKassa.Update(DataTableKassa)
    Intellisense sagt dir dann die Properties vor.
    Vorraussetzung ist, ein typisiertes Dataset, aber möglicherweise liegt das bei dir bereits vor, und du nutzst es nur nicht.
    na, die 4-Views-Videos wirste im Datenbank-Tutorial-Bereich wohl selber finden.
    Dort ist auch auf eine noch bessere Quelle verlinkt, ein drei-teiliger CodeProject-Artikel - der ist aber auf Englisch.
    Die Videos sind eher was zum Appetit machen, der CP-Artikel gibt dann detaillierte Anleitung zur Umsetzung.