【问题标题】:Error Invalid cast from 'System.String' to 'System.Byte[]' in C# calling stored procedure在调用存储过程的 C# 中,从“System.String”到“System.Byte []”的错误无效转换
【发布时间】:2015-01-06 20:04:22
【问题描述】:

我有一个下拉列表,其中填充了来自 SQL Server 的 varbinary(256) 列。我将此下拉列表中的选定值发送到存储过程,但出现错误

从“System.String”到“System.Byte[]”的转换无效。

C# 代码正在调用运行此查询以将名称和 ID 返回到下拉列表的 SP。

SELECT staffID, sAMAccountName,  (sn + ', ' + givenName) AS fullName
FROM staff
WHERE deleteEmployee = 'no' AND recordType = 'staff'
ORDER BY sn

我添加如下参数。

objCmd.Parameters.Add("@staffID", SqlDbType.Binary).Value = ddl_staff.SelectedItem.Value;

如果我进入 SQL 并执行如下所示的 SP,我会得到预期的结果。

DECLARE @staffID varbinary(256)
SELECT @staffID = staffID from staff where samaccountname = 'johndoe'
EXECUTE stp_nho_status @staffID

asp.net 页面运行时数据发生了什么变化;它是否转换为下拉列表值中的字符串?我必须以某种方式转换它吗?

【问题讨论】:

  • 如果你设置一个断点并检查ddl_staff.SelectedItem.Value的值,你会得到什么?
  • 您是否检查过下拉列表的 SelectedItem.Value 的值,该值在您需要二进制的参数中用作字符串,并且您正在添加字符串值,在您的查询中您应该转换 SelectedItem。二进制值,你能检查一下吗
  • 另外,想知道参数是否应该是SqlDbType.VarBinary,因为它在你的SQL中被声明为varbinary

标签: c# asp.net sql-server tsql stored-procedures


【解决方案1】:

您可以考虑编写一个将string 转换为byte[] 的方法(可以转换为SqlDbType.VarBinary):

public static byte[] StrToByteArray(string value)
{
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    return encoding.GetBytes(value);
}

然后你可以像这样使用它:

objCmd.Parameters.Add("@staffID", SqlDbType.VarBinary).Value = 
    StrToByteArray(ddl_staff.SelectedItem.Value);

【讨论】:

  • 在下拉列表中填充 varbinary 时,ASP.NET 是否将其转换为字符串?我按照您的建议进行了尝试,但没有返回预期的结果。我在临时表中插入了要传递给 SP 的人员 ID,它看起来与从人员表中出来的不同,是一些转换问题吗?
  • 听起来像是转换问题。与转换前的字符串值相比,插入的值是什么样的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多