簡體   English   中英

從C#將字節數組插入SQL Server以及如何檢索它

[英]Insert byte array into SQL Server from C# and how to retrieve it

我正在嘗試將此字節數組插入SQL Server數據庫,列數據類型為varbinary ,這是我在C#中的代碼

SqlParameter param = new SqlParameter("@buffer", SqlDbType.VarBinary, 8000);
param.Value = buffer;

string _query = "INSERT INTO [dbo].[Files] (FileID, Data, Length) VALUES ('" + uID + "','" + buffer + "','" + buffer.Length + "')";

using (SqlCommand comm = new SqlCommand(_query, conn))
{
        comm.Parameters.Add(param);
        try
        {
            conn.Open();

            comm.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            return Request.CreateResponse(HttpStatusCode.OK, "Something went wrong : " + ex.Message);
        }
        finally
        {
            conn.Close();
        }
}

我也試了一下@buffer里面_query字符串,而不是緩沖區,但我不斷收到錯誤:

不允許從varchar轉換為varbinary使用CONVERT命令來執行此查詢

並且我使用了Convert並且它已成功保存,但是當我檢索它時,它只檢索前14個字節,

byte[] bytearr = (byte[])row["Data"];

我一直在尋找,一無所獲。 你能幫我存儲字節並檢索它嗎?

您在SQL查詢中將值作為文字發送。 這是一個壞主意,但首先是您的查詢問題:

SQL Server中的varbinary文字不是一個字符串(用引號括起來),而是一個非常大的十六進制數字,看起來像這個例子: SET @binary = 0x1145A5B9C98

順便說一句,我發現你把你的ID和你的長度也用引號括起來很奇怪。 我假設它們是整數,所以它們應該沒有引號指定: SET @i = 2 它可能仍然適用於您的情況,因為SQL Server將動態地將字符串轉換為整數。 這只是令人困惑而且效率低下。

現在, 不要通過連接這樣的文字來做SQL請求。 請改用SQL參數。 像這樣的東西:

cmd.CommandText = "INSERT INTO Files (FileId, Data, Length) VALUES (@id, @data, @length)";
cmd.Parameters.AddWithValue("id", 3);
cmd.Parameters.AddWithValue("data", someByteArray);
cmd.Parameters.AddWithValue("length", someByteArray.Length);

如果你想做得更簡單,請看一些幫手。 我推薦Dapper

最后,我注意到你要存儲一個varbinary及其長度。 這不是必需的,你總是可以獲得存儲在SQL Server中的varbinary的長度,如下所示: SELECT LEN(Data) FROM Files

這就是我從我的一個項目中做到的。 另外,為了添加有人對sql注入攻擊做出的評論之一,最好不要將字符串連接起來組成一個sql字符串。 而是使用命令參數,就像我在下面用名稱param做的那樣。 這可以防止大多數類型的SQL注入攻擊。

加載:

        const string sql = "select data from files where name = @name";
        using (var cn = _db.CreateConnection())
        using (var cm = cn.CreateTextCommand(sql))
        {
            cm.AddInParam("name", DbType.String, name);
            cn.Open();
            return cm.ExecuteScalar() as byte[];
        }

保存:

        const string sql = "insert into files set data = @data where Name = @name";
        using (var cn = _db.CreateConnection())
        using (var cm = cn.CreateTextCommand(sql))
        {
            cm.AddInParam("name", DbType.String, name);
            cm.AddInParam("data", DbType.Binary, data);
            cm.ExecuteNonQuery();
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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