SQLite zickt bei Connection

  • VB.NET
  • .NET 4.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von TTX.exe.

    SQLite zickt bei Connection

    Hoi Leute :)

    ich brauch mal ein wenig hilfe, SQLite will mich irgendwie für dumm verkaufen gerade.

    VB.NET-Quellcode

    1. Dim AppConfigFolder As String = $"{GetFolderPath(SpecialFolder.ApplicationData)}\{Application.ProductName.ToString}\"
    2. Dim SQLConnect As String = $"Data Source={AppConfigFolder}data.db;Version=3;"


    Ich connecte mit dem obigen String zu einer SQLite DB. Diese DB lag bisher immer im Programmverzeichnis selbst, da möchte ich sie aber raus haben und in Appdata verlegen.
    Die DB liegt auch dort, aber SQLite macht immer so als wäre sie nicht da und die DB würde die gesuchte Tabelle nicht enthalten.

    Quellcode

    1. ​System.Data.SQLite.SQLiteException: "SQL logic error
    2. no such table: cards"

    .
    Das stimmt aber nicht, die Datei liegt im richtigen Pfad und hat ihre Tabellen wie sie soll. Irgendwie hat SQLite ein Problem diese Datenbank zu finden 8|.
    Wenn ich sie im Programmverzeichnis liegen habe, kann er connecten.
    : NV Updater | Nvidia Driver Update Tool
    Und was sagt MessageBox.Show(IO.File.Exists("C:\Users\smier\AppData\Roaming\nv_updater\data.db").ToString)?
    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.
    Moin,

    ich nehme für ConnectionStrings grundsätzlich den ConnectionStringBuilder.

    Den enthalten alle mir bekannten Connections (Sql, MySql, Oledb, SqLite ...)

    VB.NET-Quellcode

    1. Dim ConStr As String = String.Empty
    2. Dim Builder As New SQLiteConnectionStringBuilder
    3. With Builder
    4. .DataSource = "Datei"
    5. ConStr = .ConnectionString
    6. End With


    In selbst zusammengebauten Connectionstrings hakt oft mal was, wenn nur ein Teil der Syntax nicht passt.

    VB.NET-Quellcode

    1. Dim sqlite_conn As SQLiteConnection
    2. Dim sqlite_cmd As SQLiteCommand
    3. Dim sqlite_datareader As SQLiteDataReader
    4. Dim Result As Integer = Nothing
    5. Dim DBFile As String = $"{GetFolderPath(SpecialFolder.ApplicationData)}\{Application.ProductName}\nvu_graphicscard.db"
    6. Dim SQLConnectString As String = $"Data Source={DBFile};Version=3;"
    7. MsgBox(SQLConnectString)
    8. sqlite_conn = New SQLiteConnection(SQLConnectString)
    9. sqlite_conn.Open()
    10. sqlite_cmd = sqlite_conn.CreateCommand()


    Den ConnectionStringBuilder hab ich kurz getestet, der macht das gleiche Statement, wie gesagt wenn die DB in Verzeichnis der exe liegt, dann geht es.

    Die Fehlermeldung ist:
    System.Data.SQLite.SQLiteException: "SQL logic error
    no such table: cards"


    Diese ist aber einfach falsch da SQLite scheinbar zu doof ist mit dem Pfad klar zu kommen.

    Edit:
    Das Problem hat sich erledigt, ich hatte noch eine zweite Connection die auf den falschen Pfad gezeigt hat... Man bin ich lost :S .
    Der Code ist so korrekt :rolleyes:

    Die Farbe Rot ist der Moderation vorbehalten ~VaporiZed
    : NV Updater | Nvidia Driver Update Tool

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Schau dir Visual Studio - Empfohlene Einstellungen das bitte durch, bevor du weiter machst.

    Schmeiß den Microsoft.VisualBasic Verweis raus (MsgBox)

    Weiterhin finde ich auch die Deklaration des DBFile Strings sehr merkwürdig.
    Strings für Pfade kombiniert man eigentlich immer mit der IO.Path.Combine(...) Methode.
    Alles Andere ist Murks und verursacht schnell Fehler.

    Auch wenn dein Problem schon behoben ist, ich habe gerade ein Beispiel fertig, wie ich die Connection lösen würde.

    Connection, Cmd und Reader gehören Disposed wenn sie nicht mehr benötigt werden. Optimal geht das, wenn du sie mit Using verwendest.

    VB.NET-Quellcode

    1. Dim ConnStr As String = String.Empty
    2. Dim CSB As New SQLiteConnectionStringBuilder
    3. With CSB
    4. .DataSource = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Application.ProductName, "nvu_graphicscard.db")
    5. ConnStr = .ConnectionString
    6. End With
    7. Dim DeinSqlCommand As String = "UPDATE Tabelle ..."
    8. Using SQLiteCon As New SQLiteConnection(ConnStr)
    9. Using SqlCmd As New SQLiteCommand(DeinSqlCommand, SQLiteCon)
    10. With SqlCmd.Connection
    11. If Not .State = ConnectionState.Open Then .Open()
    12. End With
    13. 'machwas
    14. With SqlCmd.Connection
    15. If .State = ConnectionState.Open Then .Close()
    16. End With
    17. End Using
    18. End Using


    Wenn du es dann richtig machen willst ...

    VB.NET-Quellcode

    1. Dim DbFile As New IO.FileInfo(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Application.ProductName, "nvu_graphicscard.db"))
    2. If Not DbFile.Exists Then
    3. MessageBox.Show("DbFile" & " ist nicht vorhanden.", "Test", MessageBoxButtons.OK, MessageBoxIcon.Error)
    4. Exit Sub
    5. End If
    6. Dim CSB As New SQLiteConnectionStringBuilder
    7. With CSB
    8. .DataSource = DbFile.FullName
    9. ConnStr = .ConnectionString
    10. End With
    Hey danke für deine Mühe ;)

    Was meinst du mit "Microsoft.VisualBasic Verweis"? Die Msgbox da war nur zum testen drin.
    Den Pfad hatte ich beim rumprobieren mit IO.Path.Combine auch mal drin, finde es aber so wie das jetzt ist ein wenig übersichtlicher :whistling: , aber die Variante ist natürlich sauberer.
    Die Connection wird aber geschlossen, wenn das fertig ist :)

    Aber den ConnectionStringBuilder hab ich nun eingebaut :thumbup:
    : NV Updater | Nvidia Driver Update Tool

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TTX.exe“ ()

    TTX.exe schrieb:

    Was meinst du mit "Microsoft.VisualBasic Verweis"? Die Msgbox da war nur zum testen drin
    Durch die Tatsache, dass Du MsgBox nutzen kannst, wird klar, dass Du den VB6-Namespace in den Generalimporten drin hast, da MsgBox aus diesem Namespace stammt.
    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.