我有一个带有日期输入文本框的表单。如果我提供日期一切都很好。如果我没有提供日期(我将其留空),则发送DateTime.min(1/1/0001)值。这会导致错误:将datetime2数据类型转换为日期时间数据类型会导致超出范围的值
我的日期属性定义为可为空:
public Nullable<System.DateTime> InstallDate { get; set; }
如果我不提供日期,我想要的是写入数据库的空值。 我知道我可以在我的更新方法中检查1/1/0001并发送null,但是,我必须这样做吗? 有解决这个问题的方法吗?谢谢
修改
我解决了将以下代码添加到我的更新方法中的问题:
tank.InstallDate = tank.InstallDate == DateTime.MinValue ? null : tank.InstallDate;
所以我的代码看起来像这样:
public void UpdateTank(Tank tank)
{
using (RetailFuelEntities ctx = new RetailFuelEntities())
{
tank.InstallDate = tank.InstallDate == DateTime.MinValue ? null : tank.InstallDate;
ctx.Tanks.Attach(tank);
ctx.Entry(tank).State = EntityState.Modified;
ctx.SaveChanges();
}
}
这是我的ObjectDataSource:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetTank"
TypeName="DataAccess.Fuel.EF4.Tanks" DataObjectTypeName="DataAccess.Fuel.EF4.Tank"
DeleteMethod="DeleteTank" InsertMethod="InsertTank" UpdateMethod="UpdateTank">
<SelectParameters>
<asp:ControlParameter ControlID="TextBoxTankId" Name="TankId" PropertyName="Text"
Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
我想知道是否可以避免空检查。
答案 0 :(得分:2)
问题是您的UI控件(FormView
)不会将空字符串转换为null
,而是转换为DateTime.MinValue
。您的财产很乐意接受这个值,因为它毕竟是一个有效的日期。
可以找到解决方案here。基本上,有一个专门针对这种情况的参数属性,它被称为ConvertEmptyStringToNull
。