将字节数组从 C# 插入 SQL Server 以及如何检索它
本文关键字:何检索 检索 Server 数组 字节数 字节 SQL 插入 | 更新日期: 2023-09-27 17:55:23
>我正在尝试将此字节数组插入 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();
}
}
我也尝试使用_query
字符串内的@buffer
而不是缓冲区,但不断收到错误:
不允许从 varchar 转换为 varbinary 使用 CONVERT 命令执行此查询
我使用了Convert
并且成功保存了它,但是当我检索它时,它只检索了前 14 个字节,
byte[] bytearr = (byte[])row["Data"];
我一直在寻找,但一无所获。你能帮我存储字节并检索它吗?
在 SQL 查询中将值作为文本发送。这是一个坏主意,但首先是查询的问题:
SQL Server 中的 varbinary 文本不是一个字符串(用引号括起来),而是一个非常大的十六进制数,看起来像下面的示例:SET @binary = 0x1145A5B9C98
。
顺便说一句,我觉得很奇怪,你把你的ID和你的长度也用引号括起来。我假设它们是整数,所以应该不带引号指定它们: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);
如果你想变得更简单,看看一些帮手。我推荐Dapper。
最后,我注意到您正在存储一个 varbinary 及其长度。这不是必需的,您始终可以获取存储在 SQL Server 中的变量二进制文件的长度,如下所示:SELECT LEN(Data) FROM Files
这就是我从一个项目中的做法。另外,为了补充某人对SQL注入攻击的评论之一,最好不要将字符串连接在一起以构成SQL字符串。而是使用命令参数,就像我在下面所做的那样,名称为 param。这可以防止大多数类型的 sql 注入攻击。
装载:
const string sql = "select data from files where name = @name";
using (var cn = _db.CreateConnection())
using (var cm = cn.CreateTextCommand(sql))
{
cm.AddInParam("name", DbType.String, name);
cn.Open();
return cm.ExecuteScalar() as byte[];
}
储蓄:
const string sql = "insert into files set data = @data where Name = @name";
using (var cn = _db.CreateConnection())
using (var cm = cn.CreateTextCommand(sql))
{
cm.AddInParam("name", DbType.String, name);
cm.AddInParam("data", DbType.Binary, data);
cm.ExecuteNonQuery();
}