sql >> Base de Datos >  >> RDS >> Sqlserver

¿Puedo usar una secuencia para INSERTAR o ACTUALIZAR una fila en SQL Server (C#)?

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 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.