72

検証したくないので、データベースtxtBirthDateに渡したいです。DateTime.MinValue

私のコード:

 if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = DateTime.MinValue;
 else
     objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

DateTime.MinValue戻るDate = {1/1/0001 12:00:00 AM}

SQL エラーが発生しました:

SqlDateTime オーバーフロー。1753 年 1 月 1 日 12:00:00 AM から 9999 年 12 月 31 日 11:59:59 PM の間である必要があります。

DateTime.MinValue私はそれを理解していますが、データベースに挿入できない無効な日時を返す理由がわかりません 。このタイプの状況を処理するにはどうすればよいですか?

4

10 に答える 10

112

代わりにDateTime.MinValueuseを使用しないようにするのは非常に簡単です。System.Data.SqlTypes.SqlDateTime.MinValue

于 2013-03-01T12:26:55.987 に答える
98

DateTime.MinValue基本的に、欠損値を表すために使用しないでください。SQL Server には 1753 の開始の最小値があるため、SQL Server の DateTime フィールドでは使用できませんDateTime.MinValue

代わりに、BirthDateプロパティを a Nullable<DateTime>(aka DateTime?) にしnull、値がない場合は に設定します。また、データベース フィールドが null 可能であることを確認してください。null次に、それがデータベースのNULL値になることを確認する必要があります。正確にどのようにそれを行うかは、あなたが私たちに何も話していないデータアクセスに依存します.

于 2013-03-01T12:06:34.053 に答える
12

古い質問ですが、別の解決策は、データベース列に datetime2 を使用することです。 MSDN リンク

于 2014-12-10T18:39:02.927 に答える
3

これがあなたができることです。それを達成する方法はたくさんありますが。

DateTime? d = null;    
if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = d;
else
    objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

注: これは、データベースの日時列が Null を許可する場合にのみ機能します。それ以外の場合は、DateTime d の標準の最小値を定義できます。

于 2013-03-01T12:34:59.163 に答える
2

簡単に言えば、デフォルト値として使用しないでください。DateTime.MinVaue

MinValuesあなたがいる環境に応じて、そこにはいくつかの異なるものがあります.

私はかつて、Windows CE プロジェクトを実装するプロジェクトを持っていました。フレームワークDateTime.MinValue(0001 年)、データベースMinValue(1753)、および UI コントロールDateTimePicker(1970 年だったと思います) を使用していました。そのため、少なくとも3 つの異なる MinValuesがあり、奇妙な動作と予期しない結果につながっていました。(そして、4番目の(!)バージョンもあったと思いますが、それがどこから来たのか思い出せません。)

null 許容データベース フィールドを使用し、代わりに値を a に変更しますNullable<DateTime>。コードに有効な値ない場合、データベースにも値があってはなりません。:-)

于 2013-03-01T12:16:21.170 に答える
2

MSDN から:

1753 年 1 月 1 日から 9999 年 12 月 31 日までの日付と時刻のデータ。精度は 300 分の 1 秒 (3.33 ミリ秒) です。値は、.000、.003、または .007 ミリ秒単位で丸められます。2 つの 4 バイト整数として格納されます。最初の 4 バイトには、基準日である 1900 年 1 月 1 日からの前後の日数が格納されます。基準日は、システムの基準日です。1753 年 1 月 1 日より前の datetime の値は許可されません。残りの 4 バイトには、午前 0 時からのミリ秒数で表される時刻が格納されます。秒の有効な範囲は 0 ~ 59 です。

SQL は、DateTime 値に C# とは異なるシステムを使用します。

MinValue をセンチネル値として使用できます。MinValue の場合は、null をオブジェクトに渡します (日付を null 許容として DB に保存します)。

if(date == dateTime.Minvalue)
    objinfo.BirthDate = null;
于 2013-03-01T12:08:26.790 に答える
-7

拡張機能を使用する

public static class DateTimeExtensions
{
    public static DateTime MinValue(this DateTime sqlDateTime)
    {
        return new DateTime(1900, 01, 01, 00, 00, 00);
    }
}


DateTime date = DateTime.Now;
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());
于 2013-03-01T12:13:40.857 に答える