Wejścia/wyjścia Blob

Uwaga / Notatka

Klasa SqliteBlob została dodana w wersji 3.0.

Użycie pamięci można zmniejszyć podczas odczytywania i zapisywania dużych obiektów, przesyłając strumieniowo dane do i z bazy danych. Może to być szczególnie przydatne podczas analizowania lub przekształcania danych.

Zacznij od wstawienia wiersza w zwykły sposób. zeroblob() Użyj funkcji SQL, aby przydzielić miejsce w bazie danych do przechowywania dużego obiektu. Funkcja last_insert_rowid() zapewnia wygodny sposób uzyskiwania identyfikatora wiersza.

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

Po wstawieniu wiersza otwórz strumień, aby zapisać duży obiekt przy użyciu polecenia SqliteBlob.

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

Aby przesłać strumieniowo duży obiekt z bazy danych, jak pokazano tutaj, należy wybrać zarówno identyfikator wiersza lub jeden z jego aliasów, jak i kolumnę dużego obiektu. Jeśli nie wybierzesz identyfikatora wiersza, cały obiekt zostanie załadowany do pamięci. Obiekt zwrócony przez GetStream() będzie SqliteBlob, jeśli zostanie to wykonane poprawnie.

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