2011-06-30 51 views
1

为什么SqlCommand的参数不承认

 scIns.Parameters.Add(new SqlParameter("@v30", 0.00m)); 

导致 “@ V30未定义” 错误,但

 decimal dZero = 0.00m; 
     scIns.Parameters.Add(new SqlParameter("@v30", dZero)); 

的作品好不好?

+3

您确定这是唯一的区别吗?不管你是否使用中间变量... –

+2

你能告诉我们整个代码片段吗? –

+0

是的,提到的错误不在发布的代码中,但必须在其他地方 – Rahul

回答

3

SqlParamter有两个参数两个不同的过载,第一个是字符串,第二个是SqlDbType或对象。

在第一种情况下,当0.00m被传入时,它被转换为Int64,而在第二种情况下,因为传入的值是十进制类型,所以它使用SqlDbType.Decimal。

看看这个Link

更新:
发现了另一个问题stackoverflow谈到有关这一点,并有一个详细的解答。 :)

+0

似乎C#的重载解析中有一个怪癖,我没有意识到。任何数字类型的零字符都会匹配并隐式转换为任何'enum'类型(不论enum是否包含零值)。但是,其他值不会被转换。 –

+0

我认为有这样的事情很有趣,我忙着通过System.Data与反射器试图查看SqlParameter类是否进行任何转换。感谢您的更新Matti! – Jethro

+0

+1,很好看...... –

1

如果你看看调试器,你会发现在第一种情况下,参数的DbType是Int64,在第二种情况下,它是Decimal。

尝试使用其中一个SqlParameter ctor重载,您明确指定SqlDbType。

希望帮助,

约翰

+0

这怎么会发生?在这两种情况下,构造函数都传递完全相同的值。 –

+0

谢谢。我想我知道发生了什么,以及如何解决它,但似乎比原来的解决方法更麻烦。我也遇到了“”的对象值问题。 – SeaDrive

+0

据我所知,JohnD指出的是,接受(string,object)参数的构造函数基本上猜测对象的类型。不知何故,小数点0.00m被改为int(通过C#或SqlServer?),所以SqlCommand需要一个int,并拒绝了一个小数。显然,使用类型变量可以避免这个问题。你也可以使用其他构造函数来传递SqlDBType作为单独的参数。 – SeaDrive