Ibr*_*ady 4 c# sql sql-server asp.net varbinary
我正在尝试将此字节数组插入到 SQL Server 数据库中,列数据类型是varbinary,这是我在 C# 中的代码
SqlParameter param = new SqlParameter("@buffer", SqlDbType.VarBinary, 8000);
param.Value = buffer;
string _query = "INSERT INTO [dbo].[Files] (FileID, Data, Length) VALUES ('" + uID + "','" + buffer + "','" + buffer.Length + "')";
using (SqlCommand comm = new SqlCommand(_query, conn))
{
comm.Parameters.Add(param);
try
{
conn.Open();
comm.ExecuteNonQuery();
}
catch (SqlException ex)
{
return Request.CreateResponse(HttpStatusCode.OK, "Something went wrong : " + ex.Message);
}
finally
{
conn.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
我也在字符串@buffer内部_query而不是缓冲区中尝试过,但我不断收到错误消息:
不允许从 varchar 转换为 varbinary 使用 CONVERT 命令来执行此查询
我使用Convert并成功保存,但是当我检索它时,它仅检索前 14 个字节,
byte[] bytearr = (byte[])row["Data"];
Run Code Online (Sandbox Code Playgroud)
我一直在寻找,什么也没找到。你能帮我存储字节并检索它吗?
您可以在 SQL 查询中将值作为文字发送。这是一个坏主意,但首先是您的查询问题:
一个VARBINARY文字在SQL Server是不是一个字符串(引号括起来),但一个非常大的十六进制数字,看起来像这个例子:SET @binary = 0x1145A5B9C98。
顺便说一句,我觉得奇怪的是,您将 ID 和 Length 也用引号括起来。我假设它们是整数,因此应该不带引号指定它们:SET @i = 2. 它可能仍然适用于您的情况,因为该字符串将被 SQL Server 动态转换为整数。这只是令人困惑且效率较低。
现在,请永远不要通过连接这样的文字来执行 SQL 请求。请改用 SQL 参数。类似的东西:
cmd.CommandText = "INSERT INTO Files (FileId, Data, Length) VALUES (@id, @data, @length)";
cmd.Parameters.AddWithValue("id", 3);
cmd.Parameters.AddWithValue("data", someByteArray);
cmd.Parameters.AddWithValue("length", someByteArray.Length);
Run Code Online (Sandbox Code Playgroud)
如果您想更简单,请查看一些帮助程序。我推荐Dapper。
最后,我注意到您同时存储了 varbinary 及其长度。这不是必需的,您始终可以像这样获取存储在 SQL Server 中的 varbinary 的长度:SELECT LEN(Data) FROM Files