Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Posso usar um fluxo para INSERT ou UPDATE uma linha no SQL Server (C#)?


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.