CSV Dateien in SQL Server einbinden.

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

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

    CSV Dateien in SQL Server einbinden.

    Hallo,

    Ich hab folgendes Problem, ich würde gerne eine CSV Datei in einen SQL Datei Umwandeln lassen. Leider habe ich noch keine sonderliche erfahrung mit der programmiersprache vb.net. Das habe ich bisher geschafft. Im ersten Moment geht es nur um den Import der CSV Datei... danach kann man sich über den Rückweg gedanken machen. Beim Loop Schritt bekomme ich grundsätzlich eine eine Exception, die lautet : ArgumentetExeption, Der Eingabearray ist länger als die Anzahl der Spalten in dieser Tabelle.

    Hoffe jemand kann mir helfen
    Mfg Stomp

    Imports System.IO
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Configuration
    Imports Microsoft.VisualBasic.FileIO.TextFieldParser

    Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    Dim table As New DataTable()
    Dim parser As New FileIO.TextFieldParser("C:\Users\XXX\Desktop\XXX\XXX\DatenbankTest\csvconverter\csvdatei\Kunde1.csv")

    table.Columns.Add("KUNDENNUMMER")
    table.Columns.Add("MATCHCODE")
    table.Columns.Add("MANDANT")
    table.Columns.Add("NAME1")
    table.Columns.Add("NAME2")
    table.Columns.Add("STRAßE")
    table.Columns.Add("PLZ")
    table.Columns.Add("ORT")

    parser.Delimiters = New String() {";"}
    parser.HasFieldsEnclosedInQuotes = True
    parser.TrimWhiteSpace = True
    parser.ReadLine()

    Do Until parser.EndOfData = True
    table.Rows.Add(parser.ReadFields())
    Loop

    Dim strSql As String = "INSERT INTO TestTable KUNDENNUMMER,MATCHCODE,MANDANT,NAME1,NAME2,STRAßE,PLZ,ORT) VALUES (@KUNDENNUMMER,@MATCHCODE,@MANDANT,@NAME1,@NAME2,@STRAßE,@PLZ,@ORT)"
    Dim SqlconnectionString As String = "Server=xxx.xxx.xxx.xxx\blabla\Tabellen;Database=TestDatabase;User Id=xxx;Password=xxx;"
    Using connection As New SqlClient.SqlConnection(SqlconnectionString)
    Dim cmd As New SqlClient.SqlCommand(strSql, connection) ' create command objects and add parameters
    With cmd.Parameters
    .Add("@KUNDENNUMMER", SqlDbType.VarChar, 50, "KUNDENNUMMER")
    .Add("@MATCHCODE", SqlDbType.VarChar, 50, "MATCHCODE")
    .Add("@MANDANT", SqlDbType.VarChar, 50, "MANDANT")
    .Add("@NAME1", SqlDbType.VarChar, 50, "NAME1")
    .Add("@NAME2", SqlDbType.VarChar, 50, "NAME2")
    .Add("@STRAßE", SqlDbType.VarChar, 50, "STRAßE")
    .Add("@PLZ", SqlDbType.VarChar, 50, "PLZ")
    .Add("@ORT", SqlDbType.VarChar, 15, "ORT")
    End With

    Dim adapter As New SqlClient.SqlDataAdapter()
    adapter.InsertCommand = cmd

    Dim iRowsInserted As Int32 = adapter.Update(table)

    End Using
    End Sub

    End Class
    1. Hallo der Neue! :)
    2. guck, so kann man schöne Codesnipptes einstellen auf VBP:
    3. scheint so, als lese der Textfieldparser mehr Spalten aus, als du in deiner Tabelle angelegt hast.
      lies erstmal in eine Variable ein, etwa so:

      VB.NET-Quellcode

      1. Do Until parser.EndOfData
      2. dim fields = parser.ReadFields()
      3. table.Rows.Add(fields)
      4. Loop
      dann kannst du im Lokalfenster nachgucken, was da beim Einlesen schief lief
    4. Wie man im Lokalfenster was nachguckt (und weiteres Debugging-KnowHow) gugge hier: VisualStudio richtig nutzen
    ok danke hat geklappt, hab den fehler dadurch gefunden, waren zu wenige Spalten eingetragen, die CSV Datei hatte mehr, die behebung des ganzen wars leider nicht über Link to SQL hats dann aber doch geklappt :)

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

    Habe jezt ein anderes Problem, beim Link to SQL kommt die Exption das das Datum aus der CVS Datei erst einam ins DateTime Format der SQL Datenbank umgewandelt werden muss, folgende Exeption : Ungültige Konvertierung von der Zeichenfolge in Typ Date. (InvalidCastException)

    der neue code hoffentlich Richtig formatiert:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Data
    3. Imports System.Data.SqlClient
    4. Imports System.Configuration
    5. Imports Microsoft.VisualBasic.FileIO.TextFieldParser
    6. Public Class Form1
    7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    8. Dim table As New DataTable()
    9. Dim parser As New FileIO.TextFieldParser("C:\Users\xxx\Desktop\xxx\xxx\DatenbankTest\csvconverter\csvdatei\Kunde.csv")
    10. table.Columns.Add("Kundennummer")
    11. table.Columns.Add("Matchcode")
    12. table.Columns.Add("Mandant")
    13. table.Columns.Add("Sperrvermerk")
    14. table.Columns.Add("Name1")
    15. table.Columns.Add("Name2")
    16. table.Columns.Add("Strasse")
    17. table.Columns.Add("Land")
    18. table.Columns.Add("PLZ")
    19. table.Columns.Add("Ort")
    20. table.Columns.Add("Ansprechname")
    21. table.Columns.Add("Ansprechtelefon")
    22. table.Columns.Add("Ansprechmail")
    23. table.Columns.Add("Freitext")
    24. table.Columns.Add("ErzeugerNr")
    25. table.Columns.Add("Entsnweis")
    26. table.Columns.Add("LetzterLieferschein")
    27. parser.Delimiters = New String() {";"}
    28. parser.HasFieldsEnclosedInQuotes = True
    29. parser.TrimWhiteSpace = True
    30. parser.ReadLine()
    31. Do Until parser.EndOfData = True
    32. Dim fields = parser.ReadFields()
    33. table.Rows.Add(fields)
    34. Loop
    35. Dim SQL As New WaageDataContext
    36. Dim neuKunde As New TestTable
    37. Dim index As Integer
    38. For index = 0 To 2643
    39. neuKunde.Kundennummer = table.Rows(0).Item("Kundennummer")
    40. neuKunde.Matchcode = table.Rows(0).Item("Matchcode")
    41. neuKunde.Mandant = table.Rows(0).Item("Mandant")
    42. neuKunde.Sperrvermerk = table.Rows(0).Item("Sperrvermerk")
    43. neuKunde.Name1 = table.Rows(0).Item("Name1")
    44. neuKunde.Name2 = table.Rows(0).Item("Name2")
    45. neuKunde.Strasse = table.Rows(0).Item("Strasse")
    46. neuKunde.Land = table.Rows(0).Item("Land")
    47. neuKunde.PLZ = table.Rows(0).Item("PLZ")
    48. neuKunde.Ort = table.Rows(0).Item("Ort")
    49. neuKunde.Ansprechname = table.Rows(0).Item("Ansprechname")
    50. neuKunde.Ansprechtelefon = table.Rows(0).Item("Ansprechtelefon")
    51. neuKunde.Ansprechmail = table.Rows(0).Item("Ansprechmail")
    52. neuKunde.Freitext = table.Rows(0).Item("Freitext")
    53. neuKunde.ErzeugerNr = table.Rows(0).Item("ErzeugerNr")
    54. neuKunde.Entsnweis = table.Rows(0).Item("Entsnweis")
    55. neuKunde.LetzterLieferschein = table.Rows(0).Item("LetzterLieferschein")
    56. Next
    57. SQL.TestTable.InsertOnSubmit(neuKunde)
    58. SQL.SubmitChanges()
    59. End Sub
    60. Public Function ConnectionstringSQL_erstellen()
    61. 'Connectionstring zum SQL Server erstellen
    62. Try
    63. Dim conn = "Data Source=xxx.xxx.xxx.xxx\xxx"
    64. conn &= ";Initial Catalog=xxx"
    65. conn &= ";Persist Security Info=TRUE;USER ID =xxx"
    66. conn &= "Password=xxx"
    67. Return conn
    68. Catch ex As Exception
    69. MsgBox(ex.Message)
    70. Return Nothing
    71. End Try
    72. End Function
    73. End Class
    naja - in der Datenbank wirds auch andere Datentypen geben als nur strings. Csv enthält aber nur String-Daten, und das ist auch der Grund, warum Csv als Datenformat deprecated ist.
    Jdfs musste dem Rechnung tragen, indem du den entsprechenden Spalten geeignete Datentypen zuweist, und wenn du die Werte zuweist, müssen die in Folge auch diesen Datentyp haben.

    Dein Code ist fein gelayoutet :thumbsup: , und dann sieht man auch gleich die Mankos:
    1. Du arbeitest Strict Off - das ist eine Todsünde. Gugge Datenverarbeitungs-Vorraussetzungen die Grundeinstellungen, weil den MVS-GeneralImport kannste dann gleich mit weghauen
    2. Mach den TryCatch weg, du bist noch beim Debuggen: TryCatch ist ein heißes Eisen
    3. Du arbeitest sowohl mit DataTable als auch mit typisiertem DataContext. Dann entferne den unnützen untypisierten DataTable-Code

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    der Grund, warum Csv als Datenformat deprecated

    Ich glaube nicht das CSV deprecated ist. Wenn ich mir die aktuellen Beiträge zum RFC 4108 anschaue, sehe ich dies auch noch nicht.
    Welches Format soll denn der Nachfolger für CSV als plattform-unabhängiger Datenaustausch sein?
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hmm - ich verstehe nix von diese RFC - ist da iwie beschrieben, wie Csv mit verschiedenen Datentypen, Zeitzonen, Kultur-Einstellungen umgeht?

    Für Xml sind diese Probleme gelöst, und insbesondere wenn ein typisiertes Dataset seine Daten exportiert, kann ein "empfangendes" anneres Dataset desselben Typs diese sicher importieren - alles eingebaut - nur ein Befehl aufzurufen.

    Vlt. war meine Verwendung von "deprecated" falsch, weil das Wort scheint Microsoft für sich abonniert zu haben.
    Ich wollte damit ausdrücken, Csv ist ein mieses Datenübertragungs-Format, man sollte es möglichst nie mehr benutzen - es gibt besseres.
    Das gilt zumindest für innerhalb von .Net.
    hab das Problem mittlerweile gelöst, das mit den CSV Dateien war mir bewusst, jedoch war dies Teil der Aufgabenstellung...XML auch aber dies hatte ich innerhalb von einer Stunde fertig. Die Lösung zur Umwandlung des Datentyps aus einem String in das Date Format von SQL :

    VB.NET-Quellcode

    1. If table.Rows(index).Item("LetzterLieferschein") = "" Then
    2. neuKunde.LetzterLieferschein = Nothing
    3. Else
    4. neuKunde.LetzterLieferschein = CDate(table.Rows(index).Item("LetzterLieferschein"))
    5. End If
    6. SQL.TestTable.InsertOnSubmit(neuKunde)

    Stomp schrieb:

    Die Lösung zur Umwandlung des Datentyps aus einem String in das Date Format von SQL
    wäre analog hierzu:

    VB.NET-Quellcode

    1. Dim dd = "18.12.2014"
    2. Dim dt As DateTime
    3. If DateTime.TryParse(dd, dt) Then
    4. neuKunde.LetzterLieferschein = Nothing
    5. Else
    6. neuKunde.LetzterLieferschein = dt
    7. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja, aber schmeiss doch die blöde untypisierte DataTable raus.
    Du kannst die fields doch auch direkt in die TestTable einpflegen - wieso erstellst du erst eine untyp DataTable mit allem Pipapo, befüllst die, und füllst die dann um?

    Ach - ist dir glaub eh egal: Du hast ja noch immer Option Strict Off.