[英]Why Sql Server Image In Binary Causes Issue in string Query but works in Parameterized Query
我正在将图像保存在VarBinary
及其工作表中。但是问题是,如果我在检索图像时使用字符串查询保存图像,则表示参数无效,尽管图像二进制文件已保存在数据库中并且可以看到它。 但是,如果我使用参数化查询并检索图像,它将正确显示:
这是我参数化的查询代码:
try
{
byte[] byteImg = ImageToByteArray(pictureBox1.Image);
connection = con.getConnection();
if (connection != null)
{
query = @"INSERT INTO [tblImages]
([Image])
VALUES
(@image)";
connection.Open();
cmd = new SqlCommand(query, connection);
cmd.Parameters.AddWithValue("@image", byteImg);
cmd.ExecuteNonQuery();
MessageBox.Show("Saved");
connection.Close();
pictureBox1.Image = null;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
使用参数化的数据库行视图:
这是我的字符串查询代码:
try
{
byte[] byteImg = ImageToByteArray(pictureBox1.Image);
connection = con.getConnection();
if (connection != null)
{
query = @"INSERT INTO [tblImages]
([Image])
VALUES
(Convert(varbinary(MAX),'" + byteImg + "'))";
connection.Open();
cmd = new SqlCommand(query, connection);
cmd.ExecuteNonQuery();
MessageBox.Show("Saved");
connection.Close();
pictureBox1.Image = null;
}
}
catch
{
}
字节转换方法:
public byte[] ImageToByteArray(Image img)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
数据库行视图:
为什么会发生这种情况,为什么使用Parametriczed查询二进制文件在行中不同,而使用字符串查询它在行中却不同,这很奇怪。
任何帮助将不胜感激。
您实际上可以这样做:
INSERT INTO [tblImages] ([Image])
VALUES 0x5379......
要构建二进制字符串,请使用如下代码(缓冲区是您的字节数组)
_sbScript.Append("0x");
for (int i = 0; i < buffer.Length; i++)
{
_sbScript.Append(buffer[i].ToString("X2",System.Globalization.CultureInfo.InvariantCulture));
}
在第二个数据快照的十六进制( 0x53797374...
)中,所有字节均拼出了类型名称(“ System.Byte []”可能是?我停止翻译了...)。
0x53 - 'S'
0x79 - 'y'
0x73 - 's'
0x74 - 't'
0x65 - 'e'
0x6D - 'm'
当您使用CONVERT(VARBINARY(MAX), '" + array + "')"
构建字符串时CONVERT(VARBINARY(MAX), '" + array + "')"
将调用数组ToString方法,该方法在System.Array上定义不正确,并返回类型的名称。看起来像INSERT INTO ... (CONVERT(VARBINARY(MAX), 'System.Byte[]')
,并且将其错误地插入数据库。
选择参数化选项绝对是最安全的方法(就安全性和潜在错误而言),但是如果您想将其作为SQL字符串执行,则需要构建一个实际字节的字符串,如所示在ErikEJ的回答中。
字符串查询代码中有另一个INSERT语句。
参数化的查询代码为:
query = @"INSERT INTO [tblImages]
([Image])
VALUES (@image)";
字符串查询代码为:
query = @"INSERT INTO [tblImages]
([Image])
VALUES (Convert(varbinary(MAX),'" + byteImg + "'))";
删除CONVERT
应该会使两个语句以相同的方式插入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.