1

这让我困惑了好久,一直没能找到明确的答案。。

为什么在 SQL Server 2005 express 中使用查询分析器时,我能够提交一个十六进制值,例如:

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

当我在 c# 中使用它时,它给了我错误“COLUMN_B 附近的语法不正确”

当我创建一个存储过程时,它仍然(似乎)也可以工作,只是通过视觉工作室打开它..

但是,当我通过 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)
4

2 回答 2

1

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

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

这将编译并且插入将起作用。但是,我不完全确定这就是您想要的。在 Management Studio 中使用 0xabc123ff 时,表会加载 0xABC123FF。但是当通过 C# 执行时,它加载为 0x00000000ABC123FF。

我认为我们真正需要的是一个字节数组。是的,这就是诀窍——保存 0xABC123FF,就像 Management Studio 一样:

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

如果数组可以为空,那么最简单的做法是在存储过程中将参数默认为 NULL,并且如果为 null,则不要在 C# 中添加参数:

if (j != null) {   cmd.Parameters.AddWithValue("Inventory", j);   }
于 2011-12-09T04:16:53.310 回答
0

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

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

于 2011-12-06T14:05:22.050 回答