SQLite Parameter DateTime

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

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    SQLite Parameter DateTime

    Hallo und Frohe Ostern.

    Beschäftige mich zur Zeit mit einer Fremddatenbank (Agfeo TK-Anlage, Kontakte).
    Zur Zeit aktualisiere ich die Daten, indem ich eine Textdatei (Quelle: meine Accsess-Datenbank) erstelle und diese dann über Agfeo importiere.
    Ist halt sehr umständlich. Mein Gedanke ist nun, die Daten direkt in der Agfeo-Datenbank zu aktualisieren.
    Öffnen kann man diese mit SQLite.

    VB.NET-Quellcode

    1. Private Sub TabelleAnzeigen(ByVal TabellenName As String)
    2. If Not IO.File.Exists(Me.Zugriff_Arbeitsverzeichnis) Then
    3. MessageBox.Show("Die Datenbank steht nicht zur Verfügung.", "Agfeo Datenbank", MessageBoxButtons.OK, MessageBoxIcon.Hand)
    4. Exit Sub
    5. End If
    6. Try
    7. Me.DGV_AgfeoDB.DataSource = Nothing
    8. Me.DatenTabelle = New DataTable
    9. Me.SQL_Auftrag = New SQLiteCommand
    10. Me.SQL_Adapter = New SQLiteDataAdapter
    11. Me.SQL_Verbindung = New SQLiteConnection
    12. Me.SQL_Verbindung.ConnectionString = "Data Source=" & Me.Zugriff_Arbeitsverzeichnis
    13. Me.SQL_Verbindung.Open()
    14. Me.SQL_Auftrag.Connection = Me.SQL_Verbindung
    15. Me.SQL_Auftrag.Parameters.Add("@ birthday", DbType.DateTime)
    16. Me.SQL_Auftrag.CommandText = "SELECT * From " & TabellenName
    17. Me.SQL_Adapter.SelectCommand = Me.SQL_Auftrag
    18. Me.SQL_Adapter.Fill(Me.DatenTabelle)
    19. Me.DGV_AgfeoDB.DataSource = Me.DatenTabelle
    20. Me.SQL_Verbindung.Close()
    21. Catch ex As Exception
    22. Me.SQL_Verbindung.Close()
    23. MessageBox.Show("Beim Öffnen der Tabelle " & TabellenName & " ist folgender Fehler aufgetreten: " & vbNewLine &
    24. ex.Message, "Agfeo Datenbank", MessageBoxButtons.OK, MessageBoxIcon.Error)
    25. End Try
    26. End Sub


    Nun erhalte ich den Fehler: Die Zeichenfolge wurde nicht als gültiges DateTime erkannt.

    Die Spalte birthday enthält keine Daten, sie ist deklariert als Date.
    Gruß Markus
    Glaub deine Parameters.Add Methode wird falsch/unvollständig aufgerufen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Denke ich auch, habe schon einiges versucht, wie:

    VB.NET-Quellcode

    1. Me.SQL_Auftrag.Parameters.Add("@ birthday", DbType.Date)
    2. Me.SQL_Auftrag.Parameters.Add("@ birthday", DbType.DateTime2)
    3. Me.SQL_Auftrag.Parameters.Add("@ birthday", DbType.Time)
    4. Me.SQL_Auftrag.Parameters.Add("@ birthday", DbType.String)


    Edit: Tabellen ohne Datumformat lassen sich problemlos aus der gleichen DB auslesen.
    Gruß Markus
    Schau in der MSDN wie/was man machen muss: msdn.microsoft.com/de-de/libra…parameters(v=vs.110).aspx
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    SQL ist mir neu. Wie wird der Parameter denn gesetzt.
    Bin schon am Überlegen beim Import die Spalte birthday mit dem heutigen Datum zu belegen, um dem Problem aus dem Wege zu gehen.

    Edit:
    Dieses funktioniert auch nicht:
    Me.SQL_Auftrag.Parameters.Add("@birthday", DbType.DateTime)
    Me.SQL_Auftrag.Parameters("@birthday").Value = Now
    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    Wozu brauchst du das überhaupt? In deinem Select wird gar nicht mit diesem Parameter gearbeitet.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Um alle Spalten einer Tabelle zu bekommen, reicht
    SQL_Auftrag.CommandText = "SELECT * From " & TabellenName

    Die Parameter brauchst du dann gar nicht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    Um alle Spalten einer Tabelle zu bekommen, reicht
    SQL_Auftrag.CommandText = "SELECT * From " & TabellenName

    Die Parameter brauchst du dann gar nicht.


    Wenn ich so mache und die Parameter weg lasse, dann kommt es zu dem Fehler.

    ThuCommi
    Now ist Date

    Edit:
    Denke ich mache es so, dass ich mir jede Tabelle anschaue und dann selektiere:

    VB.NET-Quellcode

    1. Dim Auftrag As String = Nothing
    2. If TabellenName = "contact" Then
    3. Auftrag = "SELECT note, name, folder_id, id, creation_user_id, modify_user_id From " & TabellenName
    4. Else
    5. Auftrag = "SELECT * From " & TabellenName
    6. End If

    Kann somit auf die Parameter verzichten.

    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    Für ein Update an sich brauchts nicht zwingend nen Primarykey. Zeig deine Update Methode mal.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    So mache ich es mit meiner DB:

    VB.NET-Quellcode

    1. Private Sub TS_Speichern_Click(sender As Object, e As EventArgs) Handles TS_Speichern.Click
    2. If Me.Halt Then Exit Sub
    3. Me.Validate()
    4. Me.SQL_Binding.EndEdit()
    5. Me.SQL_Adapter.Update(Me.DatenTabelle)
    6. ' Dies hier bringt: Database locked
    7. ' Me.SQL_Adapter.Update(Me.DatenTabelle.Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent))
    8. End Sub


    Das Lesen ist ja ohne Primarykey schon falsch aufgebaut:

    VB.NET-Quellcode

    1. Using Datenverbindung = New SQLiteConnection(Me.SQL_Auftrag.CommandText)
    2. Me.SQL_Adapter = New SQLiteDataAdapter(Me.SQL_Auftrag.CommandText, Me.SQL_Verbindung)
    3. Me.SQL_Builder = New SQLiteCommandBuilder(Me.SQL_Adapter)
    4. Me.SQL_Builder.QuotePrefix = "["
    5. Me.SQL_Builder.QuoteSuffix = "]"
    6. Me.SQL_Adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey ' ####
    7. Me.SQL_Adapter.FillSchema(Me.DatenTabelle, SchemaType.Mapped)
    8. Me.SQL_Adapter.Fill(Me.DatenTabelle)
    9. Me.DatenTabelle.PrimaryKey = New DataColumn() {Me.DatenTabelle.Columns("id")}
    10. Me.SQL_Binding.DataSource = Me.DatenTabelle
    11. End Using
    Gruß Markus
    Hallo,

    gibt es die Möglichkeit, bevor ich auf die Tabelle einer SQLite-Datenbank zugreife, den Primarykey der Tabelle zu setzen?
    Und nach Schliessen der Anwendung diesen wieder zu löschen?

    Habe hier was gefunden, komme ich aber nicht klar mit:
    ALTER TABLE concerts_general ADD con_id INTEGER, ADD PRIMARY KEY (con_id);

    VB.NET-Quellcode

    1. Private Sub Primaerschluessel(ByVal Setzen As Boolean)
    2. If Me.SQL_Connection.State = ConnectionState.Closed Then Me.SQL_Connection.Open()
    3. If Setzen Then
    4. '1) Kontakt-Adressdaten
    5. Me.SQL_CommandAdresse.Connection = Me.SQL_Connection
    6. Me.SQL_CommandAdresse.CommandText = "ALTER TABLE " & Me.TabellenName_Adresse & " ADD " &
    7. Me.PrimKey_Adresse & " STRING, ADD PRIMARY KEY (" & Me.PrimKey_Adresse & ");"
    8. Me.SQL_CommandAdresse.ExecuteNonQuery()
    9. End If
    10. If Setzen Then
    11. MessageBox.Show("Primärschlüssel wurde gesetzt.")
    12. Else
    13. MessageBox.Show("Primärschlüssel wurde gelöscht.")
    14. End If
    15. End Sub


    Fehler: System.Data.SQLite.SQLiteException: "SQL logic error or missing database
    duplicate column name: agc_id"



    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    In Agfeo kann man (wenn ich mich richtig erinnere) übrigens auch "fremde Telefonbücher" angeben. Dann zieht sich Agfeo Daten zusätzlich aus einer fremden Datenbank (Stichwort View)... Da gibts so nen Dialog für die Zuordnung der Daten.

    In der Agfeo DB würde ich nicht rum fummeln. Und PrimaryKeys setzen/entfernen. Wenn du Daten speichern willst, kannst du auch dein SQL Statement klassisch von Hand schreiben. Da brauchts keinen PrimaryKey fürs Update ...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

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

    Guten Morgen und Dank für die Antworten.

    Um Kontaktdaten aus fremden Quellen zu lesen, benötigt man wohl die TK-Suite Plus Version, welche ich nicht habe.
    Mein Gedanke ist deshalb, bei Änderungen meines Kontaktstammes, kopiere ich die Agfeo-Datenbank in mein Arbeitsverzeichnis, setze die nötigen
    Keys, dann Änderung der Daten, Löschen der Keys und zurück kopieren der DB ins Agfeo-Verzeichnis.

    mrMo: Arbeite in meinem Datenmodell mit OLEDB und einer Accsessdatenbank. Habe meinen Datenbankzugriff vor 4 Jahren programmiert und keinen Ärger damit bisher
    gehabt. Deswegen bin ich aus dem Thema etwas raus. Bekomme in SQLite nun keine Updates ohne PrimaryKeys hin.
    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()