4

予期していなかったシナリオに遭遇したため、回答の助けが必要です。現在のシステムは、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 であると評価し (どのように/なぜかわからない)、偽の部分を実行します。だから私の質問は、違いは何ですか.他のデータ型について心配する必要がありますか.

4

1 に答える 1

3

Nothingこれは C#と同等ではなくnull、より似ていることを思い出してください (私はしばしばそうではありません) Default(T)。次は MyObject.MyTimestamp が設定されているかどうかをチェックしません。

MyObject.MyTimestamp <> Nothing

しかし、それがデフォルトの日時(DateTime.MinValue)であるかどうかを実際にチェックしています。これはおそらく常にそうです。

さらに、使用する場合:

If(MyObject.MyTimestamp <> Nothing, MyObject.MyTimestamp, Nothing)

2 つの戻り値の型 ( MyObject.MyTimestampNothing) は同じ型である必要があるため、コンパイラMyObject.Timestampは datetime であることを認識しているため、デフォルトの datetime には何も変換しません。

ただし、これを使用する場合:

If MyObject.MyTimestamp <> Nothing Then
   cmd.Parameters.Item("@MyTimestamp").Value = MyObject.MyTimestamp
Else
   cmd.Parameters.Item("@MyTimestamp").Value = Nothing
End If

"@MyTimestamp"のパラメータが typeであることを認識するSqlDbType.DateTimeため、これのデフォルトを作成します。これが DbNull なのか、頭のてっぺんから離れた実際の値なのかはわかりませんが、いずれにしても許容される値であるため、エラーはスローされません。

余談ですが、おそらくパラメーターを に設定し、 に設定したくないでしょDbNull.ValueNothing:

If MyObject.MyTimestamp <> Nothing Then
   cmd.Parameters.Item("@MyTimestamp").Value = MyObject.MyTimestamp
Else
   cmd.Parameters.Item("@MyTimestamp").Value = DbNull.Value
End If
于 2013-10-29T18:17:30.067 に答える