Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Puis-je utiliser un flux pour INSÉRER ou METTRE À JOUR une ligne dans SQL Server (C#) ?

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.