2009-06-30 139 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连接建立。

相关问题