Исключение переполнения SqlDateTime (от гггг-мм-дд до sqldatetime)

Я извлекаю строку в формате даты (гггг-мм-дд), затем преобразовываю ее в DateTime и вставляю в базу данных с помощью хранимой процедуры. Но я продолжаю получать

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

Столбец в моей таблице имеет тип date.

Я преобразую свою строку (например, 2016-01-15), вызывая DateTime.ParseExact(expirationDate, "yyyy-MM-dd", null), а затем беру это значение и вставляю его в качестве параметра в свою StoredProcedure и выполняю процедуру.

Но при использовании отладчика я вижу, что возвращаемое значение на самом деле является DateTime в формате yyyy-MM-dd HH:mm:ss.

это пример того, как выглядит код

string expirationDate = GetDate();
DateTime date = DateTime.ParseExact(expirationDate, "yyyy-MM-dd", null);

ExecuteMyStoredProc(date);

person user1021726    schedule 28.01.2014    source источник
comment
@shashwat: я видел эту ветку, но она не казалась точной копией моей проблемы (хотя я пробовал некоторые из их решений). Поэтому тот, кто редактировал мой вопрос, может удалить свое редактирование...   -  person user1021726    schedule 28.01.2014
comment
stackoverflow.com/questions/19018600/ См. эта ссылка. Это может помочь.   -  person bluejaded    schedule 28.01.2014
comment
DateTimes не имеют формат. Они отсчитывают 100-наносекундные интервалы с полуночи 01.01.0001. Когда вы говорите, что на самом деле это DateTime в формате yyyy-MM-dd HH:mm:ss. на самом деле вы говорите, что когда что-то (отладчик, окно вывода, элемент управления и т. д.) преобразует DateTime в строку, чтобы фактически отобразить ее вам, используется определенный формат. Это артефакт того, что выполняет преобразование, а не нечто, присущее значению DateTime.   -  person Damien_The_Unbeliever    schedule 28.01.2014
comment
@Damien_The_Unbeliever хорошо, не знал этого   -  person user1021726    schedule 28.01.2014


Ответы (4)


DateTime convertedInitDate = DateTime.ParseExact(initDate, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
      cCCBEntities.initDate = convertedInitDate;

Приведенный выше код - это код, который я использовал, когда столкнулся с той же проблемой, которую я продолжал искать уже около 5 часов. К счастью, моя проблема была решена с помощью приведенного выше кода.

Заметки:

  1. Я использовал MVC в Visual Studio для разработки веб-приложения с использованием сервера sql.
  2. cCCCBEntities — это имя моей сущности, которую я использовал
  3. Этот ответ был ответом, который я получил выше от пользователя 326608, я просто пока не могу проголосовать за него, поэтому я решил поместить его в комментарий здесь, чтобы подчеркнуть, что именно он решил мою проблему.
  4. Кроме того, хотя я также использовал SP при сохранении в БД, мне не нужно было следовать его рекомендации по изменению SP, если вы все еще сталкиваетесь с проблемой, следуйте инструкциям пользователя326608 по изменению вашего кода SP.
person iamjoshua    schedule 05.06.2017

Вы можете сделать так

string expirationDate = GetDate();
string date = Convert.DateTime(expirationDate).ToString("yyyy-MM-dd");
person Chirag    schedule 28.01.2014

Просто попробуй так

    string expirationDate = DateTime.Now.ToString();
    string date = Convert.ToDateTime(expirationDate).ToString("yyyy-MM-dd");
    DateTime dt = DateTime.ParseExact(date, "yyyy-MM-dd", null);
    ExecuteMyStoredProc(dt);
person Vignesh Kumar A    schedule 28.01.2014
comment
Вы предлагаете изменить тип моего столбца в базе данных? Потому что я не могу этого сделать. Или вы говорите о каком-то другом объекте .NET DateTime? - person user1021726; 28.01.2014
comment
Я прошу вас изменить столбец вашей базы данных, потому что он примет минимальную дату - person Vignesh Kumar A; 28.01.2014
comment
Я не могу просто изменить столбец базы данных, извините - person user1021726; 28.01.2014

Сначала, чтобы получить значимое значение даты в коде:

DateTime myDate = DateTime.ParseExact(expirationDate, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture)

Но вы все равно, возможно, получите значение времени в отладчике для myDate, поскольку это объект DateTime.

Ваш SP - следующая проблема. Измените его на что-то вроде:

INSERT INTO MyTable (MyDate) Values (Convert(DateTime,@expiration_date,111)) --yyyy/mm/dd

Коды преобразования для SQL Server находятся здесь.

person user326608    schedule 28.01.2014