Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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);
}
}
}