Você deve ser capaz de passar uma instância de
SqlBytes
como um parâmetro para um SqlCommand
onde quer que um varbinary
é preciso. Esse mesmo SqlBytes
classe tem uma sobrecarga de construtor que envolve um Stream
. Então, basta criar um SqlBytes
instância do fluxo e, em seguida, passe isso como o valor do parâmetro. Em outras palavras, encaixando isso em seu código revisado, em vez disso:
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 isto:
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);
Claro, não se esqueça de descartar o
MemoryStream
e todos esses outros IDisposable
instâncias após a execução do comando. Edit:OK, acabei de ver a parte inferior da sua edição, o que implica que os dados são extremamente grandes e você não quer que eles acabem na memória, e isso não resolverá esse problema. O problema é que, se o valor for tão grande, é uma má ideia armazená-lo em um
varbinary
coluna em primeiro lugar. Se estiver usando o SQL Server 2008, você pode (e deve!) usar FILESTREAM. Isso realmente faz suportam streaming "verdadeiro" no ADO.NET por meio da classe SqlFileStream.
Se você não pode usar
FILESTREAM
armazenamento, então temo que você tenha que lidar com os dados que estão na memória em algum momento, é assim que o ADO.NET funciona.