Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
La classe SqliteBlob è stata aggiunta nella versione 3.0.
È possibile ridurre l'utilizzo della memoria durante la lettura e la scrittura di oggetti di grandi dimensioni trasmettendo i dati all'interno e all'esterno del database. Ciò può essere particolarmente utile durante l'analisi o la trasformazione dei dati.
Iniziare inserendo una riga come di consueto. Usare la zeroblob() funzione SQL per allocare spazio nel database per contenere l'oggetto di grandi dimensioni. La last_insert_rowid() funzione fornisce un modo pratico per ottenere il relativo rowid.
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();
Dopo aver inserito la riga, aprire un flusso per scrivere l'oggetto di grandi dimensioni usando 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);
}
Per trasmettere l'oggetto di grandi dimensioni al di fuori del database, è necessario selezionare il rowid o uno dei relativi alias, come illustrato di seguito oltre alla colonna dell'oggetto di grandi dimensioni. Se non si seleziona il rowid, l'intero oggetto verrà caricato in memoria. L'oggetto restituito da GetStream() sarà un oggetto SqliteBlob quando viene eseguito correttamente.
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);
}
}
}