VB.net – sqlite Datenbankanbindung – Teil 3
Im zweiten Teil wurden per Quellcode Tabellen erstellt und Daten eingefügt. Im dritten Teil nun ein paar Funktionen zum abrufen von Daten aus sqlite Tabellen.
Hierfür verwende ich mehrere Funktionen. Dies ist notwendig da einige Abfragen nur ein einziges Ergebnis liefern, andere wiederum eine komplette Tabelle. Praktischerweise speichert man solche Abfragedaten in ein Array um sie später einfacher zu verwenden.
1. NonAry Abfragen
Für den normalen Gebrauch ergeben sich so 3 unterschiedliche Abfragetypen. Möchte man zum Beispiel die Anzahl Zeilen einer Tabelle zurückgeben, so erledigt man dies mit “select count(*) from …”. Als Ergebnis erhält man eine Zahl. Als Datentyp kommt hier Integer in Frage. Für diese Art der Abfrage baut man sich eine Funktion welche als Rückgabe eine Ergebnis liefert. Dies sieht wie folgt aus:
Public Function func_sql_one_res(sub_sql as String)
Dim sub_result As String
Dim i As Int16
'cmd erstellen, abfrage zuweisen
sqlite_cmd = sqlite_connect.CreateCommand
sqlite_cmd.CommandText = sub_sql
'abfrage ausführen
dim sqlreader as SQLiteDataReader = sqlite_cmd.ExecuteReader()
'daten übergeben
sub_result = sqlreader(0)
'rückgabe des strings
return sub_result
End Function
Eventuell möchte man nicht nur die Anzahl Zeilen abfragen, sondern eine Zeichenkette, so ist die interne Variable vom Typ String erforderlich. Bei der Rückgabe aus der Funktion an eine Variable, kann man mit “cint” zum Beispiel das Ergebnis in Integer wandeln.
Die Anzahl Zeilen in der Personendaten Tabelle ruft man entsprechend mit “Count” ab.
Dim count_personal as Int64
'sql abfrage erstellen
sqlite_string = "select count(*) from Personen"
'sql abfrage ausführen, rückgabe in var speichern
count_personal = cint(func_sql_one_res(sqlite_string))
2. Eindimensionale Abfragen
Eine Abfrage welche als Beispiel, die verschiedenen Städte in der Personen Tabelle liefert, kann nicht mit der ersten Funktion ermittelt werden. Das Ergebnis kann mehre Städte enthalten und somit ist es notwendig ein 1D Array einzusetzen.
Public Function func_sql_1d_ary(sub_sql As String)
'ary erstellen
Dim sub_ary(1000) As String
Dim sub_internal_counter As Int64 = 0
'cmd erstellen, abfrage zuweisen
sqlite_cmd = sqlite_connect.CreateCommand
sqlite_cmd.CommandText = sub_sql
'abfrage ausführen
dim sqlreader as SQLiteDataReader = sqlite_cmd.ExecuteReader()
'ary füllen
While sqlreader.Read()
sub_ary(sub_internal_counter) = sqlreader(0)
sub_internal_counter += 1
End While
'rückgabe des arys
Return sub_ary
End Function
Über den Internal Counter werden die einzelnen Ergebnisse in das Array gespeichert beginnend mit 0. Der Aufruf geschieht analog der ersten Funktion, nur das hier ein Array übergeben wird.
Dim ary_staedte() as String
'sql abfrage erstellen
sqlite_string = "select distinct ort from Personen"
'sql abfrage ausführen, rückgabe in var speichern
ary_steadte = func_sql_1d_ary(sqlite_string)
3. Zweidimensionale Abfragen
Nun wird es interessant. Möchte man nun die komplette Personentabelle auslesen, um anschließend die gelesenen Daten in einer Listview darzustellen, ist ein 2D Array notwendig. Ein 2D Array ist nichts anderes als zum Beispiel eine Excel Tabelle. Es gibt Spalten und Zeilen und nach diesen Schema ist sowohl unsere Personen Tabelle aufgebaut als auch das Array welches befüllt werden soll.
Auf die 2D Abfrage gehen ich etwas näher ein:
Public Function func_sql_ary(sub_sql As String,sub_sql_count as String
Die Funktion benötigt 2 Parameter, der Abfrage String (Daten) und den Count String (Anzahl Datensätze).
Dim sub_internal_counter As Int64
Dim sub_anzahl_rows as Int64
Dim i As Int16
Interne Variablen
sub_anzahl_rows = func_sql_one(sub_sql_count)
Anzahl der Datensätze über die NonAry Abfrage ermitteln
sqlite_cmd = sqlite_connect.CreateCommand
sqlite_cmd.CommandText = sub_sql
Command erstellen
dim sqlreader as SQLiteDataReader = sqlite_cmd.ExecuteReader()
Abfrage ausführen
Dim sub_ary(sub_anzahl_rows, sqlreader.FieldCount -1) as String
Array erstellen aus Anzahl der Datensätze und Anzahl der Felder
While sqlreader.Read()
For i = 0 To sqlreader.FieldCount -1
sub_ary(sub_internal_counter, i ) = sqlreader(i)
Next
sub_internal_counter += 1
End While
Über die While Schleife wird Abfrage abgearbeitet. Innerhalb dieser wird mit der For Schleife die Anzahl der Felder im Array Zeile für Zeile das Array gefüllt.
sub_internal_counter = Anzahl Datensätze
sqlreader.FieldCount = Anzahl Felder
Return sub_ary
Rückgabe des Arrays
Aufruf erfolgt mit 2 Sql Strings.
Dim act_result(,) as String
sqlite_string = "select per_name, per_corname, per_strasse, per_plz, per_ort from personen"
sqlite_string_count = "select count(*) from personen"
act_result = func_sql_ary(sqlite_string, sqlite_string_count)
Die komplette Personen Tabelle befindet sich nun im 2D Array act_result.
Das Array ist wie folgt gefüllt:
act_result(0,0) = Zeile 1, Feld 1 ‘Name
act_result(0,0) = Zeile 1, Feld 2 ‘Vorname
act_result(0,0) = Zeile 1, Feld 3 ‘Strasse
act_result(0,0) = Zeile 1, Feld 4 ‘PLZ
act_result(0,0) = Zeile 1, Feld 5 ‘Ort
act_result(1,0) = Zeile 2, Feld 1 ‘Name
act_result(1,0) = Zeile 2, Feld 2 ‘Vorname
…
Nun viel Spaß mit Sqlite.
While sqlreader.Read()
For i = 0 To sqlreader.FieldCount -1
sub_ary(sub_internal_counter, i ) = sqlreader(i)
Next
sub_internal_counter += 1
End While
Das ist extrem langsam. Das hat mit 160 Datensätzen jetzt gute Sekunden gedauert. Ich würde die Spalten in ein DataTable packen:
dim spalten as DataTable
While SQLreader.Read()
Dim newDR As DataRow = spalten.NewRow
newDR.Item(“spalte1”) = SQLreader(“spalte1”)
newDR.Item(“spalte2”) = SQLreader(“spalte2”)
spalten.Rows.Add(newDR)
End While
Ist auf jeden Fall perfomanter. Aber danke, das Tut hat mich weiter gebracht!
Ich hatte keine Probleme mit der Performance, ich lese eine Traffic Tabelle meiner Netzwerkkarte aus und diese hat paar tausend Zeilen. Aber ich werde mir das mit der DataTable mal anschauen.
Schön das dir das Tutorial helfen konnte, ich hatte vorher auch rumgegoogelt und nur ungenaue Tuts gefunden, deswegen entschied ich mich vb.net und sqlite mal etwas näher zu beschreiben.
Teil3 – Zeile 3 – Leztes wort , RECHTSCHREIBFEHLER