Linq和日期时间验证

时间:2012-08-28 06:50:22

标签: c# sql-server datetime

我正在尝试使用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等

由于

3 个答案:

答案 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。