Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在DateTime列中插入空值?_C#_Asp.net_Sql Server 2008 R2 - Fatal编程技术网

C# 如何在DateTime列中插入空值?

C# 如何在DateTime列中插入空值?,c#,asp.net,sql-server-2008-r2,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.Par

我试图将空值存储到
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;
    }
}
IF DATEDIFF(DD, @DATE, '1/1/1753') = 0
    SET @DATE = NULL

代码工作正常,只要在SaldPurryLyDyE.Authver中存在正确的日期,但在存在空白文本框时抛出错误。

< P>不能将<代码> DATESTIME//COD>属性设置为NULL,因为<代码> DATESTIME/COD>是一个值类型。您需要将其更改为
Nullable
(又称
DateTime?
)属性,然后确保在存储层中对其进行了适当的处理。目前还不清楚是什么在执行数据库交互

你应该仔细阅读

您还需要更改代码,使其实际具有
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_豁免设置为可为空的日期时间,那么您可以这样做:

 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数据类型使其可为null,类似如下:

DateTime? nullableDateTime = null;

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

所以

不起作用,你需要去做

DateTime? SLA_DELIVERY_DATE_WAIVER { get; set; }

Nullable SLA_DELIVERY_DATE_弃权{get;set;}

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

< p>当有空白文本框时会出现异常,因为当字符串解析时是一个空字符串。 改用

从您的问题来看,它看起来像是
cm。SLA_交付\u日期\u豁免
DateTime
,将其类型更改为
DateTime?
,以便在文本框为空的情况下: -
TryParseExact()
不会失败
-
cm.SLA\u DELIVERY\u DATE\u弃权
将能够存储空值

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

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

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;
    }
}
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设置为空,并将其发送到存储过程。

是否尝试使用DateTime?var=null;试用DateTime.TryParseExact()非常感谢您的帮助。声明“ChangeModule”类时,我已声明SLA_DELIVERY_DATE_弃权字段仅可为null。@Ashok:不清楚您的意思,但它必须是
Nullable
类型。我的问题是null DATE没有像我在帖子中指定的那样插入到数据库中。显示以下错误:现在和以前一样:过程或函数“usp_SaveECR”需要参数“@SLA_DELIVERY_DATE_弃权”,但未提供该参数。@Ashok:这将是您未显示的代码的一部分。您只显示了UI代码,而不是与数据库对话的代码。谢谢您的回复。您提供的解决方案出现以下错误:无法确定条件表达式的类型,因为“”和“”系统之间没有隐式转换。DateTime’抱歉,我想我说得不够清楚。我的代码示例要求SLA_交付_日期_豁免设置为可空。看起来很多人都在说同样的话。基本上,在ChangeModule类中,您必须将DateTime SLA\u DELIVERY\u DATE\u弃权的行更改为DateTime?SLA\交付\日期\弃权。不过,这可能会在你的应用程序中产生很大的影响,所以要小心操作,并进行大量测试。祝你好运是的,我已经这样做了。我的问题是存储过程insert语句。@Ashok如果在post中显示该过程和确切的异常文本,则不会有什么坏处。请在将参数传递给存储过程时尝试此操作。。DBNULL.Value
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;
}