sql >> データベース >  >> RDS >> Sqlserver

ストリームを使用してSQLServer(C#)の行を挿入または更新できますか?

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



    1. Room API-最近挿入されたエンティティの生成されたIDを取得する方法は?

    2. cursor.execute(INSERT INTO im_entry.test(+ entrym +)VALUES('+ p +');)

    3. SQLiteAssetHelperでバージョン番号に+を使用しないようにする方法

    4. エラーコード:1215。外部キー制約を追加できません(外部キー)