Ho una tabella di SQL Server 2012 che contiene record di file. Ogni record ha una colonna varbinary(max)
BlobData
che rappresenta i dati memorizzati nel file - la dimensione dei dati può essere superiore a 1 GB e non può essere inserita nella RAM, quindi non voglio che sia supportata da un array di byte. Vorrei implementare due operazioni di streaming:
BlobData
in blocchi in un buffer; BlobData
in blocchi mediante un buffer. Utilizzando ADO.NET semplice, un modo semplice per raggiungere questo obiettivo è utilizzare SqlDataReader
e UPDATE .WRITE()
:
// 1. Sequentially read varbinary(max) into a buffer
using (SqlDataReader reader = sqlCommand.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
{
while (reader.Read())
{
byte[] buffer = new byte[size];
while ((count = reader.GetBytes(0, offset, buffer, 0, buffer.Length)) > 0)
{
DoStuffWithBuffer(buffer);
offset += count;
}
}
}
// 2. Sequentially overwrite varbinary(max) from a buffer - iterate:
UPDATE [File] SET [BlobData].WRITE(@buffer, @offset, @count)
WHERE [FileID]=@id
Da quello che so, tali operazioni non erano nell'ambito di EF in passato e la mia scommessa migliore sarebbe semplicemente attenermi ad ADO.NET. Tuttavia, ho notato che EF6 ha alcuni nuovi metodi come EntityDataReader.GetBytes()
che, per citare MSDN , Â »legge un flusso di byte dalla colonna specificata, a partire dalla posizione indicata da dataIndex, nel buffer, a partire dal posizione indicata da bufferIndex «.
La mia comprensione è che EntityDataReader.GetBytes()
è simile a SqlDataReader.GetBytes()
e dovrebbe offrire prestazioni approssimativamente simili - sono corretto o ci sono altre considerazioni?
Esiste un modo in EF6 per eseguire un'operazione simile a UPDATE .WRITE(buffer, offset, count)
su una colonna varbinary(max)
?
Altre parti della mia soluzione usano EF6, quindi per motivi di coerenza mi piacerebbe idealmente implementare tutto questo usando anche EF6.
Alla luce delle nuove funzionalità di EF6, posso / dovrei implementare questa funzionalità usando EF6 o devo attenermi ad ADO.NET come è stato suggerito in passato? Sto usando .NET 4.0.
Forse un po 'tardi, ma context.Database.ExecuteSqlCommand accetta i flussi come parametri, es
var id = 1234;
var blobStream = await someSource.ReadAsStreamAsync(); // obtain some stream
db.Database.ExecuteSqlCommand($"UPDATE MyTable set BlobColumn=@p0
where Id=@p1", blobStream, id);