DataGrid (WPF) in SQL Server Datenbank schreiben

  • VB.NET
  • .NET (FX) 4.5–4.8

    DataGrid (WPF) in SQL Server Datenbank schreiben

    EDIT 2:
    Ich habe das Ganze nun nochmal vereinfacht um DataGrids besser verstehen zu können. Folgender Code soll zumindest mal die bestehenden Daten in der Datenbank updaten können. Hierzu hab ich auch mal ein erstes Error-Handling eingebaut. Komischerweise läuft mir der Code bis zur letzten (OK-)Meldung durch, schreibt allerdings nichts in die Datenbank. Weiß vielleicht jemand von Euch, woran das liegen könnte - oder ob ich was übersehen hab?


    Quellcode

    1. Imports System
    2. Imports System.Data
    3. Imports System.Data.SqlClient
    4. Class MainWindow
    5. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
    6. Dim SpedDataSet As UpdateSingleTableWalkthrough.spedDataSet = CType(Me.FindResource("SpedDataSet"), UpdateSingleTableWalkthrough.spedDataSet)
    7. 'Lädt Daten in Tabelle "baua_auftragsadressen". Sie können diesen Code nach Bedarf ändern.
    8. Dim SpedDataSetbaua_auftragsadressenTableAdapter As UpdateSingleTableWalkthrough.spedDataSetTableAdapters.baua_auftragsadressenTableAdapter = New UpdateSingleTableWalkthrough.spedDataSetTableAdapters.baua_auftragsadressenTableAdapter()
    9. SpedDataSetbaua_auftragsadressenTableAdapter.Fill(SpedDataSet.baua_auftragsadressen)
    10. Dim Baua_auftragsadressenViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("Baua_auftragsadressenViewSource"), System.Windows.Data.CollectionViewSource)
    11. Baua_auftragsadressenViewSource.View.MoveCurrentToFirst()
    12. End Sub
    13. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    14. Dim spedDataset As New spedDataSet
    15. Dim myconnection As New SqlConnection
    16. myconnection = New SqlConnection("server=localhost;uid=xxx];pwd=xxx;database=sped")
    17. Try
    18. myconnection.Open()
    19. Catch x As Exception
    20. MsgBox("Verbindung zur Datenbank fehlgeschlagen")
    21. Return
    22. End Try
    23. MsgBox("Verbindung zur Datenbank erfolgreich")
    24. Dim SqlDataAdapter As New SqlDataAdapter("SELECT * FROM [baua_auftragsadressen]", myconnection)
    25. Try
    26. SqlDataAdapter.Update(spedDataset.Tables("baua_auftragsadressen"))
    27. Catch x As Exception
    28. MsgBox("SqlAdapter geht nicht")
    29. myconnection.Close()
    30. Return
    31. End Try
    32. MsgBox("Update sollte erfolgreich durchlaufen sein")
    33. myconnection.Close()
    34. End Sub
    35. End Class



    Spoiler anzeigen

    Hallo zusammen!

    Ich bin im Thema VB (2013 Express) und WPF noch
    total neu und mache gerade meine ersten Geh-Versuche - also bitte
    verzeiht mir meine Unwissenheit

    Was ich momentan habe ist eine Maske mit mehreren Feldern und einem DataGrid.
    Das
    DataGrid wird aktuell über eine View aus der DB (SQL Server 2012
    Express) befüllt. Da die Befüllung allerdings unerwünscht ist, habe ich
    der View-Select mitgegeben, dass nur Daten mit einer ID = -1 angezeigt
    werden sollen. Eventuell liegt ja auch hier bereits ein Fehler vor.

    Nun
    soll der User in das DataGrid mehrere Zeilen eintragen (Adressen),
    welche später bei einem Klick auf "Speichern" mitsamt den anderen Daten
    (Textboxen) in die DB geschrieben werden sollen.

    Könnt Ihr mir eventuell Tipps geben, wie man sowas am Besten bewerkstelligt?

    Hier mal mein Code vom DataGrid.

    VB

    Quellcode

    1. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
    2. Dim AuftragsadressenErfassung As
    3. WpfApplication6.AuftragsadressenErfassung =
    4. CType(Me.FindResource("AuftragsadressenErfassung"),
    5. WpfApplication6.AuftragsadressenErfassung)
    6. Dim
    7. AuftragsadressenErfassungAuftragsadressen__Sendungserfassung_TableAdapter
    8. As
    9. WpfApplication6.AuftragsadressenErfassungTableAdapters.Auftragsadressen__Sendungserfassung_TableAdapter
    10. = New
    11. WpfApplication6.AuftragsadressenErfassungTableAdapters.Auftragsadressen__Sendungserfassung_TableAdapter()
    12. AuftragsadressenErfassungAuftragsadressen__Sendungserfassung_TableAdapter.Fill(AuftragsadressenErfassung._Auftragsadressen__Sendungserfassung_)
    13. Dim _Auftragsadressen__Sendungserfassung_ViewSource As
    14. System.Windows.Data.CollectionViewSource =
    15. CType(Me.FindResource("_Auftragsadressen__Sendungserfassung_ViewSource"),
    16. System.Windows.Data.CollectionViewSource)
    17. _Auftragsadressen__Sendungserfassung_ViewSource.View.MoveCurrentToFirst()
    18. End Sub


    XAML

    Quellcode

    1. <DataGrid
    2. x:Name="AuftragsadressenErfassung" AutoGenerateColumns="False"
    3. EnableRowVirtualization="True" ItemsSource="{Binding
    4. Source={StaticResource
    5. _Auftragsadressen__Sendungserfassung_ViewSource}}" Margin="10,83,10,579"
    6. RowDetailsVisibilityMode="VisibleWhenSelected">
    7. <DataGrid.Columns>
    8. <DataGridTextColumn x:Name="Baua_bauaidColumn"
    9. Binding="{Binding baua_bauaid}" Header="baua bauaid" IsReadOnly="True"
    10. Width="SizeToHeader" Visibility="Hidden"/>
    11. <DataGridTextColumn x:Name="Baua_baufidColumn" Binding="{Binding
    12. baua_baufid}" Header="baua baufid" Width="SizeToHeader"
    13. Visibility="Hidden"/>
    14. <DataGridTextColumn
    15. x:Name="Baua_typColumn" Binding="{Binding baua_typ}" Header="Adr-Typ"
    16. Width="SizeToHeader"/>
    17. <DataGridTextColumn
    18. x:Name="Baua_adridColumn" Binding="{Binding baua_adrid}"
    19. Header="Adress-ID" Width="SizeToHeader"/>
    20. <DataGridTextColumn x:Name="Baua_termvonColumn" Binding="{Binding
    21. baua_termvon}" Header="baua termvon" Width="SizeToHeader"
    22. Visibility="Hidden"/>
    23. <DataGridTextColumn
    24. x:Name="Baua_termbisColumn" Binding="{Binding baua_termbis}"
    25. Header="baua termbis" Width="SizeToHeader" Visibility="Hidden"/>
    26. <DataGridTextColumn x:Name="Baua_planvonColumn"
    27. Binding="{Binding baua_planvon}" Header="baua planvon"
    28. Width="SizeToHeader" Visibility="Hidden"/>
    29. <DataGridTextColumn x:Name="Baua_planbisColumn" Binding="{Binding
    30. baua_planbis}" Header="baua planbis" Width="SizeToHeader"
    31. Visibility="Hidden"/>
    32. <DataGridTextColumn
    33. x:Name="Baua_istvonColumn" Binding="{Binding baua_istvon}" Header="baua
    34. istvon" Width="SizeToHeader" Visibility="Hidden"/>
    35. <DataGridTextColumn x:Name="Baua_istbisColumn" Binding="{Binding
    36. baua_istbis}" Header="baua istbis" Width="SizeToHeader"
    37. Visibility="Hidden"/>
    38. <DataGridTextColumn
    39. x:Name="Baua_artColumn" Binding="{Binding baua_art}" Header="baua art"
    40. Width="SizeToHeader" Visibility="Hidden"/>
    41. <DataGridTextColumn x:Name="Baua_name1Column" Binding="{Binding
    42. baua_name1}" Header="Name 1" Width="SizeToHeader"/>
    43. <DataGridTextColumn x:Name="Baua_name2Column" Binding="{Binding
    44. baua_name2}" Header="Name 2" Width="SizeToHeader"/>
    45. <DataGridTextColumn x:Name="Baua_name3Column" Binding="{Binding
    46. baua_name3}" Header="Name 3" Width="SizeToHeader"/>
    47. <DataGridTextColumn x:Name="Baua_strasse1Column" Binding="{Binding
    48. baua_strasse1}" Header="Strasse 1" Width="SizeToHeader"/>
    49. <DataGridTextColumn x:Name="Baua_strasse2Column"
    50. Binding="{Binding baua_strasse2}" Header="Strasse 2"
    51. Width="SizeToHeader"/>
    52. <DataGridTextColumn
    53. x:Name="Baua_landColumn" Binding="{Binding baua_land}" Header="Land"
    54. Width="SizeToHeader"/>
    55. <DataGridTextColumn
    56. x:Name="Baua_plzColumn" Binding="{Binding baua_plz}" Header="PLZ"
    57. Width="SizeToHeader"/>
    58. <DataGridTextColumn
    59. x:Name="Baua_ortColumn" Binding="{Binding baua_ort}" Header="Ort"
    60. Width="SizeToHeader"/>
    61. <DataGridTextColumn
    62. x:Name="Baua_refColumn" Binding="{Binding baua_ref}" Header="Referenz"
    63. Width="SizeToHeader"/>
    64. </DataGrid.Columns>
    65. </DataGrid>


    EDIT:
    Ich
    versuche das gerade mal testweise mit folgendem Code zu lösen,
    allerdings kommt da die folgende Fehlermeldung. Weiß eventuell wer,
    woran das liegt? Habe noch nicht alle Felder des DataGrids eingepflegt
    (muss man das?)

    FEHLER:
    Ein Ausnahmefehler des Typs "System.ArgumentException" ist in System.Data.dll aufgetreten.
    Zusätzliche
    Informationen: Das Format der Initialisierungszeichenfolge stimmt nicht
    mit der Spezifikation überein, die bei Index '0' beginnt.

    Quellcode

    1. Dim conn As New SqlConnection
    2. Dim command As New SqlCommand
    3. conn.ConnectionString = "conn string"
    4. command.CommandText = "insert into baua_auftragsadressen
    5. (baua_name1,baua_name2,baua_name3,baua_strasse1) values
    6. (@name1,@name2,@name3,@strasse1)"
    7. command.Parameters.Add("@name1", SqlDbType.NVarChar)
    8. command.Parameters.Add("@name2", SqlDbType.NVarChar)
    9. command.Parameters.Add("@name3", SqlDbType.NVarChar)
    10. command.Parameters.Add("@strasse1", SqlDbType.NVarChar)
    11. conn.Open()
    12. Command.Connection = conn
    13. 'load grid
    14. For i As Integer = 0 To AuftragsadressenErfassung.Items.Count - 2
    15. command.Parameters(0).Value = Me.AuftragsadressenErfassung.Items(i).Cells(1).Value
    16. command.Parameters(1).Value = Me.AuftragsadressenErfassung.Items(i).Cells(2).Value
    17. command.Parameters(2).Value = Me.AuftragsadressenErfassung.Items(i).Cells(3).Value
    18. command.Parameters(3).Value = Me.AuftragsadressenErfassung.Items(i).Cells(4).Value
    19. command.ExecuteNonQuery()
    20. Next
    21. conn.Close()
    22. MsgBox("Adressen wurden gespeichert")




    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „nitg“ ()