将字节数组从 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"];

我一直在寻找,但一无所获。你能帮我存储字节并检索它吗?

将字节数组从 C# 插入 SQL Server 以及如何检索它

在 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();
        }