Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Remarque
La classe SqliteBlob a été ajoutée dans la version 3.0.
Vous pouvez réduire l’utilisation de la mémoire lors de la lecture et de l’écriture d’objets volumineux en transmettant les données en flux vers et depuis la base de données. Cela peut être particulièrement utile lors de l’analyse ou de la transformation des données.
Commencez par insérer une rangée comme d'habitude. Utilisez la fonction SQL pour allouer de l’espace zeroblob()
dans la base de données pour contenir l’objet volumineux. La fonction last_insert_rowid()
offre un moyen pratique d’obtenir son 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();
Après avoir inséré la ligne, ouvrez un flux pour écrire l’objet volumineux à l’aide de 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);
}
Pour diffuser l’objet volumineux hors de la base de données, vous devez sélectionner le rowid ou l’un de ses alias, comme indiqué ici en plus de la colonne de l’objet volumineux. Si vous ne sélectionnez pas le rowid, l’objet entier sera chargé en mémoire. L'objet retourné par GetStream()
sera un SqliteBlob
lorsque cela sera correctement terminé.
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);
}
}
}