予期していなかったシナリオに遭遇したため、回答の助けが必要です。現在のシステムは、SQL ストアド プロシージャを呼び出し、SQL コマンドを作成し、パラメーターを追加し、それらのパラメーターの値を追加します。たとえば、Insert の場合です。
以下のようなコードがありました...
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 AM から 9999 年 12 月 31 日 11:59:59 PM の間である必要があります。
これは、If 演算子を使用すると MyObject.MyTimestamp が Nothing ではないと評価されたためです。これは Nothing ではなく、DateTime.MinValue であり、それを SQL に挿入しようとして失敗したためです。元のコードが書かれた方法は、同じタイムスタンプを Nothing であると評価し (どのように/なぜかわからない)、偽の部分を実行します。だから私の質問は、違いは何ですか.他のデータ型について心配する必要がありますか.