2010-06-30 29 views
3

我有一个方法,可以添加或更新DB(SQL Server)中的记录,并且它将RecordID作为(Int32)输出参数,并将成功/失败结果作为(Int32)返回值返回。为什么我必须为SQL查询转换返回参数值?

鉴于我指定了这些参数的类型,为什么我们必须在返回时施放它们?

我希望用下面的:

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

...但我最多有通过对额外的箍跳:

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

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

UPDATE:

OK,我相信 - 直接铸造FTW:(int)cmd.Parameters["@EnquiryID"].Value

回答

5

SQL Server不指定数据它返回的类型,所以C#有没有办法来推断处理之前的类型它。此外,SqlParamater是泛化的,所以它传递和从SQL Server对象。 SQL Server在其最后执行强制转换。

此外,如果您知道它始终是一个整数,您可以直接执行(int)cmd.Parameters["@EnquiryID"].Value,而不是使用Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString())。如果该值可能为空返回,然后你可以添加

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

这可能最终成为最好一堆if语句 'int值= value.Equals(DBNull.Value )? null:(int)value'而不是null你可以把一个默认值作为 – 2010-06-30 12:00:12

+0

Re:sql server正在执行cast - 是的,这是有道理的。仅供参考,价值永远不会为空,但问题(和你的例子)值得注意。谢谢 – CJM 2010-06-30 12:03:15

+0

@Chris T:我总是忘记了?操作员,因为我很少使用它,谢谢! – 2010-06-30 12:19:54

2

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

你返回实际值的方式是错误的,你不应该为了解析int32而转换为字符串。什么是价值属性为你的价值只是一个盒装版本,因此这应该足够了:

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

我的方式并不是真正的“错误” - 毕竟,它是有效的,但是直接投射方法好得多。谢谢 – CJM 2010-06-30 12:00:13

相关问题