生成用于字节数组插入的sql脚本

时间:2017-02-21 05:14:33

标签: asp.net sql-server

我被要求为某组操作生成脚本(基本上是为电子商务门户插入产品信息),并执行生成的脚本。我面临的问题是我们将所有图像作为二进制数据存储在表格中。现在我应该如何为此编写查询脚本,当我尝试以字符串形式插入字节数组时,我得到类型不匹配。这就是我的尝试。

//imgbyte is the byte array containing the piucture data
StringBuilder sb=new StringBuilder();
sb.AppendLine("declare @picquery as Varchar(4000)");
sb.AppendLine("set @picquery='Insert into Picture(PictureBinary) values (''"+imgbyte.ToString() +"'')'");
sb.AppendLine("exec(@picquery)");
// sb is then passed to another module where it is executed.

但二进制数据的类型错误,插入查询失败。我究竟做错了什么。 PictureBinary列是VarBinary(MAX)

1 个答案:

答案 0 :(得分:2)

为了编写二进制数据,SQL Server希望数据采用十六进制格式,并带有前导0x。例如:

INSERT INTO images (name, image) VALUES ('photo.jpg', 0xAF03083FCE...)

通常,在与数据库交互时,最好使用参数化查询并让.NET为您编写最终的SQL。它会自动将字节数组转换为正确的格式。

参数化查询

// assuming 'cn' is a SqlConnection that's already open
var commandText= "INSERT INTO Picture (PictureBinary) VALUES (@bin)";
using (var cmd = new SqlCommand(commandText, cn))
{
    cmd.Parameters.Add("@bin", SqlDbType.Binary, imgByte.Length).Value = imgByte;
    cmd.ExecuteNonQuery();
}

手动构建查询

如果由于某种原因你确实需要手工构建查询,那么你就是这样做的:

// convert the byte array to a hex string
var hexString = BitConverter.ToString(imgByte).Replace("-", "");
var sql = String.format("INSERT INTO Picture (PictureBinary) VALUES (0x{0})", hexString);

注意:使用BitConverter许多在C#中将字节转换为十六进制的方法之一。 Here's a great SO answer comparing performance