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