2013-04-17 3 views
10

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

переполнение 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-сервере, похоже, в порядке.

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

Редактировать

Я не думаю, что это помогло бы (это слишком просто, чтобы иметь какие-либо ошибки, 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

возможный дубликат http://stackoverflow.com/questions/3399061/error -sqldatetime-overflow-must-be-between-1-1-1753-120000-am-and-12-31-999 –

+4

Может ли это быть DMY/MDY? то есть будет 12-04-2013 18:03:13 в порядке? – paul

+5

Помните, что 'db.SubmitChanges()' применяет каждое изменение с момента последнего вызова 'SubmitChanges()' или создало контекст. Вы можете определить, что все изменения связаны с просмотром 'db.GetChangeSet()'. Любой столбец даты/времени для любого затронутого объекта может быть причиной - например, если какое-либо время datetime приходит с по умолчанию 'DateTime.MinValue', оно выходит за пределы диапазона для SQL Server. – mellamokb

ответ

2

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

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

  • Database изменить тип поля из DateTime в DateTime2

  • запроса вы должны быть явно

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

вы можете найти futher информацию here, here и here

+0

Помогло изменить тип на 'datetime2', но я до сих пор не знаю, почему он перестал работать для' datetime' – Lemurr

+0

@PabloLemurr, возможно, было где-то обновлено, что приводит к вашей проблеме – WiiMaxx

+0

DateTime2 поддерживает более широкий диапазон дат (0001-01 От -01 до 9999-12-31), что предполагает, что дата, переданная в sql, фактически находится вне диапазона для DateTime и, возможно, DateTime.MinValue). – sgmoore

1

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

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

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

+0

Дата, отправленная моей БД, в том формате, который я предоставил в сообщении, и он не работает, но когда я вставляю строку вручную из SMSS, она отлично работает. И у меня есть это поле onyl DateTime, которое начало вызывать проблему. – Lemurr

+0

Можете ли вы изменить его для использования конфигурации ISO (ГГГГ-ММ-ДД)? Я думаю, что более надежно для значений даты – wizzardmr42

+0

+1, забыв инициализировать поле DateTime, является наиболее распространенным способом получения даты вне диапазона 'SqlDateTime'. – Joe

Смежные вопросы