2011-12-24 79 views
1

首先我嘗試了一切,並且無法理解爲什麼它不會正確更新我的varbinary字段。通過在C中調用的存儲過程將Bytearray插入到SQL中#

出的1728個字節只有字節數組中的最後一個字節保存到外地...

我產生我的字節數組如下:

public static byte[] StringToByteArray(String hex) 
{ 
    int NumberChars = hex.Length; 
    byte[] bytes = new byte[NumberChars/2]; 
    for (int i = 0; i < NumberChars; i += 2) 
     bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
    return bytes; 
} 

我也曾嘗試下面的一個:

public static byte[] ParseHex(string hex) 
{ 
    int offset = hex.StartsWith("0x") ? 2 : 0; 
    if ((hex.Length % 2) != 0) 
    { 
     throw new ArgumentException("Invalid length: " + hex.Length); 
    } 
    byte[] ret = new byte[(hex.Length - offset)/2]; 

    for (int i = 0; i < ret.Length; i++) 
    { 
     ret[i] = (byte)((ParseNybble(hex[offset]) << 4) 
         | ParseNybble(hex[offset + 1])); 
     offset += 2; 
    } 
    return ret; 
} 

static int ParseNybble(char c) 
{ 
    if (c >= '0' && c <= '9') 
    { 
     return c - '0'; 
    } 
    if (c >= 'A' && c <= 'F') 
    { 
     return c - 'A' + 10; 
    } 
    if (c >= 'a' && c <= 'f') 
    { 
     return c - 'a' + 10; 
    } 
    throw new ArgumentException("Invalid hex digit: " + c); 
} 

我的C#代碼來保存數據是這樣的:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_Conn"].ConnectionString)) 
{ 
    byte[] to_store = StringToByteArray(inventory); 

    //State the Stored Proc and add Values to 'cmd' to pass to the Stored Proc 
    SqlCommand cmd = new SqlCommand("_USP_store", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@A", TB_A.Text); 
    cmd.Parameters.Add("@B", SqlDbType.VarBinary, 1728).Value = to_store; 

    try 
    { 
    // Open Connection and execute Stored Proc 
    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    C2_Wipe_Message.Text = "Storing success"; 
    C2_Wipe_Message.ForeColor = Color.FromArgb(0, 0, 255, 0); 

    } 
    catch 
    { 
    C2_Wipe_Message.Text = "An error occured.."; 
    C2_Wipe_Message.ForeColor = Color.FromArgb(0, 255, 0, 0); 
    } 
    finally 
    { 
    if (conn.State == System.Data.ConnectionState.Open) 
    { 
     //Close connection IF open 
     conn.Close(); 
    } 
    } 
} 

我已經把它作爲一個字符串,我已經把它作爲純二進制,我已經把它作爲一個十六進制字節數組等

我的假設是在SQL中使用while循環,以存儲它,但是這並不能解釋爲什麼最後一個字節總是被保存,而不是字節數組的第一個字節,請賜教因爲這是真氣..

* SQL SP

@A varchar(10), 
@B varbinary(1728) 

    AS 

UPDATE Invenotry 
SET A = @B 
WHERE (Name = @A) 
+1

讓我們看看我想到的問題是存在的,因爲在SQL中使用循環聽起來我錯了的SQL。 – Hogan

+0

不使用循環,但我會得到SQL過程 – Raskaroth

+0

字段的類型是什麼?[Invenotry]。[A]'? – Hogan

回答

3

你的SQL應該是這樣的:

UPDATE Invenotry 
SET B = @B 
WHERE A = @A 

您也可以嘗試的完整版本參數的構造函數:

SqlParamter param = new SqlParameter("@B", SqlDbType.VarBinary, 1728, ParameterDirection.Input, 
    // we have these parameters but they are ignored for input types 
    false, 0, 0, null, DataRowVersion.Current, 
    // the data 
    to_store); 

cmd.Parameters.Add(param); 
+0

的表定義現在進行測試,一個側面問題,將十六進制字符串轉換爲字節數組的方式你用我描述的上述兩種方法?或者你會使用不同的方法? – Raskaroth

+0

它似乎不喜歡WHERE子句中的'('和')',但是我注意到我最大的問題是給這些字段命名。我現在已經相應地更改了字段名稱,並且還爲varbinary字段指定了適當的大小(它是1726年,而不是1728年)。儘管我仍然對將字節數組轉換爲哪種類型感興趣,但是建議 – Raskaroth

+0

第一個更簡單,但它不檢查開始的'0x' - 你期望看到開始的'0x'? – Hogan

相關問題