2009-06-30 132 views
59

我有一個字節數組突出顯示在下面,如何將它插入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 
    ); 

在此先感謝你們!

回答

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

編輯:添加John Saunders建議的包裝「使用」語句,以在完成後正確處理SqlCommand

74

試試這個:

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

雖然你確實應該使用參數化查詢,而不是當然的字符串連接...

+0

嗨大衛,謝謝你的答案,爲什麼我應該使用參數化查詢? – divinci 2009-06-30 15:03:44

+4

這裏最小,但參數化查詢可以被編譯,然後被緩存,從而節省每個後續查詢的編譯成本。他們還可以防止SQL注入攻擊。最後,你可以直接將參數的值設置爲字節數組,避免使用BitConverter的東西... – 2009-06-30 15:58:16

1

如果您在此場景中要使用的所有陣列都像您的示例中一樣小。

如果您將此用於大塊(例如,將大量的二進制文件存儲到大小爲VARBINARY的大型二進制文件中),那麼您可能會更好地使用SQL Server中的特定支持來讀取/如此大的斑點。比如READTEXTUPDATETEXT,或者在當前版本的SQL Server SUBSTRING中。

欲瞭解更多信息和示例,請參閱我在2006年的.NET雜誌("BLOB + Stream = BlobStream",荷蘭語,具有完整的源代碼)中的文章,或Peter de Jonghe對此on CodeProject的英文翻譯和概括。這兩個鏈接都來自my weblog

0

檢查這個圖像鏈接的所有步驟 https://drive.google.com/open?id=0B0-Ll2y6vo_sQ29hYndnbGZVZms

STEP1:我在表中創建類型VARBINARY的領域

STEP2:我創建了一個存儲過程來接受sql_variant類型的參數

第3步:以我前端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> 

步驟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連接建立。

相關問題