SQLite db auslesen

  • Hallo,
    ich habe eine kleine SQLite Datenbank, in die ich Informationen von Person abspeichere.
    Auslesen kann ich sie auch, aber bei der Filterung scheitert es:

    [autoit]


    #include <SQLite.au3>

    [/autoit][autoit][/autoit][autoit]

    _SQLite_StartUp()
    $hDB = _SQLite_Open("Leser.db")
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Nummer,Nachname,Vorname,Adresse,Telefonnummer) VALUES ('000002','Mustermann','Moritz','Hauptstraße 5','12345 67890');")
    Local $hQuery,$aRow
    _SQLite_Query($hDB, "SELECT * From Tabelle WHERE Nummer = 000002",$hQuery)
    _SQLite_FetchData ($hQuery, $aRow)
    $x = ""
    For $i = 0 To UBound($aRow)-1
    $x &= " "&$aRow[$i]
    Next
    MsgBox(0x40,"[INFO]",$x)

    [/autoit]

    Ich bekomme eine leere MsgBox zurück, wo liegt mein Fehler?
    LG
    Captain09

    Einmal editiert, zuletzt von Captain09 (12. Mai 2014 um 16:51)

  • Kommt vieles in Frage.
    Da ich aber kein Fehlermanagement bei dir sehe kann man den Ort wo es Probleme gibt aber leider nicht eingrenzen.

    Gehen wir mal alles durch was mir spontan einfällt:

    • Du bindest kein "#include <SQLite.dll.au3>" ein. Dann benötigst du die sqlite3.dll im Skriptverzeichnis (oder irgendein anders Verzeichnis der PATH-Variable).
    • Entspricht der Befehlssatz der DLL deinem Skript? Sprich: Wenn du eine x86-Dll hast muss dein Skript auch ein x86-Skript sein.
    • Existiert bereits eine Leser.db welche die Tabelle "Tabelle" mit allen angegebenen Attributen enthält? Wenn nicht klappt das INSERT nicht.
    • Was sind das für Datentypen für die einzelnen Attribute in der Datenbank? Beispiel: Im Insert sprichst du "Nummer" als String an. Im Select dann aber als Integer.
      Wenn Nummer tatsächlich vom Typ String wäre würde dein Select so nicht matchen. Du müsstest die Nummer also in Anführungszeichen setzen. Auch wenn ich es eher unglücklich finde eine Zahl als String zu speichern.


    Mal als Beispiel wie man den Fehler eingrenzen kann:

    Skript um Debugging-Ausgaben erweitert
    [autoit]

    #include <SQLite.au3>
    _SQLite_Startup()
    $hDB = _SQLite_Open("Leser.db")
    If @error Then Fehler("Fehler bei _SQLite_Open", $hDB)
    $s_Ret = _SQLite_Exec($hDB, "INSERT INTO Tabelle (Nummer,Nachname,Vorname,Adresse,Telefonnummer) VALUES ('000002','Mustermann','Moritz','Hauptstraße 5','12345 67890');")
    If @error Then Fehler("Fehler bei _SQLite_Exec", $s_Ret)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hQuery, $aRow
    $s_Ret = _SQLite_Query($hDB, "SELECT * From Tabelle WHERE Nummer = 000002", $hQuery)
    If @error Then Fehler("Fehler bei _SQLite_Query", $s_Ret)

    [/autoit] [autoit][/autoit] [autoit]

    $s_Ret = _SQLite_FetchData($hQuery, $aRow)
    If @error Then Fehler("Fehler bei _SQLite_FetchData", $s_Ret)
    $x = ""
    For $i = 0 To UBound($aRow) - 1
    $x &= " " & $aRow[$i]
    Next
    MsgBox(0x40, "[INFO]", $x)

    [/autoit] [autoit][/autoit] [autoit]

    Func Fehler($s_Text, Const $s_Return = "", Const $d_error = @error, Const $d_extended = @extended, Const $d_Line = @ScriptLineNumber)
    MsgBox(48, "Fehler", $s_Text & @CRLF & @CRLF & "Return: " & $s_Return & @CRLF & "@error: " & $d_error & @CRLF & "@extended: " & $d_extended & @CRLF & "Zeile: " & $d_Line)
    Exit
    EndFunc ;==>Fehler

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (11. Mai 2014 um 14:41)

  • Welchen Datentyp hat "Nummer" in der Datenbank?

  • Falls es tatsächlich Strings sein sollten müsstest du deinen Vergleich in der WHERE Klausel eben auf LIKE umstellen:


    SQL
    SELECT * From Tabelle WHERE Nummer LIKE '000002'
  • Captain09
    Hast du überhaupt gelesen was ich geschrieben habe?
    Ich zitiere mich nochmal selbst:

    Beispiel: Im Insert sprichst du "Nummer" als String an. Im Select dann aber als Integer.
    Wenn Nummer tatsächlich vom Typ String wäre würde dein Select so nicht matchen. Du müsstest die Nummer also in Anführungszeichen setzen.


    Es lag nicht daran = durch Like zu ersetzen.
    Du hast schlicht die Anführungszeichen vergessen.
    Das bedeutet, dass die Eingabe als Zahl interpretiert wird, was aus 000002 eine 2 macht.
    Die Aufgabe von Like ist Strings flexibel über Wildcards zu vergleichen.
    Wenn man, wie hier, keine Wildcards verwendet kann man gleich ein = verwenden - nur halt mit Anführungszeichen wenn es sich um einen String handelt.

    misterspeed

    Ist in diesem Fall aber wohl notwendig, denn die führenden Nullen wären bei numerischen Datentypen so nicht möglich.

    Wenn es Zahlen sind, welche eine ID darstellen (wahrscheinlich sogar auto increment) und in der Ausgabe mit 6 Stellen und führenden Nullen angezeigt werden sollen würde man es im Normalfall dennoch als Zahl speichern und bei einem Select die Ausgabe mit print() entsprechend dem gewünschten Format anpassen.

    2 Mal editiert, zuletzt von AspirinJunkie (11. Mai 2014 um 20:01)

  • Wenn es Zahlen sind, welche eine ID darstellen (wahrscheinlich sogar auto increment) und in der Ausgabe mit 6 Stellen und führenden Nullen angezeigt werden sollen würde man es im Normalfall dennoch als Zahl speichern und bei einem Select die Ausgabe mit print() entsprechend dem gewünschten Format anpassen.

    Kommt drauf an was man erreichen will. Die führenden Nullen könnten auch Auswirkungen auf die spätere Sortierung der Daten haben. Hab das zwar nicht getestet, aber ein SORT BY nummer könnte bei einem nummerischen Datentyp zu solchen ungewollten Ausgaben führen (außer sqlite ist schlau genug in diesem Fall nummerisch zu sortieren):

    Code
    1
    101
    113
    2
    224
  • Kommt drauf an was man erreichen will.


    Sehe ich genauso.
    Hier sieht es für mich aber sehr nach auto increment id's aus weswegen ich darauf hinwies, dass dabei die Darstellung von der enthaltenen Information getrennt wird.
    Aber ohne weitere Informationen können wir natürlich nur Hinweise geben und spekulieren.

    Edit:
    Aber auch die Stringsortierung ist ohne Probleme mit numerischen Typen möglich:

    Zitat

    SELECT * FROM tabelle ORDER By cast(Nummer as TEXT);

    Edit2:
    Jetzt habe ich dich erst verstanden (danke Bugfix).
    Die Angst brauchst du nicht zu haben.
    Die Sortierung erfolgt gemäß dem Datentyp (dewegen gibt man ja auch den Datentyp an).
    Wenn der Datentyp numerisch ist, wird numerisch sortiert - ist der String wird die Zeichenkettensortierung verwendet.
    Je nachdem wie man beides mischen will arbeitet man mit einem cast oder einem printf im Select.

    2 Mal editiert, zuletzt von AspirinJunkie (11. Mai 2014 um 20:34)