我正在尝试使用linq在sqlserver中插入DateTime值。 csharp端的DateTime值可以为null。 sqlserver中的相应字段是可以为空的datetime字段。以下是我的代码:
using (var dataContext = GetDataContext())
{
DateTime dateTime;
var combinedWorkBasket = new CombinedWorkBasket()
{
FirstName = combinedWorkbasketData.FirstName,
LastName = combinedWorkbasketData.LastName,
Address1 = combinedWorkbasketData.Address1,
RetirementDate = Convert.ToDateTime(combinedWorkbasketData.RetirementDate),
};
dataContext.CombinedWorkBaskets.InsertOnSubmit(combinedWorkBasket);
dataContext.SubmitChanges();
}
当combinedWorkbasketData.RetirementDate碰巧为null(这是一个字符串值,可能是有效日期或null)时,sqlserver会抛出错误,指出日期应该在范围内。当combinedWorkbasketData.RetirementDate恰好为null时,Convert.ToDateTime(combinedWorkbasketData.RetirementDate)将转换为某些内部数据值。我尝试了以下,仍然是同样的问题。
RetirementDate = DateTime.TryParse(combinedWorkbasketData.RetirementDate, out temp) ? Convert.ToDateTime(combinedWorkbasketData.RetirementDate) : Convert.ToDateTime(null)
我只想完成以下操作:当combinedWorkbasketData.RetirementDate是有效日期插入RetirementDate时,否则不要插入它但插入其他值,如Firstname等
由于
答案 0 :(得分:1)
您可能希望使用可为空的数据类型,但这仅在您的数据库允许RetirementDate列中的空值时才有用。此外,您还必须使CombinedWorkBasket类中的RetirementDate字段可以为空。
using (var dataContext = GetDataContext())
{
DateTime? dateTime;
var combinedWorkBasket = new CombinedWorkBasket()
{
FirstName = combinedWorkbasketData.FirstName,
LastName = combinedWorkbasketData.LastName,
Address1 = combinedWorkbasketData.Address1,
RetirementDate = combinedWorkbasketData.RetirementDate != null ?
Convert.ToDateTime(combinedWorkbasketData.RetirementDate) : null;
};
dataContext.CombinedWorkBaskets.InsertOnSubmit(combinedWorkBasket);
dataContext.SubmitChanges();
}
答案 1 :(得分:1)
问题是datetime不保存null值,但它保持最小时间,即这样的事情。 '1/1/0001 12:00:00 AM'。 而不是直接传递日期时间尝试使用
DateTime.MinValue== Convert.ToDateTime(combinedWorkbasketData.RetirementDate)?Null:Convert.ToDateTime(combinedWorkbasketData.RetirementDate)
我没有测试代码使用它作为参考你可能需要一些改进。
答案 2 :(得分:0)
我认为RetirementDate必须是可以为实体框架插入DBNull的可空类型。
所以让它像
public class CombinedWorkBasket
{
// other fields
public DateTime? RetirementDate { get; set; }
}
然后尝试按照逻辑分配Null,并在数据库中将关联列指定为“Allow Null”。
希望它会插入null。