Daten aus csv Datei mit Daten aus SQL vergleichen und ggf. abändern

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    Daten aus csv Datei mit Daten aus SQL vergleichen und ggf. abändern

    Hallo,

    ich suche nach einer Möglichkeit eine Datatable die ich aus einer csv Datei eingelesen habe mit einer Datatable die ich aus einer SQL Datenbank abgefragt habe zu vergleichen und ggf. Werte zu ändern.

    Ich habe eine Materialstammdatenbank mit selber erstellten Produktnummern unter denen sich auch andere Informationen wie Bestellnummern und Preise befinden. Diese möchte ich gerne mit einer Massendatenänderung updaten.

    Wie ich mir vorstelle wie es vom Ablauf aussehen könnte:
    1. Datentable1 wird mit Daten aus der Datenbank gefüllt
    2. Datentable2 wird mit Daten aus der csv Datei gefüllt
    3. Bestellnummern die aus der Datentable2 in der Datentable1 gefunden wurden werden mit Produktnummern und alten Preisen in Datentable2 ergänzt
    4. neue Preise werden anhand der Produktnummer in die Datensätze der SQL Datenbank geschrieben

    Ist hierfür ein Dataset das richtige Tool?

    Wenn ja, wie könnte ich die Tabellen beschreiben. Habe es mit mehreren Wegen versucht aber ich bekomme immer einen Fehler das die Tabellen "read only" sind.

    Oder gibt es einen eleganteren Weg mein Vorhaben in die Tat umzusetzen.

    Vielen Dank für Eure Hilfe.
    CSV Import

    Quellcode

    1. Imports System.IO
    2. Public Class CSV_Import
    3. Dim dt1 As New DataTable
    4. Private Sub CSV_Import_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. RadioButton1.Checked = True
    6. CheckBox1.Checked = True
    7. End Sub
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. Dim FR As Boolean
    10. Dim fName As String = ""
    11. OpenFileDialog1.InitialDirectory = "d:\"
    12. OpenFileDialog1.Filter = "CSV files(*.csv)|*.csv | TXT files(*.txt)| *.txt"
    13. OpenFileDialog1.FilterIndex = 2
    14. OpenFileDialog1.RestoreDirectory = True
    15. If (OpenFileDialog1.ShowDialog() <> DialogResult.OK) Then
    16. Return
    17. Else
    18. fName = OpenFileDialog1.FileName
    19. End If
    20. If RadioButton1.Checked = True Then
    21. If CheckBox1.Checked = False Then
    22. FR = False
    23. ElseIf CheckBox1.Checked = True Then
    24. FR = True
    25. End If
    26. dt1 = FileToTable(fName, {vbTab}, FR)
    27. End If
    28. If RadioButton2.Checked = True Then
    29. If CheckBox1.Checked = False Then
    30. FR = False
    31. ElseIf CheckBox1.Checked = True Then
    32. FR = True
    33. End If
    34. dt1 = FileToTable(fName, {";"}, FR)
    35. End If
    36. 'dt1 = FileToTable(fName, {";"}, FR)
    37. DataGridView1.DataSource = dt1
    38. End Sub
    39. Public Shared Function FileToTable(ByVal fileName As String, ByVal separator As String(), isFirstRowHeader As Boolean) As DataTable
    40. Dim result As DataTable = Nothing
    41. If Not System.IO.File.Exists(fileName) Then Throw New ArgumentException("fileName", String.Format("The file does not exist : {0}", fileName))
    42. Dim dt As New System.Data.DataTable
    43. Dim isFirstLine As Boolean = True
    44. Using sr As New System.IO.StreamReader(fileName)
    45. While Not sr.EndOfStream
    46. Dim data() As String = sr.ReadLine.Split(separator, StringSplitOptions.None)
    47. If isFirstLine Then
    48. If isFirstRowHeader Then
    49. For Each columnName As String In data
    50. dt.Columns.Add(New DataColumn(columnName, GetType(String)))
    51. Next
    52. isFirstLine = True ' Signal that this row is NOT to be considered as data.
    53. Else
    54. For i As Integer = 1 To data.Length
    55. dt.Columns.Add(New DataColumn(String.Format("Column_{0}", i), GetType(String)))
    56. Next
    57. isFirstLine = False ' Signal that this row IS to be considered as data.
    58. End If
    59. End If
    60. If Not isFirstLine Then
    61. dt.Rows.Add(data.ToArray)
    62. End If
    63. isFirstLine = False ' All subsequent lines shall be considered as data.
    64. result = dt.Copy
    65. End While
    66. End Using
    67. Return result
    68. End Function
    69. end class


    SQL Import

    Quellcode

    1. Sub Get_SQL_Lagerorte_TABLE()
    2. SQL.ExecQuery("
    3. select
    4. [DS_NR],
    5. [ID_STORE_LOC],
    6. [BEZEICHNUNG]
    7. from
    8. [Lagerorte_(ID_STORE_LOC)_m..n]
    9. order by [Lagerorte_(ID_STORE_LOC)_m..n].DS_NR
    10. ;
    11. ")
    12. If SQL.HasException(True) Then Exit Sub
    13. Dim table_LF As New DataTable
    14. SQL.DBDA.Fill(table_LF)
    15. dgv_Lagerorte.DataSource = table_LF
    16. End Sub
    ok, es gibt mehrere möglichkeiten auf die Dataset zuzugreifen.

    hier mal über code und dann gibt es noch die möglichkeit über drag & drop in die form. Hier solltest du dir mal das Tutorial fourViews von @ErfinderDesRades anschauen, habe den Link leider nicht.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class SQL_Allgemeine_Funktion
    3. Dim DeinDataset_DS As New DeinDataset
    4. dim CSV_Table as Datatable
    5. dim SQL_Table as Datatable
    6. Public Sub AddTable()
    7. csv_Table = DeinDataset_DS.Tables("CSVTabellenName")
    8. SQL_Table = DeinDataset_DS.Tables("SQLTabellenName")
    9. end Sub
    10. end class


    das ist aber ein sehr veinfachter zugriff auf deine Tabellen im Dataset.
    Das hast du ja in deinem Code gemacht.

    Die frage ist ja was soll am ende passieren, brauchst du denn unbedingt eine csv oder geht auch eine xml. Und was willst du mit den Daten in der csv machen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Neu

    ahh also willst du die daten aus der CSV in die SQL Tabelle eintragen.

    Dann solltest du ein Dataset nutzen, hier kannst du deine SQL Tabelle direkt mit einem Dataadapter einbinden und hast auch alle sql befehle, add, Modification, edit etc. diese werden automatisch erstellt.

    schau mal hier:

    [url]https://docs.microsoft.com/de-de/visualstudio/data-tools/create-and-configure-tableadapters?view=vs-2019
    [/url]

    Hier müsste auch mal ein Admin bzw. Moderator deinen post ins Datenbank forum verschieben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Neu

    Die DataTable zu überschreiben ist nicht sinnvoll. Du musst die Daten von einer Tabelle in die andere schieben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Du kannst die Daten aus der csv direkt in die Tabelle deiner Dataset schreiben.

    in dem einem Post habe ich dir schon reingeschrieben wie du zugriff auf die CSV_Table bekommst du musst jetzt nur anstelle "dt" in deiner "FileToTable" Funktion in die CSV_Tabelle schreiben.

    das hier schreibst du direkt unter Public Class

    VB.NET-Quellcode

    1. Dim DeinDataset_DS As New DeinDataset
    2. dim CSV_Table as Datatable
    3. dim SQL_Table as Datatable


    und das hier schreibst du in deine Formload Sub

    VB.NET-Quellcode

    1. csv_Table = DeinDataset_DS.Tables("CSVTabellenName")
    2. SQL_Table = DeinDataset_DS.Tables("SQLTabellenName")


    was ich jetzt nicht weis ist ob du ein Array direkt an ein Datatable übergeben kannst.