asp.net – IF运算符与If之间的评估差异,然后,否则
我遇到了一个我没想到并需要帮助回答的场景.我们当前的系统调用SQL存储过程并因此创建SQL命令,添加参数并添加这些参数的值…比如插入.
我们有类似下面的代码…… cmd.Parameters.Add("@MyTimestamp",SqlDbType.DateTime) If MyObject.MyTimestamp <> Nothing Then cmd.Parameters.Item("@MyTimestamp").Value = MyObject.MyTimestamp Else cmd.Parameters.Item("@MyTimestamp").Value = Nothing End If 现在,当我第一次看到这个时,我有点惊讶MyObject.MyTimestamp曾经评估过Nothing,但它已存在多年没有问题.在清理工作期间,添加参数和设置其值的代码被合并,因此上面的代码变成…… cmd.Parameters.Add("@MyTimestamp",SqlDbType.DateTime).Value = If(MyObject.MyTimestamp <> Nothing,MyObject.MyTimestamp,Nothing) 对我而言,这看起来与代码最初所做的相同,但这不是测试期间发现的.在测试时我收到了SqlTypeException:
这是因为使用If运算符评估MyObject.MyTimestamp不是Nothing,它不是Nothing它是DateTime.MinValue并且它试图将它插入到sql中并且它爆炸了.编写原始代码的方式将相同的Timestamp评估为Nothing(不确定如何/为什么)并执行false部分.所以我的问题是有什么区别,我应该关注其他数据类型……? 解决方法
记住(我经常不这样做)Nothing在C#中不等于null,但更像Default(T),以下内容不检查是否已设置MyObject.MyTimestamp:
MyObject.MyTimestamp <> Nothing 但实际上是在检查它是否是默认的日期时间(DateTime.MinValue),它可能总是如此. 另外,当你使用时: If(MyObject.MyTimestamp <> Nothing,Nothing) 两种返回类型(MyObject.MyTimestamp,Nothing)必须属于同一类型,因此编译器知道MyObject.Timestamp应该是一个日期时间,它不会将任何内容转换为默认的日期时间. 但是,当你使用它时: If MyObject.MyTimestamp <> Nothing Then cmd.Parameters.Item("@MyTimestamp").Value = MyObject.MyTimestamp Else cmd.Parameters.Item("@MyTimestamp").Value = Nothing End If 它识别出“@MyTimestamp”的参数是SqlDbType.DateTime类型,因此为此创建默认值.我不知道这是DbNull还是我头顶的实际值,但无论哪种方式它都是允许的值,所以不会抛出错误. 另外,您可能希望将参数设置为DbNull.Value而不是Nothing: If MyObject.MyTimestamp <> Nothing Then cmd.Parameters.Item("@MyTimestamp").Value = MyObject.MyTimestamp Else cmd.Parameters.Item("@MyTimestamp").Value = DbNull.Value End If (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何动态绑定kendo mvc ui dropdownlist
- asp.net-web-api2 – WEB API 2,Selfhost,Access除了“loca
- asp.net – 通过控件循环
- 从ASP.NET应用程序调试HTTP模块初始化事件
- 如何在ASP.NET 2.0应用程序中为API调用启用TLS 1.2?
- 如何检查ASP.NET MVC View如果站点在localhost或127.0.0.1上
- asp.net-mvc – 在哪里得到的Microsoft.Web.Mvc.dll
- asp.net-mvc – Ninject MVC和WCF扩展不能与InRequestScope
- 循环 – 如何检查我是否在ADO Recordset的最后一条记录上?
- ASP.NET 5 API – Azure AD B2C
- asp.net-mvc – 使用Linq返回空字符串到SQL – 没
- asp.net – 在IIS7.5中什么模块删除了400个错误请
- asp.net-mvc – ASP.Net WebAPI区域支持
- ASP.NET核心中的Redis缓存
- jqGrid,ASP.NET,JSON让我发疯.请帮忙
- asp.net-mvc-3 – 在代码MVC Razor中呈现局部视图
- 在ASP.NET MVC 6中继续支持Ninject?
- asp.net-mvc – ASP.Net MVC支持嵌套资源?
- asp.net-web-api – web api – asp.net身份令牌
- asp.net-mvc – 如何在路由上处理null {id}?