Bạn sẽ có thể chuyển một bản sao của SqlBytes làm tham số cho SqlCommand bất cứ nơi nào một varbinary là cần thiết. Cũng SqlBytes đó lớp có quá tải hàm tạo bao bọc một Stream . Vì vậy, chỉ cần tạo một SqlBytes ví dụ từ luồng, sau đó chuyển nó vào dưới dạng giá trị tham số.
Nói cách khác, hãy điều chỉnh điều đó vào mã đã sửa đổi của bạn, thay vì điều này:
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);
Sử dụng cái này:
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);
Tất nhiên, đừng quên loại bỏ MemoryStream và tất cả những IDisposable khác này các trường hợp sau khi lệnh được thực thi.
Chỉnh sửa:OK, tôi vừa xem phần cuối của bản chỉnh sửa của bạn, điều này ngụ ý rằng dữ liệu cực kỳ lớn và bạn không muốn nó kết thúc trong bộ nhớ và điều này thực sự sẽ không giải quyết được vấn đề đó. Điều là, nếu giá trị lớn như vậy, thì việc lưu trữ nó trong varbinary là một ý kiến tồi. ở vị trí đầu tiên.
Nếu bạn đang sử dụng SQL Server 2008, bạn có thể (và nên!) Sử dụng FILESTREAM để thay thế. Điều này thực sự không hỗ trợ phát trực tuyến "true" trong ADO.NET thông qua lớp SqlFileStream.
Nếu bạn không thể sử dụng FILESTREAM lưu trữ, thì tôi e rằng một lúc nào đó bạn sẽ phải đối phó với việc dữ liệu trong bộ nhớ, đó là cách ADO.NET hoạt động khá nhiều.