ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-06-12 12:55:36  阅读:485  来源: 互联网

标签: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();
        }
}

我也在_quuff字符串中使用了@buffer而不是缓冲区,但我一直收到错误:

Converting from varchar to varbinary is not allowed use the CONVERT command to execute this query

并且我使用了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

标签:c,sql,sql-server,asp-net,varbinary
来源: https://codeday.me/bug/20190612/1225876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有