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)
您的样本值是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)
不确定这是否适用于您的要求,但它是一个选择!