簡體   English   中英

為什么二進制中的Sql Server映像在字符串查詢中導致問題,但在參數化查詢中起作用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM