【问题标题】:Set an empty DateTime variable设置一个空的 DateTime 变量
【发布时间】:2012-04-16 11:48:07
【问题描述】:

我会像这样声明一个空字符串变量:

    string myString = string.Empty;

“日期时间”变量是否有等价物?

更新:

问题是我使用这个“DateTime”作为 SQL 中“StoredProcedure”的参数。 例如:

    DateTime? someDate = null;
    myCommand.Parameters.AddWithValue("@SurgeryDate", someDate);

当我运行此代码时,捕获到一个异常,告诉我“StoredProcedure”需要一个“@SurgeryDate”参数。 但我提供了。 知道为什么吗?

【问题讨论】:

    标签: c# sql datetime


    【解决方案1】:

    由于DateTime 是一种值类型,您不能将null 分配给它,但正是针对这些情况(没有值)引入了Nullable<T> - 请改用可为空的DateTime

    DateTime? myTime = null;
    

    【讨论】:

    • 此“可空”日期时间是否适合日期时间类型的 SQL 数据库列?我是新手。
    • 是 - 如果该列允许插入空值
    • @PhaDaPhunk 大多数数据库都会设置是否可以将值设置为 null。
    • 正如我之前所说,您应该检查您的数据库架构。列是否可以为空是一个设置;你需要检查它是否设置,如果没有设置它。
    • @PhaDaPhunk:在这种情况下,您必须检查null 并插入DBNull.Value,否则myTime.Value
    【解决方案2】:

    没有。你有两个选择:

    DateTime date = DateTime.MinValue;
    

    这适用于你需要每隔 X 时间做某事(因为你总是会超过 MinValue)但实际上可能会导致细微的错误(例如使用一些运算符而不首先检查你是否不是 @987654323 @) 如果你不小心的话。

    你可以使用Nullable:

    DateTime? date = null;
    

    这很好,并且在只引入 1 或 2 时避免了大多数问题。

    这真的取决于你想要达到的目标。

    【讨论】:

      【解决方案3】:

      您可以将 DateTime 变量设置为“1/1/0001 00:00:00”,但变量本身不能为空。要获得此 MinTime,请使用:

      DateTime variableName = DateTime.MinValue;
      

      【讨论】:

        【解决方案4】:

        您可能希望使用可为空的日期时间。 Datetime? someDate = null;

        您可能会发现有人在这种情况下使用DateTime.MaxDateTime.Min,但我非常怀疑您是否愿意这样做。它会导致出现边缘情况的错误、难以阅读的代码等。

        【讨论】:

          【解决方案5】:

          您使用的方法 (AddWithValue) 不会将 null 值转换为数据库空值。你应该改用DBNull.Value

          myCommand.Parameters.AddWithValue(
              "@SurgeryDate", 
              someDate == null ? DBNull.Value : (object)someDate
          );
          

          如果不是null,这将传递someDate 值,否则传递DBNull.Value。在这种情况下,正确的值将被传递到数据库。

          【讨论】:

          • 好的,我喜欢这种方法,但你能解释一下最后一行吗?
          • @PhaDaPhunk:这是针对更一般的场景 - 您有一个 Nullable<DateTime> 类型的变量 someDate。如果它的值为null,我将DBNull.Value 传递给AddWithValue 方法。否则我会传递值本身。
          • 谢谢,我不知道我们能做到这一点!
          【解决方案6】:

          要么:

          DateTime dt = new DateTime();
          

          DateTime dt = default(DateTime);
          

          【讨论】:

            【解决方案7】:

            如果您将日期设置为

            DateTime dNewDate = new DateTime();
            

            值设置为 {1/1/0001 12:00:00 AM}

            【讨论】:

              【解决方案8】:

              选项 1:使用可为空的 DateTime?

              选项 2:使用 DateTime.MinValue

              就个人而言,我更喜欢选项 1。

              【讨论】:

                【解决方案9】:

                string 是一个字符序列。所以有一个空的string 是有意义的,它只是一个空的字符序列。

                但是DateTime 只是一个单一的值,所以谈论“空”DateTime 是没有意义的。

                如果要表示“无价值”的概念,在.Net 中表示为null。如果你想将它与值类型一起使用,你需要明确地使它们可以为空。这意味着要么使用Nullable<DateTime>,要么使用等效的DateTime?

                DateTime(就像所有值类型一样)也有一个默认值,它分配给未初始化的字段,您也可以通过new DateTime()default(DateTime) 获取它。但您可能不想使用它,因为它代表有效日期:1.1.0001 0:00:00。

                【讨论】:

                  【解决方案10】:

                  没有空日期本身,你的意思是这样的:

                  DateTime? myDateTime = null;
                  

                  【讨论】:

                    【解决方案11】:

                    .addwithvalue 需要 dbnull。 你可以这样做:

                    DateTime? someDate = null;
                    //...
                    if (someDate == null)
                        myCommand.Parameters.AddWithValue("@SurgeryDate", DBnull.value);
                    

                    或者使用方法扩展...

                      public static class Extensions
                        {
                            public static SqlParameter AddWithNullValue(this SqlParameterCollection collection, string parameterName, object value)
                            {
                                if (value == null)
                                    return collection.AddWithValue(parameterName, DBNull.Value);
                                else
                                    return collection.AddWithValue(parameterName, value);
                            }
                        }
                    

                    【讨论】:

                      【解决方案12】:

                      这适用于可以为空的 dateTime 参数

                      。 .

                      SearchUsingDate(DateTime? StartDate, DateTime? EndDate){
                           DateTime LastDate;
                           if (EndDate != null)
                             {
                                LastDate = (DateTime)EndDate;
                                LastDate = LastDate.AddDays(1);
                                EndDate = LastDate;
                              }
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-05-08
                        • 2021-01-15
                        • 2011-11-03
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-09-18
                        • 1970-01-01
                        相关资源
                        最近更新 更多