Я могу использовать поток, чтобы ВСТАВИТЬ или ОБНОВИТЬ строку в SQL Server (C#)? [дубликат]

5
задан Cheeso 17 March 2010 в 03:43
поделиться

1 ответ

Вы должны иметь возможность передавать экземпляр 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 работает.

7
ответ дан 14 December 2019 в 01:05
поделиться