我在一段代码中观察到一个奇怪的问题,其中即席 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
谁能解释这种行为?这是故意的吗?如果是这样的话,那可能就比较危险了……
如中所述文档 http://msdn.microsoft.com/en-us/library/0881fz2y.aspx对于该构造函数:
当您在 value 参数中指定对象时,将从该对象的 Microsoft .NET Framework 类型推断出 SqlDbType。
使用此重载时请小心sql参数 https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx构造函数指定整数参数值。因为这个重载需要一个类型的值Object https://msdn.microsoft.com/en-us/library/system.object.aspx,您必须将积分值转换为Object https://msdn.microsoft.com/en-us/library/system.object.aspx当值为零时键入,如以下 C# 示例所示。
Parameter = new SqlParameter("@pname", (object)0);
如果您不执行此转换,编译器会假定您正在尝试调用sql参数 (字符串,SqlDb类型) http://msdn.microsoft.com/en-us/library/h8f14f0z.aspx构造函数重载。
您只是调用了与您在案例中想象的不同的构造函数。
这样做的原因是 C# 允许implicit从整数字面量转换0
到枚举类型(它们只是下面的整型类型),这种隐式转换会导致(string, SqlDbType)
与转换所需的装箱转换相比,构造函数更适合重载解析int
to object
为了(string, object)
构造函数。
当您通过考试时,这永远不会成为问题int
variable,即使该变量的值为0
(因为它不是零文字),或具有该类型的任何其他表达式int
。如果您明确地强制转换,也不会发生这种情况int
to object
如上所示,因为这样就只有一个匹配的重载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)