Невозможно вставить DateTime по умолчанию из С# в SQL Server 2008

Я работаю над проектом консольного приложения С#. Попытка вставить значение DateTime в SQL Server 2008, и это работает хорошо. В случае, если мой код не работает, я хочу вставить по умолчанию DateTime в таблицу в базе данных.

При попытке вставить выдает ошибку.

Исключение SqlTypeException не было обработано:
переполнение SqlDateTime. Должно быть между 01.01.1753 00:00 и 31.12.9999 23:59:59.

Ниже я вставил конкретный код.

try
{
  ...
  return DateTime.Now;
}

catch (WebException ex)
{
  ...
  return default(DateTime);
}

Код, который я использовал для вставки сведений в таблицу LOGS:

connection.Open();
for (int i = 0; i < LogList.Count; i++)
    {
        string aprocessLogQuery = "INSERT INTO PROCESS_LOGS VALUES (@fileId, @startTime, @endTime, @transferredTime)";
        command = new SqlCommand(aprocessLogQuery, connection);
        command.Parameters.Add("fileId", SqlDbType.Int).Value = LogList[i].fileId;
        command.Parameters.Add("startTime", SqlDbType.DateTime).Value = LogList[i].fileGeneration_StartDateTime;
        command.Parameters.Add("endTime", SqlDbType.DateTime).Value = LogList[i].fileGeneration_EndDateTime;
        command.Parameters.Add("transferredTime", SqlDbType.DateTime).Value = LogList[i].fileTransferred_DateTime;
        dataReader.Close();
        dataReader = command.ExecuteReader();
    }
connection.Close();

Значение по умолчанию DateTime равно 01/01/0001 12:00:00 AM, поэтому оно не работает. Может ли кто-нибудь предложить альтернативное рабочее решение?

Спасибо


person Praveen    schedule 06.06.2013    source источник
comment
вы должны использовать тип данных datetime2   -  person V4Vendetta    schedule 06.06.2013
comment
Было бы неплохо использовать SqlParameter вместо строк. Всякий раз, когда я вижу строковый запрос, я вижу риск SQL-инъекции...   -  person Kamil T    schedule 06.06.2013
comment
Взгляните на этот вопрос: он говорит, что вставка null datetime дает значение по умолчанию в базе данных.   -  person Spaceman    schedule 06.06.2013
comment
@V4Vendetta Спасибо за знакомство с datetime2. Но извините, у меня нет доступа для изменения типа данных в SQL Server.   -  person Praveen    schedule 06.06.2013
comment
DATETIME в SQL Server не поддерживает даты до 1753 года, поэтому, если вы не можете изменить тип данных SQL Server на DATETIME2 (который будет поддерживать 01/01/0001), вам нужно изменить код .NET, чтобы он возвращал 01/01/1900 или что-то подобное в качестве По умолчанию   -  person marc_s    schedule 06.06.2013
comment
@user1671639 user1671639 я предполагаю, что ваше поле не может принимать значения NULL, поэтому, если вы не можете изменить тип данных, вам придется передать минимальное значение даты и времени sql 1\1\1753   -  person V4Vendetta    schedule 06.06.2013
comment
@KamilT - они используют параметры.   -  person Martin Smith    schedule 06.06.2013


Ответы (4)


Другим альтернативным решением является то, что вы можете обойти метод расширения сборки, как показано ниже:

public static class DateTimeExtension
{
    public static DateTime DefaultSqlDateTime(this DateTime dateTime)
    {
       return new DateTime(1753, 1, 1, 12, 0, 0);
    }
}

а вместо return default(DateTime) можно использовать переменную dateTime return dateTime.DefaultSqlDateTime;

EDIT: Как использовать метод расширения:

E.g: return default(DateTime).GetDefaultSqlDateTime();

or

DateTime dateTime = ...
return dateTime.GetDefaultSqlDateTime();
person Toan Vo    schedule 06.06.2013
comment
Спасибо. Но return DateTime.DefaultSqlDateTime не работает. Не могли бы вы объяснить? - person Praveen; 06.06.2013
comment
@user1671639 user1671639 А, я вижу, вам интересно, как использовать метод расширения DefaultSqlDateTime. Пожалуйста, смотрите часть редактирования ниже. - person Toan Vo; 06.06.2013
comment
Я все еще не могу пройти через это. После ошибки Extension method must be defined in a non-generic static class - person Praveen; 06.06.2013
comment
да. Вы можете посмотреть ссылку: codeproject.com/Articles/19963/ чтобы лучше понять метод расширения для типа DateTime. Я применил много методов расширений для DateTime при работе с SQL Server, которые помогут вашему коду быть читабельным и более элегантным. - person Toan Vo; 06.06.2013

В базе данных неизвестная дата представлена ​​значением NULL. Вы можете вставить это как:

command.Parameters.AddWithValue("@startTime", DBNull.Value);

(Насколько мне известно, перед параметрами необходимо указывать префикс @.)

person Andomar    schedule 06.06.2013
comment
Префикс @ здесь необязателен. - person Martin Smith; 06.06.2013

Я использую эту функцию в своих утилитах вместо обычного TryParse.

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
    {
        bool valid = false;
        tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
        System.Data.SqlTypes.SqlDateTime sdt;
        if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
        {
            try
            {
                sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
                valid = true;
            }
            catch (System.Data.SqlTypes.SqlTypeException ex)
            {


            }
        }

        ret
person liorlevi1974    schedule 02.09.2014

Вы можете использовать это, это вернет минимальное значение даты, которое примет SQL. Этот метод возвращает DateTime в .Net.

System.Data.SqlTypes.SqlDateTime.MinValue.Value
person Ariwibawa    schedule 24.03.2021