2016-11-30 4 views
1

私はバックエンド、すなわちSqlサーバー2012で作業しています。テーブルの日付、つまりParawiseDate datetimeというフィールドを宣言しました。dateフィールドにnullが設定されていませんが、1900-01-01はなぜですか?

そして私は、C#、すなわち

sqlcom.Parameters.AddWithValue("@ParawiseDate", NULL); 

問題から、それにNULLを渡しています:

それは代わりにNULL1900-01-01として日付を保存します。私は""を試して、1900-01-01と保存されました。

なぜですか?

+1

「NULL」とは何ですか? 'NULL'はC#キーワードではありません。 – Dai

+0

また、その型推論が必ずしも正確ではないので、 'AddWithValue'も避けてください。明示的な 'SqlDbType'値を指定してください。 – Dai

答えて

0

私はDateTimeを信じていますが、 "?"でタイプを宣言できます。 、それ以外の場合は、二番目のパラメータには、NULLの代わりに

typeof(System.DateTime) 

に渡してみてください。また1900-01-01

DateTime ? Parameter; 

をデフォルトとなり

+0

私はしました。私はすでにしました – Stacky

+0

効果なし、まだ同じ – Stacky

+0

私は、申し訳ありませんが、typeof(System.DateTime) – user5215286

1

必ずそれがParawiseDateの列にNULL値を許可してください.Nullを渡す代わりに、また、DBNullを試してください。DBNull.value

sqlcom.Parameters.AddWithValue("@ParawiseDate", DbNull.Value); 
+0

Lolを参照してください同時に表示されます。さて、彼が得ているのは、Dateのデフォルト値です。そのメソッドにはnull値はありません。デフォルト値です。 – Swift

0

どのバイナリデータの表現はどのようなもので、どのようなキャストが許されていますか?それがなければ、どんなプログラマーでもいくぶん盲目的です。この場合、MS SQLのデフォルトの日付値は1900-01-01です。古いCLRでは、DBNull.Valueを値として持つAddWithValueは、fieldをdefaultに設定するのと同じでした。 私は4.0のCLR環境を扱っていませんでしたが、NULLをDBNullにキャストできますか?いずれにせよ、それは日付の値ではなく、NULLを暗黙的にDateにデフォルト値でキャストすることができますか? (後者はMSが標準からもう一度離れると言いますが、NULLはオブジェクトへのポインタと等しくなければなりません)おそらく文書化されていない副作用でしょう。

public SqlParameter AddWithValue(
    string parameterName, 
    object value 
) 

パラメータ

  • parameterName タイプ:System.String パラメータの名前。

  • value 型:System.Object 値が追加されます。 NULL値の代わりにDBNull.Valueをnullの代わりに使用してください。テーブル内のフィールドがNULL値を許可するように設定することができるが

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v=vs.110).aspx

日付と日時は、NULLにすることはできません。安全性の理由から、通常、データを読み取るとデフォルト値を得る結果になります。それは別のチェックが必要です(isDBNull?)

SQLの日付の正当な値(少なくともMicrosoftのフレーバー)は、0001-01-01から9999-12-31までです。明示的に指定する必要があります。そうでない場合は、デフォルトが使用されます。 。

0
SELECT cast(NULLIF(t.[ParawiseDate],'') AS DATE) 
FROM tablename t 
関連する問題