In meinem C#-Projekt verwende ich die SQLite-net-Bibliothek als NuGet-Paket.
Leider gibt es wohl keinen einfachen Weg, ohne gemappte Model-Klassen zu arbeiten. Also mal geschwind so was hier geht nicht:
List<string> values = connection.Query<string>("SELECT `Value` FROM `Settings`");
Dank dieses GitHub-Postings habe ich dann doch eine Lösung gefunden und für mich angepasst:
public static List<object[]> Query(
this SQLiteConnection connection,
string query,
params object[] args)
{
var cmd = connection.CreateCommand(query, args);
return executeUntypedQuery(connection, cmd).ToList();
}
Mit der Hilfsfunktion:
private static IEnumerable<object[]> executeUntypedQuery(
SQLiteConnection connection,
SQLiteCommand command)
{
var stmt = SQLite3.Prepare2(connection.Handle, command.CommandText);
var cols = SQLite3.ColumnCount(stmt);
try
{
while (SQLite3.Step(stmt) == SQLite3.Result.Row)
{
var result = new object[cols];
for (var i = 0; i < cols; i++)
{
var colType = SQLite3.ColumnType(stmt, i);
switch (colType)
{
case SQLite3.ColType.Integer:
result[i] = SQLite3.ColumnInt(stmt, i);
break;
case SQLite3.ColType.Text:
result[i] = SQLite3.ColumnString(stmt, i);
break;
case SQLite3.ColType.Float:
result[i] = SQLite3.ColumnDouble(stmt, i);
break;
case SQLite3.ColType.Blob:
result[i] = SQLite3.ColumnBlob(stmt, i);
break;
case SQLite3.ColType.Null:
break;
}
}
yield return result;
}
}
finally
{
SQLite3.Finalize(stmt);
}
}
Die Query
-Funktion gibt hierbei eine Liste von Zeilen mit je einem object[]
der einzelnen Spalten zurück.
Anwendungsbeispiel:
Um es konkret in eine String-Liste umzuwandeln könnte es dann z.B. so angewendet werden:
var l = _db.Conn.Query(sql).Select(row => row.FirstOrDefault()?.ToString()).ToList();