如何在DateTime列中插入空值?

时间:2011-09-12 13:45:56

标签: c# asp.net sql-server-2008-r2

我正在尝试将空值存储到DateTime列中。我的代码如下:

protected void btnInsert_Click(object sender, EventArgs e)
{
    try
    {
        ChangeModule cm = new ChangeModule();
        cm.CR_REF_NO = txtCRRefNumber.Text.Trim();
        cm.SLA_DELIVERY_DATE_WAIVER = DateTime.ParseExact(txtSLADeliveryDateWaiver.Text, "dd/MM/yy", null);
        else /*This else part is causing problem since I assigned null*/
             cm.SLA_DELIVERY_DATE_WAIVER = null;
    }
    catch (Exception ex)
    {
       throw ex;
    }
}

只要SLA_DELIVERY_DATE_WAIVER中存在正确的日期,代码就可以正常运行,但是当有空白文本框时会抛出错误。

9 个答案:

答案 0 :(得分:2)

您无法将DateTime属性设置为null,因为DateTime是值类型。您需要将其更改为Nullable<DateTime>(又名DateTime?)属性 - 然后确保在您的存储层中正确处理。目前还不清楚目前正在执行数据库交互的是什么。

您应该阅读Nullable Value Types on MSDN

您还需要将代码更改为实际拥有if语句,例如

DateTime dt;
if (DateTime.TryParseExact(txtSLADeliveryDateWaiver.Text,
                           "dd/MM/yy", null, DateTimeStyles.None, out dt))
{
    cm.SLA_DELIVERY_DATE_WAIVER = dt;
}
else
{
    cm.SLA_DELIVERY_DATE_WAIVER = null;
}

(你也应该摆脱try / catch块 - 它实际上是伤害你的代码,因为它当前会掩盖异常的来源,甚至除了混乱之外。)

答案 1 :(得分:0)

如果您使SLA_DELIVERY_DATE_WAIVER成为可以为空的DateTime,那么您可以这样做:

 protected void btnInsert_Click(object sender, EventArgs e)
    {
        try
        {
            ChangeModule cm = new ChangeModule();
            cm.CR_REF_NO = txtCRRefNumber.Text.Trim();
            cm.SLA_DELIVERY_DATE_WAIVER = String.IsNullOrEmpty(txtSLADeliveryDateWaiver.Text)? null : DateTime.ParseExact(txtSLADeliveryDateWaiver.Text, "dd/MM/yy", null);

        }
        catch (Exception ex)
        {
           throw ex;
        }
    }

答案 2 :(得分:0)

DateTime不能有null值,但添加问号“?”在声明的前面或DateTime数据类型使其可为空,如下所示:

DateTime? nullableDateTime = null;

答案 3 :(得分:0)

DateTime本身不是Nullable,您需要将其指定为Nullable,如前所述。

所以

DateTime SLA_DELIVERY_DATE_WAIVER { get; set; }

不会工作,你需要做

DateTime? SLA_DELIVERY_DATE_WAIVER { get; set; }

Nullable<DateTime> SLA_DELIVERY_DATE_WAIVER { get; set; }

您是否将其存储到数据库中?您需要该列也可以为空。

答案 4 :(得分:0)

当存在空白文本框时出现异常,因为当要解析的字符串为空字符串时,DateTime.ParseExact()抛出FormatException。 请改用DateTime.TryParseExact()

从您的问题来看,cm.SLA_DELIVERY_DATE_WAIVER似乎是DateTime,将其类型更改为DateTime?,以防空文本框:   - TryParseExact()不会失败   - cm.SLA_DELIVERY_DATE_WAIVER将能够存储NULL值

答案 5 :(得分:0)

将空值发送到sql server存储过程中的日期参数是一个问题。因此,每当需要从前端应用程序传递null日期时,请传递一些min。比如'1/1/1753'之类的日期。

在SQL Server内部存储过程中,检查如下所示的空日期:

IF DATEDIFF(DD, @DATE, '1/1/1753') = 0
    SET @DATE = NULL

现在,您可以在SQL Server存储过程中使用@DATE,但是您喜欢。

答案 6 :(得分:0)

修改存储过程有效,但我认为它有点草率。

你可以在代码中处理它,这对我有用:

            DateTime? myDate;

        if (TextBoxWithDate.Text != "")
        {
            myDate = DateTime.Parse(TextBoxWithDate.Text);
        }
        else
        {
            myDate = null;
        }

创建myDate DateTime类型但可以为空,如果文本框中的值为null,则将myDate设为null并将其发送到存储过程。

答案 7 :(得分:0)

if (dtProcessStart.Text.Trim() == "")
{
    cmd.Parameters.Add("@ProcessStartDttm", SqlDbType.DateTime).Value = DBNull.Value;
}

答案 8 :(得分:0)

proc sql;
  select id, 
         count(id) as count 
    from merged_dataset
      group by id
      having count > 1;
quit;