繁体   English   中英

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

[英]Insert byte array into SQL Server from C# and how to retrieve it

我正在尝试将此字节数组插入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();
        }
}

我也试了一下@buffer里面_query字符串,而不是缓冲区,但我不断收到错误:

不允许从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中的varbinary的长度,如下所示: 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();
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM