Freigeben über


Blob-E/A

Hinweis

Die SqliteBlob-Klasse wurde in Version 3.0 hinzugefügt.

Sie können die Speicherauslastung beim Lesen und Schreiben großer Objekte reduzieren, indem Sie die Daten in die und aus der Datenbank streamen. Dies kann besonders nützlich sein, wenn die Daten analysiert oder transformiert werden.

Beginnen Sie, indem Sie eine Zeile normal einfügen. Verwenden Sie die zeroblob() SQL-Funktion, um Platz in der Datenbank zuzuweisen, um das große Objekt zu speichern. Die last_insert_rowid()-Funktion ist eine gute Möglichkeit, den ROWID-Wert abzurufen.

var insertCommand = connection.CreateCommand();
insertCommand.CommandText =
@"
    INSERT INTO data(value)
    VALUES (zeroblob($length));

    SELECT last_insert_rowid();
";
insertCommand.Parameters.AddWithValue("$length", inputStream.Length);
var rowid = (long)insertCommand.ExecuteScalar();

Öffnen Sie nach dem Einfügen der Zeile einen Datenstrom, um das große Objekt mit SqliteBlob zu schreiben.

using (var writeStream = new SqliteBlob(connection, "data", "value", rowid))
{
    // NB: Although SQLite doesn't support async, other types of streams do
    await inputStream.CopyToAsync(writeStream);
}

Sie können das Large Object aus der Datenbank streamen, indem Sie wie hier veranschaulicht den ROWID-Wert oder einen der zugehörigen Aliase neben der Spalte des Large Object auswählen. Wenn Sie den ROWID-Wert nicht auswählen, wird das gesamte Objekt in den Arbeitsspeicher geladen. Das von GetStream() zurückgegebene Objekt wird ein SqliteBlob sein, wenn es korrekt durchgeführt wird.

var selectCommand = connection.CreateCommand();
selectCommand.CommandText =
@"
    SELECT id, value
    FROM data
    LIMIT 1
";
using (var reader = selectCommand.ExecuteReader())
{
    while (reader.Read())
    {
        using (var readStream = reader.GetStream(1))
        {
            await readStream.CopyToAsync(outputStream);
        }
    }
}