Dovresti essere in grado di passare un'istanza di SqlBytes
come parametro per un SqlCommand
ovunque una varbinary
è necessario. Lo stesso SqlBytes
class ha un sovraccarico del costruttore che esegue il wrapping di un Stream
. Quindi crea semplicemente un SqlBytes
istanza dal flusso, quindi passalo come valore del parametro.
In altre parole, inserendolo nel codice rivisto, invece di questo:
MemoryStream _MemoryStream = new System.IO.MemoryStream();
_Image.Save(_MemoryStream, _ImageFormat);
SqlParameter _SqlParameter = new
SqlParameter("@" + _ImageFieldName, SqlDbType.Image);
_SqlParameter.Value = _MemoryStream.ToArray();
_SqlCommand.Parameters.Add(_SqlParameter);
Usa questo:
MemoryStream _MemoryStream = new System.IO.MemoryStream();
_Image.Save(_MemoryStream, _ImageFormat);
_MemoryStream.Position = 0; // I *think* you need this
SqlParameter _SqlParameter = new
SqlParameter("@" + _ImageFieldName, SqlDbType.VarBinary);
_SqlParameter.Value = new SqlBytes(_MemoryStream);
_SqlCommand.Parameters.Add(_SqlParameter);
Naturalmente, non dimenticare di smaltire il MemoryStream
e tutti questi altri IDisposable
istanze dopo l'esecuzione del comando.
Modifica:OK, ho appena visto la parte inferiore della tua modifica, il che implica che i dati sono estremamente grandi e non vuoi che finiscano in memoria, e questo in realtà non risolverà il problema. Il fatto è che, se il valore è così grande, è una cattiva idea salvarlo in un varbinary
colonna in primo luogo.
Se stai usando SQL Server 2008, puoi (e dovresti!) usare invece FILESTREAM. Questo in realtà fa supporta lo streaming "vero" in ADO.NET tramite la classe SqlFileStream.
Se non puoi utilizzare FILESTREAM
storage, quindi temo che prima o poi dovrai fare i conti con i dati in memoria, più o meno è così che funziona ADO.NET.