如何在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
属性设置为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_WAIVER
是DateTime
,将其类型更改为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
修改存储过程是有效的,但是我认为这有点草率。
你可以在代码中处理它,这对我来说很有效:
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;
}