从 C# 将 byte[] 保存到 SQL Server 数据库中

Posted

技术标签:

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

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

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

提前致谢!

【问题讨论】:

【参考方案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:无论哪种方式,这实际上都非常酷。

以上是关于从 C# 将 byte[] 保存到 SQL Server 数据库中的主要内容,如果未能解决你的问题,请参考以下文章

图片保存到数据库以及C#读取图片

从 C# 保存到 SQL 中的 DATE 类型列 - Linq to SQL

获取 REST API 数据并使用 C# 将它们保存到 SQL 表中

在 C# 中播放 byte[] [关闭]

UWP 文件缩略图保存在 SQL Server 数据库中

将字节数组从服务器传输到浏览器