我在一段代码中发现了一个奇怪的问题,其中即席SQL查询没有生成预期的输出,即使它的参数与数据源中的记录相匹配。我决定在“即时”窗口中输入以下测试表达式:
new SqlParameter("Test", 0).Value
这给出了null
的结果,这让我摸不着头脑。似乎SqlParameter
构造函数将零视为空值。下面的代码会产生正确的结果:
SqlParameter testParam = new SqlParameter();
testParam.ParameterName = "Test";
testParam.Value = 0;
// subsequent inspection shows that the Value property is still 0
有人能解释这种行为吗?这是不是故意的?如果是这样,这可能是相当危险的.
发布于 2011-12-02 13:50:34
如该构造函数的documentation中所述:
当您在SqlDbType参数中指定对象时,将从该对象的Microsoft .NET框架类型中推断出该值。
使用SqlParameter构造函数的此重载指定整型参数值时要小心。由于此重载采用Object类型的值,因此当值为零时,必须将整数值转换为Object类型,如下面的C#示例所示。
参数= new SqlParameter("@pname",(object)0);
如果不执行此转换,编译器将假定您正在尝试调用 构造函数重载。
您只是调用了一个与您在本例中想象的不同的构造函数。
这样做的原因是,C#允许从整型文字0
到枚举类型(其下只是整型)的隐式转换,这种隐式转换使得(string, SqlDbType)
构造函数在重载解析方面比将int
转换为object
所需的装箱转换更适合(string, object)
构造函数。
在传递int
变量时,即使该变量的值为0
(因为它不是零文字),或者任何其他类型为int
的表达式,这也不会是问题。如果像上面看到的那样显式地将int
强制转换为object
,也不会发生这种情况,因为这样只有一个匹配的重载。
发布于 2011-12-02 14:15:07
在传递/添加参数时使用类型化数据是一种很好的做法。
通过下面的方法,您可以完成以下任务:
对于字符串/varchar类型的数据:
SqlParameter pVarchar = new SqlParameter
{
ParameterName = "Test",
SqlDbType = System.Data.SqlDbType.VarChar,
Value = string.Empty,
};
对于整型数据:
SqlParameter pInt = new SqlParameter
{
ParameterName = "Test",
SqlDbType = System.Data.SqlDbType.Int,
Value = 0,
};
您可以根据您使用的数据更改SqlDbType
的值。
https://stackoverflow.com/questions/8352260
复制相似问题