Hallo fump,
Deine SQL-Anweisung wird schon korrekt sein, Du musst aber beachten, was Dir GetTable() und Query() als Ergebnis liefern, und das steht (wenn auch in englisch) in den Kommentaren (der Inlinedokumantation) innerhalb von Class_SQLiteDB.ahk.
Beide Methoden liefern das Ergebnis in Form eines Objekts. Bei GetTable() ist das eine reines und unabhängiges AHK-Objekt (Class _Table{}), bei Query() ein AHK-Objekt (CLass _RecordSet{}), das einen Zeiger auf ein SQLite-Objekt enthält.
GetTable(SQL, TB):
Diese Methode ist eine Spezialität von SQLite. Im Normalfall würde ich immer GetTable() für Abfragen nutzen, auch wenn ich nur genau ein Feld als Antwort erwarte. Dann wird eben eine "Tabelle" mit einer Reihe und einer Spalte geliefert. Die Methoden GetRow(), Next() und Reset() braucht man nicht wirklich, um auf das Ergebnis zuzugreifen. Diese Methoden sollen nur ermöglichen, dass man das Ergebnis ähnlich wie das Ergebnis aus Query() verarbeiten kann.
- TB.HasRows enthält 0, wenn keine Antwortsätze gefunden wurden, sonst 1.
- TB.HasNames enthält 0, wenn die Spaltennamen nicht im Array TB.Names abgelegt wurden, sonst 1.
- TB.RowCount enthält die Anzahl der gefundenen Zeilen.
- TB.ColumnCount enthält die Anzahl der gefundenen Spalten.
- TB.ColumnNames enthält ggf. ein Array mit den Spaltennamen.
- TB.Rows enthält ggf. ein Array mit den zurückgelieferten und fertig aufbereiteten Werten, dort ist für jede Zeile ein Array mit den Spaltenwerten abgelegt.
Wenn ein Aufruf von GetTable() genau einen Wert liefert, sind deshalb normalerweise TB.RowCount = 1, TB.ColumnCount = 1, TB.HasRows = 1, TB.HasNames = 1, der Spaltenname liegt in TB.Names[1] und der Spaltenwert in TB.Rows[1][1].
Query(SQL, RS):
Diese Methode entspricht der normalen Methode für SQL-Abfragen. Wenn in der Antwortmenge BLOB-Felder enthalten sind, muss man sie verwenden. Weil das Recordset-Objekt nur einen Zeiger auf ein SQLite-Objekt enthält, kann man nicht direkt auf die Ergebnisse zugreifen, sondern nur über den Aufruf der Methode Next(), die dann pro Zeile ein Array mit den Spaltenwerten liefert. Die meisten Properties gibt es nur, um eine gewisse Kompatibilität zum Ergebnis aus GetTable() herzustellen.
- RS.HasRows enthält immer 1.
- RS.HasNames enthält immer 1.
- RS.ColumnCount enthält die Anzahl der gefundenen Spalten
- RS.ColumnNames enthält ein Array mit den Spaltennamen.
Wenn ein Aufruf von Query() genau einen Wert liefert, sind deshalb RS.ColumnCount = 1, RS.HasRows = 1, RS.HasNames = 1, der Spaltenname liegt in RS.ColumnNames[1] und den Spaltenwert liefert ein einmaliger Aufruf von RS.Next(Row) in Row[1]. Und weil es sich hier um ein SQLite-Objekt handelt, sollte man das Ergebnisobjekt nach Verarbeitung per RS.Free() freigeben.
Edit: Namen des Feldes mit den Spaltennamen für GetTable() korrigiert.