2009-06-30 71 views
59

バイト配列が下にハイライトされていますが、SQL ServerデータベースのVarbinary列に挿入するにはどうすればよいですか?SQL ServerのVARBINARY列にByte []を挿入する方法

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 
    ); 

ありがとうございました!

答えて

69

私のソリューションは、接続オブジェクトとして、パラメータ化クエリを使用することです(該当する「危険」の文字を正しいデータ型を確実に含めて、エスケープ)データを正しくフォーマットするの世話をする:

// 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(); 
} 

編集:これで終了した後、Sambaの提案した "using"ステートメントを使用してSqlCommandを正しく処理しました

+3

Jason、「SqlCommand cmd = new ...」の前後にusingステートメントを入れてください。さもなければ、私はdownvoteに義務付けられていると感じ、その嫌いだ。 –

+11

列がVARBINARY(MAX)の場合は、8000を-1に置き換えます(http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/e61f0616-0866-4f3f-aeba-6a76e144e169/を参照)。 –

74

これを試してください:あなたは本当に当然の文字列の連結ではなく、パラメータ化クエリを使用する必要がありますが

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

...

+0

こんにちはDavid、答えてくれてありがとう、私はパラメータ化されたクエリを使うべきですか? – divinci

+4

ここでは最小ですが、パラメータ化されたクエリをコンパイルしてキャッシュすることができ、後続のクエリごとにコンパイルのコストを節約できます。また、SQLインジェクション攻撃から保護します。最後に、パラメータの値を直接バイト配列に設定し、BitConverterの要素を避けることができます。 –

+0

VARBINARIESでの作業は一般的には良い考えです。 SQL Serverでは非常に大きなVARBINARIES(2 Gbでしたか?)が許可されています。この特定のケースでこれが問題になるかどうか評価することはできないので、今は-1を外しています。 – peSHIr

1

このシナリオで使用しようとしている配列がすべてあなたの例のように小さい場合は問題ありません。

大規模なバイブラムにこれを使用する場合(たとえば、大量のバイナリファイルを多くのMbsまたはGBSのサイズをVARBINARYに格納する場合)、SQL Serverの特定のサポートを使用して、そのような大きな斑点。 READTEXTおよびUPDATETEXTのようなもの、または現在のバージョンのSQL Server SUBSTRINGなどです。

詳細については、.NET Magazine("BLOB + Stream = BlobStream"、オランダ語、完全なソースコード)のmy 2006記事、またはPeter de Jongheのon CodeProjectの英語翻訳と一般化を参照してください。どちらもmy weblogからリンクされています。

0

チェックすべてのためのこの画像リンクは https://drive.google.com/open?id=0B0-Ll2y6vo_sQ29hYndnbGZVZms

STEP1ステップ:私は、テーブルにvarbinary型のフィールドを作成し

STEP2:私は型sql_variant型のパラメータを受け入れるようにストアドプロシージャを作成し

STEP3:フロントエンドのasp.netページで、オブジェクト型のSQLデータソースパラメータ

を作成しました。
 <tr> 
     <td> 
      UPLOAD DOCUMENT</td> 
     <td> 
      <asp:FileUpload ID="FileUpload1" runat="server" /> 
      <asp:Button ID="btnUpload" runat="server" Text="Upload" /> 
      <asp:SqlDataSource ID="sqldsFileUploadConn" runat="server" 
       ConnectionString="<%$ ConnectionStrings: %>" 
       InsertCommand="ph_SaveDocument"  
       InsertCommandType="StoredProcedure"> 
       <InsertParameters> 
        <asp:Parameter Name="DocBinaryForm" Type="Object" /> 
       </InsertParameters> 

      </asp:SqlDataSource> 
     </td> 
     <td> 
      &nbsp;</td> 
    </tr> 

STEP 4:私のコードでは背後に、私はあなたがこのような何かを行うことができますSQLデータソースコントロール

 Dim filebytes As Object 
     filebytes = FileUpload1.FileBytes() 
     sqldsFileUploadConn.InsertParameters("DocBinaryForm").DefaultValue = filebytes.ToString 
     Dim uploadstatus As Int16 = sqldsFileUploadConn.Insert() 

       ' ... code continues ... ' 
0

を使用してこのストアドプロシージャの呼び出しを経由するFileUploadコントロールからFileBytesをアップロードしようと、非常にシンプルかつ効率的なソリューション: 私が実際に行ったことは、基本的なプレースホルダの代わりにパラメータを使用し、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接続が確立されている場合は、これは魅力的な働きをします。

関連する問題