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.