Powinieneś być w stanie przekazać instancję SqlBytes
jako parametr do SqlCommand
gdziekolwiek varbinary
jest potrzebne. Te same SqlBytes
klasa ma przeciążenie konstruktora, które otacza Stream
. Więc po prostu utwórz SqlBytes
instancję ze strumienia, a następnie przekaż ją jako wartość parametru.
Innymi słowy, dopasuj to do poprawionego kodu, zamiast tego:
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);
Użyj tego:
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);
Oczywiście nie zapomnij pozbyć się MemoryStream
i wszystkie te inne IDisposable
wystąpień po wykonaniu polecenia.
Edycja:OK, właśnie widziałem dół twojej edycji, co sugeruje, że dane są bardzo duże i nie chcesz, aby trafiły do pamięci, a to w rzeczywistości nie rozwiąże tego problemu. Chodzi o to, że jeśli wartość jest tak duża, złym pomysłem jest przechowywanie jej w varbinary
kolumna na pierwszym miejscu.
Jeśli używasz SQL Server 2008, możesz (i powinieneś!) zamiast tego użyć FILESTREAM. To faktycznie działa obsługuje "prawdziwe" strumieniowanie w ADO.NET przez klasę SqlFileStream.
Jeśli nie możesz użyć FILESTREAM
pamięci masowej, obawiam się, że w pewnym momencie będziesz musiał poradzić sobie z danymi znajdującymi się w pamięci, tak właśnie działa ADO.NET.