簡體   English   中英

C#和SQL十六進制轉換為varbinary

[英]c# and sql hexadecimal to varbinary

這讓我困惑了很長一段時間,而我卻找不到一個明確的答案。

為什么在SQL Server 2005 Express中使用查詢分析器時,我能夠提交一個十六進制值,例如:

UPDATE Table_A
SET    COLUMN_B = 0xabc123ff (example)
WHERE  (COLUMN_A = 'hello')

當我在C#中使用它時,出現錯誤“ COLUMN_B附近的語法不正確”

而且,當我創建存儲過程時,只要通過Visual Studio打開它,它仍然可以(似乎)正常工作。

但是,當我通過c#在Visual Studio中調用此存儲過程時,出現錯誤:“ COLUMN_B附近的語法不正確”

===額外信息===

COLUMN_B是varbinary(1740)。

我嘗試將輸入作為varchar接收,然后將其轉換,但是它也不喜歡這樣。 也轉換它不起作用..

我已經看到了一些查詢,這些查詢似乎可以滿足我的要求,但是它們很大。 如何確保我的C#代碼與通過查詢輸入數據時完全一樣的處理?

抱歉,這似乎還不清楚,我會在以后需要時提供更多代碼,因為我目前沒有。

UPDATE

下面顯示的位是我用來調用sql存儲過程的位,到目前為止,這與所有其他存儲過程都可以正常工作。

 using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["WebDB"].ConnectionString))
                {
                    //State the Stored Proc and add Values to 'cmd' to pass to the Stored Proc
                    SqlCommand cmd = new SqlCommand("_USP_inv", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("Name", C5_name.Text);
                    cmd.Parameters.AddWithValue("Inventory", inventory);

                    try
                    {
                        // Open Connection and execute Stored Proc
                        conn.Open();
                        cmd.ExecuteScalar();

                    ....
                    finally
                    {
                        if (conn.State == System.Data.ConnectionState.Open)
                        {
                            //Close connection IF open
                            conn.Close();
                        }
                    }
                }

和現在的存儲過程

    @Name varchar(10),
    @Inventory varbinary(1740)
AS  
    UPDATE Inventory
    SET Inventory = @Inventory
    WHERE (Name = @Name)

您的示例值是一個Int64,但MSBuild使用的是AddWithValue的Int32版本。

cmd.Parameters.AddWithValue("Inventory", 0xabc123ff).DbType = DbType.Int64;

那將編譯並且插入將起作用。 但是,我不完全確定那是您想要的。 在Management Studio中使用0xabc123ff時,該表將加載0xABC123FF。 但是,通過C#執行時,其加載為0x00000000ABC123FF。

我認為我們真正需要的是一個字節數組。 是的,這可以解決問題-與Management Studio一樣,保存0xABC123FF:

byte[] j = new byte[] { 0xab, 0xc1, 0x23, 0xff };
cmd.Parameters.AddWithValue("Inventory", j);

如果數組可以為null,那么最簡單的方法是在存儲過程中將參數默認為NULL,如果為null,則不要在C#中添加該參數:

if (j != null) {   cmd.Parameters.AddWithValue("Inventory", j);   }

如果您必須將信息視為十六進制,那么可能有必要在將C#應用程序端的數據傳遞給SQL之前先建立一個小型工作程序類來轉換數據,這可以通過一次將十六進制的兩個字符轉換為ASCII來完成等效於Int32.Parse(string,NumberStyle.HexNumber)

不知道這是否適用於您的要求,但只有一種選擇!

暫無
暫無

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

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