什么是在.NET中处理空日期的标准方法

时间:2011-03-15 09:26:42

标签: c# asp.net datetime null

我有使用C#的asp.net表单,我正在使用Linq将用户信息像往常一样插入数据库。好。我也从用户那里获取出生日期,但是如果用户从ui跳过填写日期文本框,那么我得到像'01 / 01/0001'这样的日期,这肯定是数据库安全不允许的存储它。

所以我需要在我的代码中的某处检查它是null还是以这种(上面给出的)格式。如果它为null或格式为'01 / 01/0001'那么我究竟要做什么?我没有任何默认值 日期的价值。

那么,如果date为null(但不是强制性的),那么处理的标准方法是什么。请指导我。很多时候,我发现自己陷入陷阱,同时处理各种类型的null。

被修改 看看我做了什么似乎在这里工作。但我不认为这是标准方式:

DateTime? otxtDOB = new DateTime();
                    if (!string.IsNullOrEmpty(DOB))
                    {
                    if (Convert.ToDateTime(DOB) != DateTime.MinValue)
                        {
                        otxtDateOfPurchese = Convert.ToDateTime(Convert.ToDateTime(DOB).ToString("dd-MMM-yyyy"));
                        }
                    else
                    {
                     otxtDOB = null;
                        }

                    }

请确认我这是正确的方法吗?

7 个答案:

答案 0 :(得分:11)

如果用户尚未设置日期属性Nullable(即“DateTime?”),则应该允许它实际为空。 (并且如果您的数据库列将允许空值,则可以将其存储为数据库中的null)

否则它会默认为DateTime.MinValue,这就是你在这里看到的。在添加到数据库时,您必须对DateTime.MinValue进行明确的测试。

答案 1 :(得分:0)

DateTime是一个值类型(如数字),因此您无法为其指定空值。 Mane人使用DateTime.MinValue和DateTime.MaxValue代替,但我更喜欢使用可空类型:

DateTime? nullableDate;
dateSample.Value = null;

答案 2 :(得分:0)

您可以选择使用Nullable<DateTime>(别名DateTime?)。这使您能够在整个应用程序中将日期处理为null。

但是,我个人并不认为这是错误的,并且更喜欢第二条路径:您可以使用DateTime.MinValue(即01/01/0001)作为应用程序中有意义的常量并检查DateTime。数据访问层中的MinValue。

如果数据库是SQL Server且字段的类型为smalldatetime,则会溢出并在您尝试保存DateTime.MinValue时抛出异常。但是,Null可能存储在任何类型的数据库中。

这是你可以将字符串解析为可空类型的方法:

private delegate bool TryParseDelegate<T>(string s, out T t);
private static T? TryParseNullable<T>(string s, TryParseDelegate<T> tryParse) where T : struct
{
   if (string.IsNullOrEmpty(s))
       return null;
   T t;
   if(tryParse(s, out t))
      return t;
   return null;
}

用法:

var nullableDateTime = TryParseNullable<DateTime>("01/01/0001", DateTime.TryParse);

答案 3 :(得分:0)

你可以做一些像这样的事情C#有一些你可以使用的可空类型的功能 这样它会为你节省一些代码,它也会更加健壮。

Public int InsertData(int? ouId)
{

chkValue = ouId.HasValue ? ouId.Value : 0;
} 

答案 4 :(得分:0)

使用

DateTime dt; 
if(DateTime.TryParse(DatetImeValue.Tostring(),dt))   // datetimevalue is your db value
{
     datetimeproperty = dt;   // in your class declare it as DateTime? datetimeproperty 
}
else
{
    datetimeproperty = null;
}

显示检查为null时,如果其null设置为空。

<强> [更新]

做一件事,保持属性可以为空。在您的数据库中。设置字段以允许null并在参数user @DateTimeParam = null。

或快速解决方法使数据库字段和参数VARCHAR安装在日期时间,参数通过DATETIMEVALUE.TOSHORTDATESTRING()并检查用户是否跳过 在参数中输入STRING.EMPTY。以这种方式,您将很容易显示日期和时间。如果你不需要,你不需要在时间部分丢弃或擦掉

答案 5 :(得分:0)

obj.BirthDate = Convert.ToDateTime(string.IsNullOrEmpty(txtBirthDate.Text.ToString()) ? System.Data.SqlTypes.SqlDateTime.MinValue.Value : Convert.ToDateTime(txtBirthDate.Text.ToString()));

答案 6 :(得分:-2)

您可以在传递到数据库时使用它。

object datetimeObj = null;
if (datetimefromUI == DateTime.MinValue) // This is put in the DateTime object by default
    datetimeObj = DBNull.Value;
else
    datetimeObj = datetimefromUI;

// Post datetimeObj to parameter in database...