2014-03-31 22 views
4

我想插入這個字節數組到一個SQL Server數據庫中,列數據類型爲varbinary,這是我在C#代碼插入字節數組從C#SQL Server和如何檢索

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"]; 

我一直在尋找,並沒有發現什麼。你能幫我存儲字節並檢索它嗎?

+1

varbinary列的長度是什麼,因爲它是在SQL中配置的? – RQDQ

+1

這個問題爲什麼得到-1? – IAbstract

+0

您可以使用存儲過程,還是必須特設? – dean

回答

4

你送你的價值在您的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

+0

謝謝,我要試試你的代碼。 我存儲了演示目的的長度:D –

3

這就是我從我的一個項目中完成的。同時爲了增加一些人對sql注入攻擊的評論,最好不要將字符串連接在一起組成一個sql字符串。而是使用命令參數,如下面的名稱參數。這可以防止大多數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(); 
     }