Трябва да можете да предавате екземпляр от SqlBytes
като параметър към SqlCommand
където и да е varbinary
е необходимо. Същият SqlBytes
class има претоварване на конструктора, което обвива 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.