[英]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.