SQLITE boolsche Werte werden falsch gelesen

  • VB.NET

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

    SQLITE boolsche Werte werden falsch gelesen

    Mein falscher Code

    VB.NET-Quellcode

    1. SQLconnect.ConnectionString = "Data Source=" c:\test.db3 ";"
    2. SQLconnect.Open()
    3. SQLcommand = SQLconnect.CreateCommand
    4. Dim SQLreader As SQLite.SQLiteDataReader = SQLcommand.ExecuteReader()
    5. While SQLreader.Read
    6. indx_row = grid.Rows.Add
    7. grid.Rows(indx_row).Cells("col_aktiv").Value = SQLreader(3)
    8. End While


    kurz: ich hab vor in der Spalte 15 meiner SQLite Table einenb boolschen Wert auszulesen --> der Code funktioniert mit allen Strings etc. nur bei den boolschen Werten zeigt er mir immer False an.
    Aufbau meiner Tabelle:
    col Name: Id wert1 wert2 wert3 wert4 wert5 wert6 wert7 usw ...
    Datentyp: double int String boolean boolean String usw. ....

    Wenn ich mir dabei die Tabelle im Firefox anschaue steht für wert3 in der Tabelle als Wert immer entweder:
    úlse%
    oder:
    %True%

    (und zwar genau so wie hier geschrieben)
    ==> es wurde auch vom Gegenprogramm was die Tabelle schreibt immer mit dem Datentyp gearbeitet also bool und der Wert eingegeben
    les ich nun: SQLreader(1) + SQLreader(2) + SQLreader(5) +SQLreader(6) aus also alle Werte die nicht boolsch sind, sind die Daten richtig --> ansonsten bei den boolschen immer falsch.

    Auch die Variation:
    SQLreader.getboolean(3) oder Sqlreader.getvalue(3) oder Sqlreader.getvalue("wert3") mag nicht funktionieren und ich teh gerade absolut auf dem Schlauch

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

    Hi,

    es gibt immer wieder Probleme mit dem boolschen Werten in Datenbanken ich rate dir um diesen aus den Weg zu gehen einfach in die Tabelle 0 für false und 1 für true zu verwenden und anschließend kannst du diese ja in deinem Programm mappen.

    Gruß
    Also du meinst den Datentyp in der Tabelle auf Integer zu legen? Der Punkt ist --> men Firefox Add on zeigt halt %True% oder %False% an, also ist Windows halt schon in der Lage das zu kapieren, vielleicht les ich ja irgendwie falsch aus oder der SQLite.SQLiteDataReader ist irgendwie Mist? Das Problem ist ich muß in dem Prjekt schon auf die Datenkonsitenz achten, weil es eben Wiederverwendbar sein muß ich komm daher eigentlich nicht darum herum mir das ordentlich anzeigen zu lassen.
    "1.1 Boolean Datatype
    SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true)."

    sqlite.org/datatype3.html
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
    Wenn man einen BOOLEAN lesen will, bietet es sich an, reader.GetBoolean() zu verwenden ...
    Oder welchen Sinn macht es, den Wert als Object zu lesen und dann "irgendwie" umwandeln zu lassen?


    oder der SQLite.SQLiteDataReader ist irgendwie Mist?

    Ich habe mir folgende Sichtweise angewöhnt: Bei einem "Fehler" (oder unerwarteten Verhalten) gehe ich pauschal erstmal davon aus, dass ICH einen Fehler gemacht habe. s.o. !

    picoflop schrieb:

    Wenn man einen BOOLEAN lesen will, bietet es sich an, reader.GetBoolean() zu verwenden ...
    Oder welchen Sinn macht es, den Wert als Object zu lesen und dann "irgendwie" umwandeln zu lassen?


    oder der SQLite.SQLiteDataReader ist irgendwie Mist?

    Ich habe mir folgende Sichtweise angewöhnt: Bei einem "Fehler" (oder unerwarteten Verhalten) gehe ich pauschal erstmal davon aus, dass ICH einen Fehler gemacht habe. s.o. !
    SQLreader.GetBoolean(3) --> das habe ich bereits probiert aber es spuckt eben nix aus, dass wäre auch für mich die logischste Erklärung und ich gehe auch davon aus, dass ich in irgend einer Form einen Fehler gemacht habe - ich weiß derzeit einfach nicht welchen. Der Datentyp des Feldes in der Tabelle wird auch als boolsch angezeigt (Sqlreader(3).getType.FullName. Ich will die Werte überhaupt nicht wandeln ich will nur das mir das korrekte angezeigt wird.
    um die Nachwelt noch zu informieren - .getString("meineboolcol") war die Lösung weil das sqlite nur string werte kennt und zwar ausschließlich *facepalm* - um es dann im korrekten datentyp zu haben schreint man sich ne kleime funltion die bool zurück gibt

    bastimw schrieb:

    .getString("meineboolcol") war die Lösung weil das sqlite nur string werte kennt

    That funny is!

    VB.NET-Quellcode

    1. Imports System.Data
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. If Not IO.File.Exists("foo") Then SQLite.SQLiteConnection.CreateFile("foo")
    5. Using db As New SQLite.SQLiteConnection("Data Source=Foo")
    6. db.Open()
    7. Using cmd As New SQLite.SQLiteCommand("CREATE TABLE IF NOT EXISTS bar ( SomeText VARCHAR(100), Wahr BOOLEAN);", db)
    8. ' create table if needed
    9. cmd.ExecuteNonQuery()
    10. ' kill content
    11. cmd.CommandText = "DELETE FROM bar"
    12. cmd.ExecuteNonQuery()
    13. ' add content
    14. cmd.Parameters.AddWithValue("ST", "Hello")
    15. cmd.Parameters.AddWithValue("BL", True)
    16. cmd.CommandText = "INSERT INTO bar (SomeText, Wahr) VALUES (@ST, @BL)"
    17. cmd.ExecuteNonQuery()
    18. cmd.Parameters("ST").Value = "World"
    19. cmd.Parameters("BL").Value = False
    20. cmd.ExecuteNonQuery()
    21. ' query content
    22. cmd.CommandText = "SELECT * FROM bar"
    23. cmd.Parameters.Clear()
    24. Dim r = cmd.ExecuteReader
    25. While r.Read
    26. Debug.Print("{0} - {1}", r.GetString(0), r.GetBoolean(1))
    27. End While
    28. r.Close()
    29. End Using
    30. End Using
    31. End Sub
    32. End Class


    output:

    Quellcode

    1. Hello - True
    2. World - False


    QED ...