Eine String-Liste aus einer SQLite-Datenbank lesen

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();