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