【发布时间】:2013-11-09 00:56:05
【问题描述】:
我遇到了一个我没有预料到的情况,需要帮助回答。我们当前的系统调用 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 (不确定如何/为什么)并且做了错误的部分。所以我的问题是有什么区别,我应该关注其他数据类型吗...?
【问题讨论】:
-
你应该关注“Option Strict Off”..如果你打开它,你的代码会在
if MyObject.MyTimestamp <> Nothing显示错误,因为它应该是IsNot(或Not ... Is)而不是<>。这不会解决你有一个值的问题,但该值不在可接受的范围内,但无论如何你都必须检查一下(应该存储在 128 字节字段中的 15MB 字符串呢?)跨度> -
Option Strict 和 Option Explicit 在应用程序中每个代码文件的顶部都设置为 On。
-
参数。你说的对。这就是问题所在。 DateTime 是一个值类型/结构。那些永远不可能是“无”。对他们来说,没有什么是“默认值”。一个什么都不是的整数是 0。一个 Double 是 0.0,一个 DateTime 是 ... 1.1.1 12:00 AM
-
没错。通过进一步的测试,我认为问题不是
MyObject.MyTimestamp <> Nothing的评估与MyObject.MyTimestamp <> Datetime.MinValue的评估相同。我认为这与我在添加参数的同时设置参数的值有关。 If 运算符和 If, Then, Else 在即时窗口中的计算结果相同。
标签: asp.net .net sql sql-server vb.net