Вы должны иметь возможность передавать экземпляр SqlBytes
в качестве параметра SqlCommand
везде, где требуется varbinary
. Тот же самый класс SqlBytes
имеет перегрузку конструктора , которая обертывает Stream
. Поэтому просто создайте экземпляр SqlBytes
из потока, а затем передайте его в качестве значения параметра.
Другими словами, вписывая это в свой измененный код, вместо этого:
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);
Используйте это:
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);
Конечно, не забудьте удалить MemoryStream
и все остальные ] IDisposable
экземпляров после выполнения команды.
Редактировать: Хорошо, я только что видел нижнюю часть вашего редактирования, которое подразумевает, что данные очень большие, и вы не хотите, чтобы они попадали в память, и это не решит эту проблему. Дело в том, что если значение такое большое, хранить его в столбце varbinary
- плохая идея.
Если вы используете SQL Server 2008, вы можете (и должны!) Использовать вместо него FILESTREAM . Этот действительно поддерживает «истинную» потоковую передачу в ADO.NET через класс SqlFileStream .
Если вы не можете использовать хранилище FILESTREAM
, то я боюсь, что вам придется иметь дело с данными, находящимися в памяти в какой-то момент времени, это в значительной степени то, как ADO.NET работает.