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