SqlBytes
のインスタンスを渡すことができるはずです SqlCommand
へのパラメータとして varbinary
はどこでも が必要です。同じSqlBytes
クラスには、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を使用できます(使用する必要があります)。これは実際には SqlFileStreamクラスを介したADO.NETでの「真の」ストリーミングをサポートします。
FILESTREAM
を使用できない場合 ストレージの場合、ある時点でメモリ内にあるデータを処理する必要があるのではないかと思います。これがADO.NETの動作とほぼ同じです。