从 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# 保存到 SQL 中的 DATE 类型列 - Linq to SQL