Debería poder pasar una instancia de SqlBytes
como un parámetro para un SqlCommand
dondequiera que un varbinary
se necesita Ese mismo SqlBytes
la clase tiene una sobrecarga de constructor que envuelve un Stream
. Así que simplemente cree un SqlBytes
instancia de la transmisión, luego páselo como el valor del parámetro.
En otras palabras, encajar eso en su código revisado, en lugar de esto:
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 esto:
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);
Por supuesto, no olvide desechar el MemoryStream
y todos estos otros IDisposable
instancias después de que se haya ejecutado el comando.
Editar:OK, acabo de ver la parte inferior de su edición, lo que implica que los datos son extremadamente grandes y no desea que terminen en la memoria, y esto en realidad no resolverá ese problema. La cuestión es que, si el valor es tan grande, es una mala idea almacenarlo en un varbinary
columna en primer lugar.
Si usa SQL Server 2008, puede (¡y debe!) usar FILESTREAM en su lugar. Esto realmente sí admitir transmisión "verdadera" en ADO.NET a través de la clase SqlFileStream.
Si no puede usar FILESTREAM
almacenamiento, entonces me temo que tendrá que lidiar con los datos en la memoria en algún momento, así es como funciona ADO.NET.