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

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)

我一直在寻找,什么也没找到。你能帮我存储字节并检索它吗?

jod*_*ods 5

您可以在 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