以下にハイライトされたバイト配列がありますが、SQL ServerデータベースのVarbinary列に挿入するにはどうすればよいですか?
byte[] arraytoinsert = new byte[10]{0,1,2,3,4,5,6,7,8,9};
string sql =
string.format
(
"INSERT INTO mssqltable (varbinarycolumn) VALUES ({0});",WHATTODOHERE
);
私の解決策は、パラメーター化されたクエリを使用することです。これは、接続オブジェクトがデータの正しいフォーマットを処理するためです(正しいデータ型の確認、および該当する「危険な」文字のエスケープを含む)。
// Assuming "conn" is an open SqlConnection
using(SqlCommand cmd = new SqlCommand("INSERT INTO mssqltable(varbinarycolumn) VALUES (@binaryValue)", conn))
{
// Replace 8000, below, with the correct size of the field
cmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, 8000).Value = arraytoinsert;
cmd.ExecuteNonQuery();
}
編集:John Saundersが示唆するように、「using」ラッピング文を追加して、SqlCommandが終了した後にSqlCommandを正しく破棄する
これを試して:
"0x" + BitConverter.ToString(arraytoinsert).Replace("-", "")
もちろん、文字列の連結ではなく、パラメータ化されたクエリを使用する必要がありますが...
このシナリオで使用するすべてのアレイが、例のように小さい場合は問題ありません。
これを大きなBLOBに使用する場合(たとえば、大きなバイナリファイルを多くのMbsまたはGbsでVARBINARY
に格納する場合)、SQL Serverの特定のサポートを使用してサブセクションの読み取り/書き込みを行うことをお勧めしますそのような大きな塊の。 READTEXT
や UPDATETEXT
のようなもの、またはSQL Serverの現在のバージョンSUBSTRING
のようなもの。
詳細と例については、.NET Magazineの2006年の記事( "BLOB + Stream = BlobStream" 、オランダ語、完全なソースコード)、または英語の翻訳とこの一般化 CodeProjectで Peter de Jongheによる。これらは両方とも my weblog からリンクされています。
このような非常にシンプルで効率的な解決策を行うことができます。基本的なプレースホルダーの代わりに実際にパラメーターを使用し、SqlParameterオブジェクトを作成し、別の既存の実行メソッドを使用しました。シナリオの例:
string sql = "INSERT INTO mssqltable (varbinarycolumn) VALUES (@img)";
SqlParameter param = new SqlParameter("img", arraytoinsert); //where img is your parameter name in the query
ExecuteStoreCommand(sql, param);
オープンSQL接続が確立されていれば、これは魅力のように機能するはずです。