问题描述
||
我有一个将uniqueidentifier作为参数的存储过程。
它应该像这样工作(我没有写这个):
SqlCommand command = new SqlCommand(\"[CheckActivation]\",Conn)
{
CommandType = CommandType.StoredProcedure
};
command.Parameters.AddWithValue(\"@key\",key);
return (bool)command.ExecuteScalar();
其中key是字符串,但不是。我总是收到“指定的转换无效”的异常。
因此,我将其重写为:
Guid guid = new Guid(key);
using (var command = Conn.CreateCommand())
{
command.CommandText = \"[CheckActivation]\";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(\"@key\",SqlDbType.UniqueIdentifier);
command.Parameters[\"@key\"].Value = guid;
return (bool)command.ExecuteScalar();
}
guid是具有正确值的Guid对象,但是我仍然遇到相同的异常。
这是怎么了?
解决方案:问题在于return语句中的强制类型转换。 sp返回一个不能转换为布尔值的int值:
return((int)command.ExecuteScalar()== 1);
解决方法
“指定的转换无效”是指您的转换错误,这是您执行此操作的唯一位置:
return (bool)command.ExecuteScalar();
检查此值。它是DBNull还是其他数据类型。尝试对其进行调试,以找出数据类型。
, ExecuteScalar()不返回布尔类型:
类型:System.Object
第一行的第一列
结果集或空引用
(在Visual Basic中为空)如果
结果集为空。返回最大值
2033个字符。
同样,您创建名称为\“ @ key \”的参数,然后在此行中使用其他名称:
command.Parameters[\"@activationkey\"].Value = guid;
, 我认为您的意思是@key
而不是@activationkey
。然后,您可以添加这样的参数:
command.Parameters.Add(new SqlParameter
{
ParameterName = \"@key\",SqlDbType = SqlDbType.UniqueIdentifier,Value = new Guid(key)
});
, 您将参数“ 7”指定为唯一标识符类型,
则将guid
设置为未声明的参数\"@activationkey\"
。
我认为您不应该将值设置为\"@activationkey\"
,而应将其设置为key
command.Parameters[\"@key\"].Value = guid;