首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么SqlParameter名称/值构造函数将0视为null?

为什么SqlParameter名称/值构造函数将0视为null?
EN

Stack Overflow用户
提问于 2011-12-02 13:48:07
回答 2查看 7.7K关注 0票数 32

我在一段代码中发现了一个奇怪的问题,其中即席SQL查询没有生成预期的输出,即使它的参数与数据源中的记录相匹配。我决定在“即时”窗口中输入以下测试表达式:

代码语言:javascript
运行
复制
new SqlParameter("Test", 0).Value

这给出了null的结果,这让我摸不着头脑。似乎SqlParameter构造函数将零视为空值。下面的代码会产生正确的结果:

代码语言:javascript
运行
复制
SqlParameter testParam = new SqlParameter();
testParam.ParameterName = "Test";
testParam.Value = 0;
// subsequent inspection shows that the Value property is still 0

有人能解释这种行为吗?这是不是故意的?如果是这样,这可能是相当危险的.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,也不会发生这种情况,因为这样只有一个匹配的重载。

票数 37
EN

Stack Overflow用户

发布于 2011-12-02 14:15:07

在传递/添加参数时使用类型化数据是一种很好的做法。

通过下面的方法,您可以完成以下任务:

对于字符串/varchar类型的数据:

代码语言:javascript
运行
复制
SqlParameter pVarchar = new SqlParameter
                    {
                        ParameterName = "Test",
                        SqlDbType = System.Data.SqlDbType.VarChar,
                        Value = string.Empty,
                    };

对于整型数据:

代码语言:javascript
运行
复制
SqlParameter pInt = new SqlParameter
                    {
                        ParameterName = "Test",
                        SqlDbType = System.Data.SqlDbType.Int,
                        Value = 0,
                    };

您可以根据您使用的数据更改SqlDbType的值。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8352260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档