SQLight Fehler beim Rückschreiben in DB

  • VB.NET

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

    SQLight Fehler beim Rückschreiben in DB

    Hallo,

    ich schaffe es nicht geänderte Daten in die Datenbank zurückzuschreiben.

    Mir ist aufgefallen, dass ich auch keine ID in der DataTable habe.

    Hier der Code zum erstellender DB:

    Quellcode

    1. Sub sqlite_Create_Tables()
    2. ' Diese Sub erstellt in der in der Variablen SQLDB übergebenen
    3. ' Datenbank die Tabellen.
    4. ' Die Sub wird durch SQLight_Neu aufgerufen.
    5. Dim SQLconnect As New SQLite.SQLiteConnection()
    6. Dim SQLcommand As SQLiteCommand
    7. SQLconnect.ConnectionString = "Data Source=" & SQLDB & ";"
    8. SQLconnect.Open()
    9. SQLcommand = SQLconnect.CreateCommand
    10. . . .
    11. SQLcommand.CommandText = "CREATE TABLE Optionen(Inhalt TEXT, Wert1" & _
    12. "TEXT, Wert2 TEXT, Blob BLOB);"
    13. SQLcommand.ExecuteNonQuery()
    14. . . .
    15. 'verwendete Resourcen wieder freigeben
    16. SQLcommand.Dispose()
    17. 'Datenbankverbindung beenden
    18. SQLconnect.Close()
    19. End Sub


    Hiermit Trage ich die Daten erstmals ein:

    Quellcode

    1. Public Sub SQLight_Opt(ByVal SQLArr As Object)
    2. ' schreibt die Daten in die Tabelle Optionen
    3. Dim SQLconnect As New SQLite.SQLiteConnection()
    4. Dim SQLcommand As SQLiteCommand
    5. On Error GoTo Fehler
    6. SQLconnect.ConnectionString = "Data Source=" & SQLDB & ";"
    7. SQLconnect.Open()
    8. SQLcommand = SQLconnect.CreateCommand
    9. For i As Long = 0 To UBound(SQLArr)
    10. SQLcommand = New SQLiteCommand("INSERT INTO Optionen (Inhalt," & _
    11. "Wert1) VALUES ('" & SQLArr(i, 0).ToString _
    12. & "', '" & SQLArr(i, 1).ToString & "')", _
    13. SQLconnect) 'Comand festlegen
    14. SQLcommand.ExecuteNonQuery() 'Command ausführen
    15. Next
    16. SQLcommand.Dispose()
    17. SQLconnect.Close()
    18. Exit Sub
    19. Fehler:
    20. MsgBox(Err.Description)
    21. SQLcommand.Dispose()
    22. SQLconnect.Close()
    23. End Sub


    und lese mit:

    Quellcode

    1. Sub sql_LV_einlesen()
    2. 'liest eine SQLight Datenbank in ein DataSet.
    3. 'Wird aufgerufen von:
    4. ' - d86_NeuDB_Einlesen()
    5. ' - sql_LV_Oeffnen()
    6. Dim Conn As New SQLiteConnection("Data Source=" & SQLDB & ";Version=3")
    7. 'SQLight DB auslesen
    8. Conn.Open() 'Connection öffnen
    9. ' DataSet vorbereiten
    10. bamDS = New DataSet("bamDS")
    11. Dim Cmd As New SQLiteCommand
    12. Cmd.Connection = Conn
    13. . . .
    14. ' Tabelle "Optionen" einlesen
    15. Cmd.CommandText = "SELECT * FROM Optionen"
    16. Dim myAdapter_o As New SQLiteDataAdapter
    17. myAdapter_o.SelectCommand = Cmd
    18. myAdapter_o.MissingSchemaAction = MissingSchemaAction.AddWithKey
    19. myAdapter_o.FillSchema(bamDS, SchemaType.Source, "Optionen")
    20. myAdapter_o.Fill(bamDS, "Optionen")
    21. . . .
    22. 'verwendete Resourcen wieder freigeben
    23. Conn.Dispose()
    24. 'Datenbankverbindung beenden
    25. Conn.Close()
    26. End Sub


    Aber wie gesagt, ich habe keine ID im DataTable

    Das speichern hatte ich zuletzt versucht mit:

    Quellcode

    1. Sub speichernO()
    2. TryDim cb As New SQLite.SQLiteCommandBuilder(myAdapter_o)
    3. myAdapter_o.Update(bamDS, "Optionen")MsgBox("DB Optionen atuell")Catch ex As Exception
    4. MsgBox(ex.ToString())
    5. Console.WriteLine(ex.ToString)
    6. End TryEnd Sub

    Könnt Ihr meinen Fehler erkennen?
    Danke vorab für jede Hilfe
    Gruß Christian
    Hallo,

    die Fehlermeldung lautet:

    System.InvalidOperationException: Die Eigenschaft 'DataAdapter.SelectCommand' muss initialisiert werden.
    bei System.Data.Common.DbDataAdapter.UpdatingRowStatusErrors(RowUpdatingEventArgs rowUpdatedEvent, DataRow dataRow)
    bei System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
    bei System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
    bei System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)
    bei BauMass.modAllgemein.speichernO()
    Wo muss ich denn noch initialisieren?

    myAdapter_o ist Public deklariert



    Beim einlesen in das DataSet fülle ich ihn mit:

    Quellcode

    1. Dim myAdapter_o As New SQLiteDataAdapter
    2. myAdapter_o.SelectCommand = Cmd
    3. myAdapter_o.MissingSchemaAction = MissingSchemaAction.AddWithKeymyAdapter_o.FillSchema(bamDS, SchemaType.Source, "Optionen")
    4. myAdapter_o.Fill(bamDS, "Optionen")


    und versuche änderungen zu speichern mit:

    Quellcode

    1. Dim cb As New SQLite.SQLiteCommandBuilder(myAdapter_o)
    2. myAdapter_o.Update(bamDS, "Optionen")

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

    Hallo,

    jetzt habe ich versucht den Adapter nicht public zu halten, dann scheint es zu gehen.
    Ich habe gerade festgestellt, dass ich beim erstellen der Tabelle den PK vergessen habe.

    Melde mcih nachher noch einmal

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

    Hallo,

    meine Fehler waren: ich habe den Adapter Public gehalten und ich hatte in der Tabelle Optionen vergessen den Primärkey anzulegen.
    Mein Code zum Update ist jetzt:

    Quellcode

    1. Sub speichernO()
    2. 'speichert das DataSet in der Tabelle zurck
    3. Dim connectinString As String = "Data Source=" & SQLDB & ";"
    4. Try
    5. Dim myAdapter As New SQLite.SQLiteDataAdapter("SELECT * FROM Optionen",connectionString)
    6. Dim cb As New SQLite.SQLiteCommandBuilder(myAdapter)
    7. myAdapter.Update(bamDS.Tables("Optionen"))
    8. MsgBox("DB Optionen atuell")
    9. Catch ex As Exception
    10. MsgBox(ex.ToString())
    11. Clipboard.SetDataObject(ex.ToString, True)
    12. End Try
    13. Exit Sub
    14. End Sub

    Gruß Christian