为什么我必须为SQL查询转换返回参数值?

时间:2010-06-30 11:28:12

标签: c# sql-server parameters casting return-value

我有一个方法可以在DB(SQL Server)中添加或更新记录,它将RecordID作为(Int32)输出参数返回,成功/失败结果返回为(Int32)返回值。

鉴于我正在指定这些参数的类型,为什么我必须在返回它们时将它们强制转换?

我希望使用以下内容:

enquiryID = cmd.Parameters["@EnquiryID"].Value;

...但我不得不跳过几个额外的箍:

enquiryID = Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString());

这不是世界末日,但它似乎是一个漫长的解决方案。为什么Parameters.Value返回SqlParameters.Value对象而不是Int32?

更新:

好的,我确信 - 直接施放FTW:(int)cmd.Parameters["@EnquiryID"].Value

2 个答案:

答案 0 :(得分:5)

SQL Server没有指定它返回的数据类型,因此C#在处理之前无法推断出类型。此外,SqlParamater是通用的,因此它传递和反对SQL Server。 SQL Server正在执行强制转换。

此外,如果你知道它总是一个int,而不是使用Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString()),你可以直接进行转换(int)cmd.Parameters["@EnquiryID"].Value。如果该值可能返回null,则可以添加

object value = cmd.Parameters["@EnquiryID"].Value;
if(!value.Equals(DBNull.Value)
    enquiryID = (int)value;

答案 1 :(得分:2)

SqlParameter对象的Value属性的类型为object,这意味着它可以返回任何给定的类型。

你返回实际值的方法是错误的,你永远不应该转换为字符串来解析int32。价值所在的只是你价值的盒装版本,因此这应该足够了:

enquiryID = (int)cmd.Parameters["@EnquiryID"].Value;