Moin,
versuchen wir es mal.
Ich weiß nicht, wie weit Deine Kentnisse mit der AHK-Programmierung reichen. Wenn Du eher Anfänger bist, kommen Dir die AHK-Klassen wahrscheinlich eher merkwürdig vor. Das trifft ja aber sowohl auf Class_SQLiteDB.ahk wie auch auf DBA.ahk zu.
Zunächst einmal:
Eine Klassendefinition wie in SQLiteDB sollte immer komplett in das Skript übernommen werden. Man kann allenfalls einzelne Teile entfernen, tut das aber dann auf eigenes Risiko. Du solltest deshalb die komplette Klasse per
in Dein Skript inkludieren oder den kompletten Klassencode in Dein Skript kopieren.
Damit das Ganze funktioniert, brauchst Du dann 3 Dinge:
- Ein AHK-Script.
- Eine SQLite-Datenbank.
- Die zu Deiner AHK-Version (32/64 Bit) passende SQLite3.dll von der SQLite Download Page:
https://www.sqlite.org/2018/sqlite-dll- ... 240000.zip (32 Bit)
https://www.sqlite.org/2018/sqlite-dll- ... 240000.zip (64 Bit)
Am Einfachsten ist es, wenn sich alle Drei in einem Verzeichnis befinden.
Auf
GitHub findest Du das Skript SQLiteDB_sample.ahk. Darin finden sich Beispiele dafür, wie man mit AHK auf eine SQLite-Datenbank zugreift. Die wesentlichen Schritte für eine Datenbankabfrage will ich hier noch einmal erläutern.
Als Erstes muss eine eigenes Datenbankobjekt aus der Klasse erzeugt werden. Das geht mit
Wenn dabei etwas schiefgeht, solltest Du eine Fehlermeldung bekommen.
Danach muss dem Datenbankobjekt eine Datenbank zugewiesen werden. Das macht man mit einem Aufruf der Methode OpenDB:
Code: Select all
DBFileName := A_ScriptDir . "\Hauptstadt.sqlite3"
If !DB.OpenDB(DBFileName) {
MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
ExitApp
}
Dabei muss im ersten Parameter der Pfad der Datenbankdatei übergeben werden.
Jetzt kannst Du Deine SQL-Statements auf die Datenbank loslassen. Für Statements, die keine Abfragen sind, gibt es die Methode
Die versucht, das Statement auszuführen, und gibt schlicht bei Erfolg 1 (True) und im Fehlerfall 0 (False) zurück. Ich gehe hier nicht weiter darauf ein.
Für Datenbankabfragen bietet SQLite eine Besonderheit. SQLite kann sämtliche Antworten einer Abfrage auf einen Schlag in einem Table-Objekt zurückgeben. Dafür gibt es die Methode
DB.GetTable(). Die versucht, das im ersten Parameter übergebene SQL-Statement auszuführen, erstellt ggf. aus dem Ergebnis ein AHK-Objekt in der im zweiten Parameter übergebenen Variablen, gibt dann die Datenbankressourcen frei und 1 (True) zurück. Bei Fehlern wird auch hier 0 (False) zurückgegeben:
Code: Select all
SQL := "SELECT * FROM Test;"
If !DB.GetTable(SQL, Result)
MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
Das im Beispiel in der Variablen
Result zurückgegebene Objekt ist innnerhalb der Klasse
SQLiteDB als Subklasse
_Table definiert und hat folgende Eigenschaften:
Code: Select all
Result.ColumnCount - Anzahl der zurückgelieferten Spalten
Result.RowCount - Anzahl der zurückgelieferten Zeilen
Result.ColumnNames - Einfaches Array mit Spaltennamen in der Reihenfolge der Abfrage
Result.Rows - Zweidimensionales Array mit den Ergebnissen der Abfrage:
0 - Rowcount Zeilen mit Index 1 - Rowcount
0 - ColumnCount Spalten mit Index 1 - ColumnCount
Result.HasNames - Result.ColumnNames enthält Werte (True / False)
Result.HasRows - Result.Rows enthält Werte (True / False)
Für den Zugriff auf das Ergebnis gibt es zwei Methoden. Mit
Result.Next(Row)wird das Ergebnis sequentiell abgearbeitet. Mit
Result.GetRow(RowIndex, Row) wird auf die in
RowIndex übergebene Zeile zugegriffen. Beide Methoden stellen bei Erfolg ein Array mit den Spaltenwerten der Zeile in die Variable
Row und geben 1 (True) zurück. Bei Fehlern bzw. wenn keine weitere Zeile zur Verfügung steht, wird 0 (False) zurückgegeben. Auf die Spaltenwerte kann dann im Gegensatz zu IsNulls DBA.ahk nur über den Index aber nicht über den Namen zugegriffen werden.
liefert den Wert der ersten Spalte.
Auf das Ergebnis in
Result.Rows kann per Zeilen- und Spaltenindex aber auch direkt zugegriffen werden. So liefert
den Wert der zweiten Spalte der ersten Zeile der gelieferten Tabelle.
Wenn Du die Datenbank nicht mehr brauchst, kannst Du sie mit
Result.CloseDB() schließen. Notfalls erledigt AHK das bei Beendigung des Skripts auch automatisch.
Lange Rede, kurzer Sinn, Deine Frage könnte folgende Antwort haben (ungetestet):
Code: Select all
#NoEnv
DB := New SQLiteDB
DBFileName := A_ScriptDir . "\Hauptstadt.sqlite3"
If !DB.OpenDB(DBFileName) {
MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
ExitApp
}
SQL := "SELECT * FROM Deutschland WHERE PLZ = '70000';" ; keine Garantie für das SQL
If !DB.GetTable(SQL, Result)
MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
Else
MsgBox, 0, SQLite, % "Zeilen = " . Result.RowCount . "`n"
. "Stadt1 = " Result.Rows[1, 2] . " - " . "BL1 = " . Result.Rows[1, 3]
DB.CloseDB()
ExitApp
#Include SQLiteDB.ahk