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の動作とほぼ同じです。