【问题标题】:Save byte[] into a SQL Server database from C#从 C# 将 byte[] 保存到 SQL Server 数据库中
【发布时间】:2011-05-02 17:55:23
【问题描述】:

如何将 byte[] 数组保存到 SQL Server 数据库中? 这个 byte[] 包含一个 HashAlgorithm 值。

再次需要数据以供以后使用。所以转换它而不是让它回到原来的状态,不是我想要的。

提前致谢!

【问题讨论】:

    标签: c# sql-server bytearray


    【解决方案1】:

    你应该可以这样写:

    string queryStmt = "INSERT INTO dbo.YourTable(Content) VALUES(@Content)";
    
    using(SqlConnection _con = new SqlConnection(--your-connection-string-here--))
    using(SqlCommand _cmd = new SqlCommand(queryStmt, _con))
    {
       SqlParameter param = _cmd.Parameters.Add("@Content", SqlDbType.VarBinary);
       param.Value = YourByteArrayVariableHere;
    
       _con.Open();
       _cmd.ExecuteNonQuery();
       _con.Close();
    }
    

    使用 Linq-to-SQL,您可以编写如下内容:

    using(YourDataContextHere ctx = new YourDataContextHere())
    {
       SomeClassOfYours item = new SomeClassOfYours();
    
       item.ByteContent = (your byte content here);
    
       ctx.SomeClassOfYourses.InsertOnSubmit(item);
       ctx.SubmitChanges();
    }
    

    这会将您的 byte[] 作为字节流插入到 SQL Server 表中 VARBINARY 类型的列 Content 中,稍后您可以再次以 1:1 的比例读回。

    【讨论】:

    • 好答案。但是,基于该值是散列的声明,它可能是恒定长度的。如果是这样,请考虑使用具有该长度的二进制而不是 varbinary。
    • @Sean Reilly:是的 - 但不同的哈希算法也会产生不同长度的哈希,因此您可能希望使用具有合适最大长度的 VARBINARY 来适应所有变化
    • @marc_s 我将使用 linq。我必须做 SqlDbType.VarBinary 吗?
    • @Yustme:更新了我的答案以包括 Linq-to-SQL。是的,无论您以何种方式访问​​它,都需要 SQL Server 表中的 VARBINARY 列。在 Linq-to-SQL 中,它将显示为实体类中的“二进制”列,您可以像任何其他列一样设置(和读出)它。
    • @marc_s 也是如此 - 但是很可能所有行都是相同的哈希算法。如果(且仅当)是这种情况,我会坚持我的建议,使用恒定长度的二进制而不是 varbinary。
    【解决方案2】:

    使用VARBINARY

    【讨论】:

      【解决方案3】:

      Varbinary 或 CHAR - 将值转换为十六进制。我经常使用哈希值这样做,因为它让我可以轻松地查看和比较它们(在 rintouts 中,在开发过程中),而且开销很小。

      【讨论】:

        【解决方案4】:

        使用 Dapper,您可以像这样轻松保存 HTML 代码:

        using (var con = DapperConnection.Con)
        {
            string firstValue = "any text...";
            string secondValue = "HTML code maybe ?";
        
            // Convert your string into byte array:
            byte[] htmlCode = Encoding.ASCII.GetBytes(secondValue);
        
            // Define your insert query and execute it:
            con.Execute($@" INSERT INTO [dbo].[YourTableName]
                            ( [firstColumnName], [secondColumnName] )
                            VALUES
                            ( {firstValue}, COMPRESS(@HTML) )", new { HTML = htmlCode });
        }
        

        然后你可以像这样从数据库中解压它:

        SELECT [firstColumnName], CONVERT(varchar(MAX), DECOMPRESS([secondColumnName])) FROM [YourTableName];
        

        【讨论】:

        • COMPRESS 和 DECOMPRESS 是 SQL 功能还是 Dapper 功能? TIL:无论哪种方式,这实际上都非常酷。
        猜你喜欢
        • 1970-01-01
        • 2016-12-27
        • 2013-06-26
        • 1970-01-01
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多