如何在DateTime列中插入空值

本文关键字:插入 空值 DateTime | 更新日期: 2023-09-27 18:08:15

我试图将空值存储到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中存在适当的日期,代码就可以正常工作,但是当有空白文本框时抛出错误。

如何在DateTime列中插入空值

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

你应该在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块-它实际上是伤害你的代码,因为它目前会掩盖异常的来源,甚至弄乱它。)

如果您将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;
        }
    }

DateTime不能有null值,但是,添加问号'?'或DateTime数据类型,同时声明使其为空,像这样:

DateTime? nullableDateTime = null;

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; }

是否将其存储到数据库中?

当有空白文本框时,您会得到异常,因为DateTime.ParseExact()抛出FormatException,当要解析的字符串是空字符串时。使用DateTime.TryParseExact()代替。

从你的问题看来,cm.SLA_DELIVERY_DATE_WAIVERDateTime,将其类型更改为DateTime?,以便在空文本框的情况下:- TryParseExact()不会失败cm.SLA_DELIVERY_DATE_WAIVER将能够存储NULL值

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

在SQL Server存储过程中,检查是否为空日期,如下所示:

IF DATEDIFF(DD, @DATE, '1/1/1753') = 0
    SET @DATE = NULL
现在,你可以在SQL Server存储过程中使用@DATE。

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

你可以在代码中处理它,这对我来说很有效:

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

使myDate为DateTime类型,但可为空,如果文本框中的值为空,则使myDate为空并将其发送给存储过程

if (dtProcessStart.Text.Trim() == "")
{
    cmd.Parameters.Add("@ProcessStartDttm", SqlDbType.DateTime).Value = DBNull.Value;
}
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
         cm.SLA_DELIVERY_DATE_WAIVER = DBNULL.Value;
}
catch (Exception ex)
{
   throw ex;
}