Import in SQLite mit DataAdapter Fehler mitten im Import

  • VB.NET

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

    Import in SQLite mit DataAdapter Fehler mitten im Import

    Hallo,
    Ich stehe vor einem kleinen Rätsel und hoffe, dass mir jemand mit einer Idee weiter helfen kann.
    Ich erzeuge aus einer CSV eine DataTable und lese die in SQLite ein.
    Funktioniert auch, bis Zeile 38.
    Der Code

    VB.NET-Quellcode

    1. Imports System.Data.SQLite
    2. Imports System.Data.OleDb
    3. Public Class Form4
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. ' If OpenFileDialog1.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Return
    6. ' MessageBox.Show(OpenFileDialog1.FileName & "wird eingelesen")
    7. ' Dim folder = "C:\Users\Florian\TU Dresden\Hauptseminar\Wagenuebergaenge.csv"
    8. Dim CnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Florian\TU Dresden\Hauptseminar\; Extended Properties=""text;HDR=No;FMT=Delimited"";"
    9. Dim dt As New DataTable
    10. Using Adp As New OleDbDataAdapter("select * from [Ankunft.csv]", CnStr)
    11. Adp.Fill(dt)
    12. End Using
    13. DataGridView1.DataSource = dt
    14. Dim connect As New SQLite.SQLiteConnection()
    15. connect.ConnectionString = "Data Source=user.db;"
    16. connect.Open()
    17. Dim cmd = connect.CreateCommand
    18. cmd.CommandText = "DROP TABLE IF EXISTS Ankunft;"
    19. cmd.ExecuteNonQuery()
    20. cmd.CommandText = "CREATE TABLE Ankunft(
    21. id_1 TEXT,
    22. Zugnummer_An INTEGER
    23. );"
    24. cmd.ExecuteNonQuery()
    25. Dim ds As DataSet
    26. 'Dim dt = ds.Tables(0)
    27. For Each dr As DataRow In dt.Rows
    28. Dim id_1 = dr("id_1").ToString()
    29. Dim Zugnummer_An = dr("Zugnummer_An").ToString()
    30. 'Dim VTS = dr("VTS").ToString()
    31. cmd.CommandText = "INSERT INTO Ankunft (id_1, Zugnummer_An) values ('" & id_1 & "'," + Zugnummer_An & ")"
    32. cmd.ExecuteNonQuery()
    33. Next
    34. connect.Close()
    35. End Sub
    36. End Class

    Die geplanten Schritte sind:
    1. Ich gebe mit OpenFileDialog an, wo die CSV liegt (zur Zeit deaktiviert)
    2. Es wird eine shema.ini erzeugt 8noch nicht umgesetzt)
    3. Daten werden importiert
    4. Daten werden in SQLite kopiert

    Wie gesagt, geht bis zu Zeile 38 von rund 300.
    schema.ini ist:

    VB.NET-Quellcode

    1. [Ankunft.csv]
    2. ColNameHeader=True
    3. Format=Delimited(;)
    4. TextDelimiter="
    5. DecimalSymbol=,
    6. MaxScanRows=0
    7. Col1=id_1 Text
    8. Col2=Zugnummer_An Text
    9. Col3=VTS Text
    10. CharacterSet=ANSI


    Die CSV ist aus Excel erstellt und sieht so aus:


    Mo-53376
    53376
    Mo-LHG12
    LHG12

    Fehlermeldung lautet, LHG12 ist keine Spalte. Wie gesagt, bis zu dieser Zeile funktioniert alles, die einzige Änderung in der CSV ist, das bis da hin alle anderen Werte der Spalte nur 5-stellige Zahle sind.
    Hat jemand eine Lösung oder eine Idee, wo der Fehler ist.
    mach mal option strict on an. desweiteren solltest du eine try catch anweisung schreiben. mit ex. message

    VB.NET-Quellcode

    1. Private sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. try
    3. 'Hier dein Code
    4. Catch ex As Exception
    5. debug.Print(ex.Message & " -- " ex.source)
    6. End Try
    7. end sub


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Sorry wenn Falsch, ich mache das zu 99,5% nicht. nur wenn ich grad auf dem schlauch bin und den fehler nicht finde. Ich finde das meist sehr hilfreich, da man manchal im code, den man erstmal coded testen muss, um halt fehler zu vermeiden, danach natürlich rausnehmen. Hätte ich Unserem Mitglied natürlich schreiben sollen, Sorry.

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

    Aber wie EdR schon im Thread schrieb: Was verrät Dir ne MessageBox, die ungefiltert irgendeine Fehlermeldung zeigt, was Dir VS in allen Details ebenfalls zeigt, inkl. Variablenwerten, Zeilennummer, wo der Fehler aufgetreten ist, Aufrufreihenfolgeliste, u.v.a.?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    scherze3 schrieb:

    Fehlermeldung lautet, LHG12 ist keine Spalte. Wie gesagt, bis zu dieser Zeile funktioniert alles, die einzige Änderung in der CSV ist, das bis da hin alle anderen Werte der Spalte nur 5-stellige Zahle sind.
    Hat jemand eine Lösung oder eine Idee, wo der Fehler ist.

    Wenn man eine csv mit einem DbCommand liest, dann "schätzt" der DataProvider den Datentyp anhand der ersten Zeile.
    Weil bei deinen Daten scheinbar Zahlen drin stunden, hat er auf Int getippt, und wenn sich in Zeile 38 herausstellt, dass auch Buchstaben vorkommen, dann meckert er halt.
    Die wahre Lösung besteht darin, dass man ein Schema-File bereitstellen muss, wo angegeben ist, welche Spalte welchen Datentyp hat.
    Anders ist csv via OleDb einzulesen ein Glückspiel.
    gugge auch docs.microsoft.com/de-de/sql/o…ver?view=sql-server-ver15