【问题标题】:How Do I Insert a Byte[] Into an SQL Server VARBINARY Column如何将 Byte[] 插入 SQL Server VARBINARY 列
【发布时间】:2009-06-30 14:54:36
【问题描述】:

我在下面突出显示了一个字节数组,如何将它插入到 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
    );

【问题讨论】:

    标签: arrays sql-server


    【解决方案1】:

    试试这个:

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

    虽然您当然应该使用参数化查询而不是字符串连接...

    【讨论】:

    • 嗨,David,感谢您的回答,我为什么要使用参数化查询?
    • 这里最小化,但是参数化查询可以被编译然后缓存,节省每个后续查询的编译成本。它们还可以防止 SQL 注入攻击。最后,你可以直接将参数的值设置为字节数组,避免BitConverter的东西......
    • 不要认为像这样使用 VARBINARIES 通常是个好主意。 SQL Server 允许非常大的 VARBINARIES(它是 2 Gb 吗?),并且使用这种方法可能不会“很好地扩展”。无法评估在这种特殊情况下这是否会成为问题,所以我暂时不使用 -1。
    • 终于回答了这个问题,而不是“你应该使用参数..”不使用参数是有原因的——例如超过单个查询中的 2,100 个参数。
    • +1 抵消@peSHIr。 OP 没有提到大文件的可扩展性,它在文本查询中询问了WHATTODOHERE
    【解决方案2】:

    我的解决方案是使用参数化查询,因为连接对象负责正确格式化数据(包括确保正确的数据类型,并在适用的情况下转义“危险”字符):

    // 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 完成后正确处理它

    【讨论】:

    【解决方案3】:

    如果您将在此场景中使用的所有数组都像您的示例中那样小,那么没问题。

    如果您将其用于大型 blob(例如,将大小为数 Mb 甚至 Gbs 的大型二进制文件存储到 VARBINARY 中),那么您可能最好使用 SQL Server 中的特定支持来读取/写入小节这么大的斑点。诸如READTEXTUPDATETEXT 之类的东西,或者在当前版本的SQL Server 中SUBSTRING

    有关更多信息和示例,请参阅我在 .NET 杂志上发表的 2006 年文章("BLOB + Stream = BlobStream",荷兰语,附有完整的源代码),或 Peter de Jonghe 对 on CodeProject 的英文翻译和概括。这两个链接都来自my weblog

    【讨论】:

      【解决方案4】:

      您可以这样做,非常简单有效的解决方案: 我所做的实际上是使用参数而不是基本占位符,创建了一个 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 连接,这应该会像一个魅力一样工作。

      【讨论】:

        【解决方案5】:

        查看此图片链接了解所有步骤 https://drive.google.com/open?id=0B0-Ll2y6vo_sQ29hYndnbGZVZms

        第 1 步:我在表中创建了一个 varbinary 类型的字段

        第 2 步:我创建了一个存储过程来接受 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>
        

        第 4 步:在后面的代码中,我尝试使用 sql 数据源控件通过此存储过程调用从 FileUpload 控件上传 FileBytes

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

        【讨论】:

          猜你喜欢
          • 2017-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-01
          • 2017-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多