2014-03-31 40 views
4

我想插入这个字节数组到一个SQL Server数据库中,列数据类型为varbinary,这是我在C#代码插入字节数组从C#SQL Server和如何检索

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"]; 

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

+1

varbinary列的长度是什么,因为它是在SQL中配置的? – RQDQ

+1

这个问题为什么得到-1? – IAbstract

+0

您可以使用存储过程,还是必须特设? – dean

回答

4

你送你的价值在您的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

+0

谢谢,我要试试你的代码。 我存储了演示目的的长度:D –

3

这就是我从我的一个项目中完成的。同时为了增加一些人对sql注入攻击的评论,最好不要将字符串连接在一起组成一个sql字符串。而是使用命令参数,如下面的名称参数。这可以防止大多数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(); 
     } 
相关问题