Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字节数组从C插入SQL Server以及如何检索它_C#_Asp.net_Sql_Sql Server_Varbinary - Fatal编程技术网

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

C# 将字节数组从C插入SQL Server以及如何检索它,c#,asp.net,sql,sql-server,varbinary,C#,Asp.net,Sql,Sql Server,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 + "','" + buffe

我试图将这个字节数组插入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,而不是buffer,但我一直得到错误:

不允许从varchar转换为varbinary。请使用CONVERT命令执行此查询

我使用了Convert并成功保存了它,但当我检索它时,它只检索前14个字节

byte[] bytearr = (byte[])row["Data"];

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

这是我在一个项目中的做法。另外,为了补充某人对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();
        }

您可以在SQL查询中以文本形式发送值。这是一个坏主意,但首先是查询的问题:

SQL Server中的varbinary literal不是一个用引号括起来的字符串,而是一个非常大的十六进制数,类似于下面的示例:SET@binary=0x1145A5B9C98

顺便说一句,我觉得很奇怪,你把你的身份证和长度也用引号括起来了。我假设它们是整数,所以应该不加引号地指定它们: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);
如果你想让事情变得更简单,可以找一些助手。我推荐


最后,我注意到您正在存储varbinary及其长度。这不是必需的,您始终可以获得存储在SQL Server中的varbinary的长度,如下所示:从文件中选择LENData

在SQL中配置的varbinary列的长度是多少?为什么这个问题得到-1?您可以使用存储过程还是必须是临时的?此代码容易受到SQL注入攻击。这简直是乞求被黑客攻击。谢谢,我要试试你的代码。我存储长度是为了演示:D