web-dev-qa-db-ja.com

Byte []をSQL Server VARBINARY列に挿入する方法

以下にハイライトされたバイト配列がありますが、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
    );
61
divinci

私の解決策は、パラメーター化されたクエリを使用することです。これは、接続オブジェクトがデータの正しいフォーマットを処理するためです(正しいデータ型の確認、および該当する「危険な」文字のエスケープを含む)。

// 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を正しく破棄する

71
Jason Musgrove

これを試して:

"0x" + BitConverter.ToString(arraytoinsert).Replace("-", "")

もちろん、文字列の連結ではなく、パラメータ化されたクエリを使用する必要がありますが...

79
David M

このシナリオで使用するすべてのアレイが、例のように小さい場合は問題ありません。

これを大きなBLOBに使用する場合(たとえば、大きなバイナリファイルを多くのMbsまたはGbsでVARBINARYに格納する場合)、SQL Serverの特定のサポートを使用してサブセクションの読み取り/書き込みを行うことをお勧めしますそのような大きな塊の。 READTEXTUPDATETEXT のようなもの、またはSQL Serverの現在のバージョンSUBSTRINGのようなもの。

詳細と例については、.NET Magazineの2006年の記事( "BLOB + Stream = BlobStream" 、オランダ語、完全なソースコード)、または英語の翻訳とこの一般化 CodeProjectで Peter de Jongheによる。これらは両方とも my weblog からリンクされています。

1
peSHIr

このような非常にシンプルで効率的な解決策を行うことができます。基本的なプレースホルダーの代わりに実際にパラメーターを使用し、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接続が確立されていれば、これは魅力のように機能するはずです。

0
Talha Imam