Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
La clase SqliteBlob se agregó en la versión 3.0.
Puede reducir el uso de memoria al leer y escribir objetos grandes mediante el streaming de los datos dentro y fuera de la base de datos. Esto puede ser especialmente útil al analizar o transformar los datos.
Empiece insertando una fila como normal. Use la zeroblob()
función SQL para asignar espacio en la base de datos para contener el objeto grande. La función last_insert_rowid()
proporciona un método cómodo de obtener el 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();
Después de insertar la fila, abra una secuencia para escribir el objeto grande 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);
}
Para transmitir el objeto grande fuera de la base de datos, hay que seleccionar ROWID o uno de sus alias como se muestra aquí, además de la columna del objeto grande. Si no se selecciona el ROWID, se cargará en la memoria el objeto entero. El objeto devuelto por GetStream()
será un SqliteBlob
si se hace correctamente.
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);
}
}
}