c#和SQL十六进制到可变二进制

本文关键字:二进制 十六进制 SQL | 更新日期: 2023-09-27 18:16:51

这个问题已经困扰我很久了,我一直没能找到一个明确的答案。

为什么在使用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#代码将处理完全相同时,通过查询输入数据?

如果这看起来有点不清楚,我很抱歉,如果需要的话,我会稍后提供更多的代码,因为我目前手头没有。

下面显示的位是我用来调用我的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)

c#和SQL十六进制到可变二进制

您的样本值是Int64,但MSBuild正在使用Int32版本的AddWithValue。

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

将编译,插入将工作。然而,我不完全确定这是你想要的。当在Management Studio中使用0xabc123ff时,表将加载0xabc123ff。但是当通过c#执行时,它加载为0x00000000ABC123FF。

我认为我们真正需要的是一个字节数组。是的,这是一个技巧-保存0xABC123FF,就像管理工作室:

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

如果数组可以为null,那么最简单的方法就是在存储过程中将参数默认为null,并且在c#中不添加该参数。

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

如果你必须将信息作为十六进制,那么在将其传递给SQL之前,可能值得构建一个小的worker类来转换c#应用程序端的数据,这可以通过将十六进制的两个字符一次转换为与Int32等效的ASCII来完成。Parse (string, NumberStyle.HexNumber)

不确定这是否适用于您的要求,但它是一个选择!