我正在尝试将空值存储到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中存在正确的日期,代码就可以正常运行,但是当有空白文本框时会抛出错误。
答案 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;