SQLite ist gelockt bei Importvorgang einer CSV-Datei

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von kurzda.

    SQLite ist gelockt bei Importvorgang einer CSV-Datei

    Hallo zusammen,
    ich versuche krampfhaft seit einigen Tagen einen ordentlichen Importer einer CSV-Datei zu bauen und scheitere immer wieder. Mittlerweile glaube ich einen guten Weg gefunden zu haben,
    allerdings erhalte ich hier auch eine Fehlermeldung und kann sie mir nicht erklären.

    Kurz zum Prozess: Ich lese ein Verzeichnis aus in dem ich die gute alte DIR-Funktion nur und daraus eine CSV-Datei konstruieren (A).
    Diese CSV-Datei möchte ich gerne in die SQLite-Datenbank schreiben (B). Erst in die eine Tabelle und im Anschluss an in die Zieltabelle (C).

    Teil A und C funktionieren, nur Teil B nicht.

    Hier erhalte ich immer wieder die Fehlermeldung, dass die Datenbank gelocked ist, ich frage mich nur warum das so ist?

    VB.NET-Quellcode

    1. Public Sub sub_CSVImportieren(pstr_Verzeichnis As String, pstr_Dateiname As String)
    2. Dim sql_CON As New SQLiteConnection(fkt_SQL_ConStr)
    3. Dim sql_CMD As New SQLiteCommand("SELECT * FROM ttab_Bilder", sql_CON)
    4. Try
    5. sql_CON.Open()
    6. Dim sql_DA As New SQLiteDataAdapter(sql_CMD)
    7. Dim sql_CB As New SQLiteCommandBuilder(sql_DA)
    8. Dim sql_DT As DataTable = fkt_CSVDataTable(pstr_Verzeichnis, pstr_Dateiname).Copy()
    9. sql_DA.InsertCommand = sql_CB.GetInsertCommand
    10. sql_DA.Update(sql_DT)
    11. Catch ex As Exception
    12. MsgBox(ex.Message)
    13. Finally
    14. sql_CON.Close()
    15. End Try
    16. End Sub
    17. ' ****************************
    18. Public Function fkt_CSVDataTable(ByVal pstr_Verzeichnis As String, ByVal pstr_Datei As String) As System.Data.DataTable
    19. Dim str_ConStr As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & pstr_Verzeichnis & ";Extensions=asc,csv,tab,txt;"
    20. Dim obj_DT As New DataTable()
    21. Dim odbc_CON As New OdbcConnection(str_ConStr)
    22. Dim odbc_CMD As New OdbcCommand("SELECT * FROM [" & pstr_Datei & "]", odbc_CON)
    23. Dim odbc_Reader As OdbcDataReader
    24. Try
    25. ' Als erstes die Spaltenanzahl bestimmen und in die DataTable schreiben
    26. obj_DT.Columns.Add(New DataColumn("Dateiname"))
    27. odbc_CON.Open()
    28. odbc_Reader = odbc_CMD.ExecuteReader
    29. While odbc_Reader.Read
    30. obj_DT.Rows.Add(odbc_Reader(0).ToString)
    31. End While
    32. odbc_Reader.Close()
    33. Return obj_DT
    34. Catch ex As Exception
    35. MsgBox(ex.Message)
    36. Return Nothing
    37. Finally
    38. odbc_CON.Close()
    39. End Try
    40. End Function


    [Ergänzung]

    Auf Hinweis von MemoAnMichSelbst: Der Fehler tritt bei diesem Befehl auf

    VB.NET-Quellcode

    1. sql_DA.Update(sql_DT)

    also da wo ich die Daten von der CSV-DataTable in die Datenbank schreiben möchte.
    Der Vorgang dauert ein / zwei Minuten und dann erscheint an dieser Stelle die Fehlermeldung.

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

    Bitte die Zeile wo er das wirft nennen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    zeile #14 kannste löschen - das ist unnötig, und vllt bringts ihn ja auch iwie durcheinander.

    Dann kannste noch versuchen, die beiden Methoden zu trennen.
    Also mit eim ButtonClick die Tabelle laden, mit einem anderen die Tabelle nach SqLite schieben.

    vlt. stört ihn auch die Verschränkung, also du öffnest erst die SqliteConnection, dann öffnest und schließt du die OleDbConnection, dann schreibst du über die SqliteConn.

    Aber alles sehr unsicher, bei mir zickt SqLite rum - und das kanns bei dir natürlich auch sein, dasses halt rumzickt.

    Oder die Tabellen sind nicht kompatibel. Die Csv-Tabelle enthält wohl nur Strings, und auch nur eine Spalte.
    evtl. ist die SqLite-Datenbank-Tabelle anders modelliert, bzw. wenn sie einen anderen Namen hat, dürfte es auch Probleme geben.
    Also ich denk, das getrennte Einlesen und Wegschreiben wird dich dem Fehler zumindest näher bringen.
    okay, Zeile 14 habe ich gelöscht, bringt leider auch nichts.

    Dann habe ich auch die Methoden voneinander getrennt.
    Ich habe in der aufrufenden Prozedur zuerst die DataTable erstellt und übergebe diese dann an die Methode zum Import.

    VB.NET-Quellcode

    1. obj_DT = fkt_CSVDataTable(Application.StartupPath, sql_Reader("Ordner").ToString & ".csv")
    2. Call sub_CSVImportieren(obj_DT)


    Tabellen sind im übrigen schon identisch, denn ich importiere diese erst in eine temporäre Tabelle und schreibe erst in einem anderen Schritt die Daten in die richtige Tabelle.

    Auch ein Tipp eines bekannten mit Transaktionen zu arbeiten funktioniert einfach nicht.

    Also irgendwie alles nicht so erquickend. Ist denn sqlite überhaupt für ein echtes Projekt gebrauchsfähig oder sollte man lieber zu einer anderen DB wechseln?
    ich meinte, dass du die Trennung weiter vorantreibst.
    Nicht im selben ButtonClick sowohl die neue Tabelle erstellen also auch sie gleich in die DB schubsen.

    ErfinderDesRades schrieb:

    Also mit eim ButtonClick die Tabelle laden, mit einem anderen die Tabelle nach SqLite schieben.
    Wie gesagt: ein Heilsversprechen ist damit auch nicht verbunden :/



    kurzda schrieb:

    Ist denn sqlite überhaupt für ein echtes Projekt gebrauchsfähig oder sollte man lieber zu einer anderen DB wechseln?
    Bei mir ists auch nicht gebrauchsfähig.
    Es geht fast, aber wenn ich mit CommandBuilder konfiguriertem DataAdapter inserten will, schmeisst er eine ObjectDisposed-Exception. Und das ist entweder ein SqLite-Bug, oder ein Installationsproblem bei mir.
    An meim Code liegts nicht, denn derselbe Code (derselbe - nicht der gleiche!!) - funzt mit anderen Providern, wie etwa SqlCe.

    Ist sehr schade, denn SqLite ist glaub der beste dateibasierte Provider (u.v.a. nicht von MS).
    Hey,

    als kurze Rückmeldung: Ich habe SQLite abgeschossen und bin zu Access zurück gegangen. Never change a running system!!

    CSV-Datei erstellen 1-2 Sekunden, Einlesen max. 1 Minute (je nach Größe der CSV)

    Es läuft, trotzdem Danke für die Hilfe!