Переполнение SqlDateTime при вводе значения с помощью DateTime.Now

В последнее время у меня довольно странная ошибка при попытке сделать db.SubmitChanges():

Переполнение SqlDateTime. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.

Дело в том, что я использую DateTime.Now для установки свойства в моем объекте, а после вызова Response.Write(DateTime.Now.ToString()); он показывает 17-04-2013 18:03:13, как и должно быть.

Раньше этого не происходило, и теперь функция всегда ломается. Я совершенно незнакомый - дата на моем SQL-сервере, похоже, в порядке.

Что может вызвать это?

Edit

Я не думаю, что это помогло бы (слишком просто иметь какие-то ошибки IMO), но там моя функция:

public bool ReportLogIn(int UserID, string IP, int Succeed ... ) {
    A_UserLoginHistory Report = new A_UserLoginHistory();

    Report.IP = IP;
    Report.UserID = UserID;
    Report.Status = Succeed;
    Report.Date = DateTime.Now; //the only DateTime field
    ...

    try {
        db.A_UserLoginRegistry.InsertOnSubmit(Report);
        db.SubmitChanges();
        return true;
    } catch (Exception e) {
        ErrorLog.AddError(e.ToString());
        return false;
    }
}

Ответ 1

на самом деле проблема SQL DateTime =/= C# Datetime

вам нужно изменить 2 вещи

  • База данных изменит тип поля с DateTime на DateTime2

  • Вы должны быть явным

    SqlCommand cmd = new SqlCommand("insertsomeDate", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@newDate", SqlDbType.DateTime2).Value = yourDate; //<- as example
    

вы можете найти более подробную информацию здесь, здесь и здесь

Ответ 2

Скорее всего, вы забыли инициализировать поле даты - вы уверены, что вы их установили и не добавили новый? Обычно я получаю это, когда добавляю новое поле даты в DBML, когда он пытается вставить 01/01/0001 00:00:00

Если это не помогло, установите New StringWriter в DB.Log, прежде чем выполнять DB.SubmitChanges и затем изучите DB.Log.ToString(можно сделать в отладчике). Это должно показать вам запрос и все параметры (внизу), чтобы вы могли увидеть совпадение с тем, какой параметр вызывает проблему.

Еще одна вещь, которая помогает в этой проблеме - использовать DB.GetChangeSet(), чтобы проверить, какие записи и быть вставлены/обновлены до вызова SubmitChanges (не могу представить, что удаление может вызвать это)