【问题标题】:How can someone handle default datetime有人如何处理默认日期时间
【发布时间】:2012-06-07 13:06:17
【问题描述】:

我有 DAL,我将数据库空值转换为它们在 C# 中的等效表示。例如:

NULL for Numeric = 0
NULL for String = String.Empty
NULL for DateTime = "1/1/0001" (i.e. DateTime.MinValue)

日期的问题在于表示层,尤其是在 GridViews 中。您不能向用户显示1/1/01

我以前做的是检查if myDate.Year=1 or myDate.Year < AcceptedDate并显示空字符串,但似乎与其他类型不同

请愿意接受更好的方法。谢谢。

【问题讨论】:

  • 你不能只调整日期列的格式,以便显示 1/1/01(假定为 2001)而不是显示实际值 1/1/ 0001。这或可能在输入日期时将日期转换为字符串,以便它不会尝试更改日期。

标签: c# asp.net database data-formats


【解决方案1】:

使用Nullable 数据类型存储空值。

DateTime? value = null;
int? myNullableInt = 1;
value = DateTime.Now;

如何判断变量是否有值或为空

if (value!=null)

字符串值可以存储空值,因此字符串存储空值没有不同的数据类型。

string var;
if (var == null)

if (String.IsNullOrEmpty(var))

【讨论】:

  • +1。在检查 null 时,无论是那个还是 value.HasValue,不管你的船漂浮在哪里 :)
  • 此外,您可以在处理值类型的过程中重复此模式,即 SQLInt 的 NULL 可以是 int? default = null;。附带说明一下,字符串实际上是引用类型,可以赋值为null
  • 我同意。可空类型对此更好。为什么我没有考虑这种方法是因为我的数据库中需要这些字段。但是让它们在我的业务逻辑中可以为空意味着我必须在传递给数据库之前检查值
  • 如果你不检查 null 那么 null 将在数据库中更新。如果这些字段具有空值,您想要做什么。
【解决方案2】:

您也可以使用 DateTime.MinValue 常量。

http://msdn.microsoft.com/en-us/library/system.datetime.minvalue.aspx

你的条件是:

if (myDate == DateTime.MinValue)

【讨论】:

  • 当您必须在 GridView 中执行此操作时会很痛苦。然后你将不得不使用 TemplateField 而不是 BoundField
【解决方案3】:

您可以使用 Nullable DateTime,因此您将从 DAL 返回 DateTime? 而不是 DateTime。这样就可以检查返回值是否为空。

DateTime? dateTime = null;

【讨论】:

    【解决方案4】:

    正如其他人提到的,您可以使用System::Nullable<DateTime>

    我见过的另一种方法是使用标准的DateTime,而只使用一个特殊的值,例如DateTime.MinValue。如果您需要遵守现有接口的类型并且无法将 DateTime 更改为 Nullable<DateTime>,这将非常有用。

    【讨论】:

    • DateTime.MinValue = 1/1/01。是一样的。
    • 是的,但它是一个已定义的字段。网格检查 DateTime.MinValue 与 DAL 回馈的任何内容之间的相等性是微不足道的
    【解决方案5】:

    您可以按照其他人的建议使用 Nullable DateTime,也可以使用以下技巧: (以防止无效的默认值。)

    // If dateTime has not been initialize, initialize to Now
    // (or to any other legal inital values)
    dateTime = ((dateTime != new DateTime()) ? dateTime : DateTime.Now);
    

    如果您必须使用不可为空的 DateTime 并且想要提供默认值(如果没有),则此技巧很有用。 (例如,您在数据库中有一个不可为空的 DateTime 列,并且仅当行是新的时才想设置该值。)

    【讨论】:

    • 注意:new DateTime()DateTime.MinValue 相同。
    • @HansKesting 有趣,因为它似乎对某些系统来说是无效的日期。 (来自 MSDN:“这个常量的值相当于 00:00:00.0000000,0001 年 1 月 1 日。”--> 对于某些系统来说必须超出范围。)
    • SqlServer 将不接受此日期(将拒绝 1753 IIRC 之前的日期)
    • “如果我没记错的话” - 我不是 100% 确定 1753,但它是这样的
    • 所以你不能在数据库中使用SqlServer的内置类型来获取历史信息:-)
    【解决方案6】:

    我认为您别无选择,只能像以前一样进行检查并相应地显示。可以为空的类型可能会使您的事情变得更容易。根据您的数据,即使是数字也应该以这种方式处理。 DBNull != 0。

    【讨论】:

      猜你喜欢
      • 2012-12-07
      • 2012-11-02
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多