加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – IF运算符与If之间的评估差异,然后,否则

发布时间:2020-12-16 09:53:31 所属栏目:asp.Net 来源:网络整理
导读:我遇到了一个我没想到并需要帮助回答的场景.我们当前的系统调用SQL存储过程并因此创建SQL命令,添加参数并添加这些参数的值…比如插入. 我们有类似下面的代码…… cmd.Parameters.Add("@MyTimestamp",SqlDbType.DateTime)If MyObject.MyTimestamp Nothing The
我遇到了一个我没想到并需要帮助回答的场景.我们当前的系统调用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:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

这是因为使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读