我遇到了一个我没想到并且需要帮助回答的场景。我们当前的系统调用 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 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之间。
那是因为使用 If 运算符将 MyObject.MyTimestamp 评估为不是 Nothing,它不是 Nothing 它是 DateTime.MinValue 并且它试图将其插入 sql 并且它爆炸了。原始代码的编写方式将相同的 Timestamp 评估为 Nothing (不确定如何/为什么)并且做了错误的部分。所以我的问题是有什么区别,我应该关注其他数据类型......?