在 SQL 服务器中解析日期时出现 SqlDateTime 溢出错误

SqlDateTime overflow error with parsing Date in SQL Server

我正在尝试将日期从 C# 保存到 SQL 服务器。首先要将日期格式显示为 dd/MM/yyyy 给用户。然后在 Winforms 屏幕上选择日期后。我想将它保存到数据库中。如果我删除代码中的 datetimePicker1.CustomFormat 行,它可以很好地保存到数据库中。但我想将日期格式显示为 dd/MM//yyyy。如何解决?

我收到此错误:

SqlDateTime overflow.Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

代码:

//c#   
DateTime fromDate;

public void SetMyCustomFormat()
{
    // Set the Format type and the CustomFormat string.
    //dateTimePicker1.Format = DateTimePickerFormat.Custom;
    dateTimePicker1.CustomFormat = "dd/MM/yyyy";

    DateTime.TryParse(dateTimePicker1.Text, out fromDate);
    fromDate = fromDate.Date;            
}

Sql DateTime 和 C# DateTime 类型具有不同的有效日期范围(因此它们不完全兼容)。

Sql日期时间只支持1753年1月1日到9999年12月31日。

问题是您的 TryParse 失败导致 fromDate 为 1/1/0001,Sql DateTime 类型不支持。

在 SQL 中使用 DateTime2 并始终验证解析是否成功。

http://msdn.microsoft.com/en-us/library/ms187819.aspx

http://msdn.microsoft.com/en-us/library/bb677335.aspx

更新:

而您的 TryParse 失败的原因是因为它需要 mm/dd/yyyy 格式。而不是使用 TryParse 使用:

bool success = DateTime.TryParseExact(dateTimePicker1.Text,
                   "dd/MM/yyyy",
                   CultureInfo.InvariantCulture,
                   DateTimeStyles.None,
                   out fromDate);

您没有包含关于 SQL 服务器在何处使用此值的任何代码,但是错误可能是由于 D/M/Y 格式造成的。这将导致问题,例如,12 月 31 日,因为它将作为文本 31/12/2014 传递,这通常会在转换为日期时导致问题(取决于区域设置)。

对于您的情况,只需使用 DateTimePicker.Value property 来提取日期。这将 return 一个 DateTime 类型,因此您不必解析该值。

DateTime fromDate;
public void SetMyCustomFormat()
{
    // Set the Format type and the CustomFormat string.
    dateTimePicker1.CustomFormat = "dd/MM/yyyy";
    fromDate = dateTimePicker1.Value.Date;            
}