Vous devriez pouvoir passer une instance de SqlBytes
en tant que paramètre d'un SqlCommand
partout où un varbinary
est nécessaire. Ce même SqlBytes
la classe a une surcharge de constructeur qui encapsule un Stream
. Alors créez simplement un SqlBytes
instance du flux, puis transmettez-la comme valeur de paramètre.
En d'autres termes, intégrez cela dans votre code révisé, au lieu de ceci :
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);
Utilisez ceci :
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);
Bien sûr, n'oubliez pas de disposer du MemoryStream
et tous ces autres IDisposable
instances après l'exécution de la commande.
Edit :OK, je viens de voir le bas de votre édition, ce qui implique que les données sont extrêmement volumineuses et que vous ne voulez pas qu'elles se retrouvent en mémoire, et cela ne résoudra pas réellement ce problème. Le fait est que si la valeur est aussi grande, c'est une mauvaise idée de la stocker dans un varbinary
colonne en premier lieu.
Si vous utilisez SQL Server 2008, vous pouvez (et devriez !) utiliser FILESTREAM à la place. En fait, fait prend en charge le "vrai" streaming dans ADO.NET via la classe SqlFileStream.
Si vous ne pouvez pas utiliser FILESTREAM
stockage, alors j'ai bien peur que vous deviez gérer les données en mémoire à un moment donné, c'est à peu près ainsi que fonctionne ADO.NET.