Здравствуйте! Сегодня: Вт, 1 Дек 2020, Ваш IP: 18.232.146.10 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Базы данных
+ Создать новую тему Страница: 1
Тема: DateTime NULL? · +  +  дата добавления: 06.12.2011 / 23:21
Автор темы:
Павел
Павел
тем: 13 / ответов: 13 / благодарностей: 0 / репутация: 0
ответов: 13
создал(а) тем: 13


Всем привет.
Вопрос, скорее всего, самый обычный, но я так и не нашел ответа, который бы решил мою задачу.
Есть БД с полем типа date с возможностью значения NULL.
При вводе данных из SQL managenent никаких проблем. Но при попытке вводить данные (вернее не вводить никаких значений) программно я не могу занести значение NULL.
Я нашел в и-нете решение проблемы типа:
//(через метод)
public DateTime? GetDate()
{
    return string.IsNullOrEmpty(tbDate.Text) ? (DateTime?) null : DateTime.Parse(tbDate.Text);
}

//(или через поле)
public DateTime? DateTarget
{
    get 
        { 
            return (TargetTradingContract == null) ? (DateTime?)null : TargetTradingContract.Date;
        }
}
Но эти способы выдают на выходе значение {01.01.0001 0:00:00}, которое при вставке в БД приводит к исключению:
Переполнение SqlDateTime. Должно находиться в пределах от 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.
Для чего же тогда создавать возможность значения NULL, если туда нельзя ввести это значение?
Уверен, что решение есть, только пока не могу его найти. Кто подскажет?
Технологии: ASP .NET, C#, Microsoft SQL Server
 
Ответ # 1 # · +  +  дата добавления: 06.12.2011 / 23:31
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 0 / ответов: 20 / благодарностей: 3 / репутация: 0
ответов: 20
создал(а) тем: 0


Чтобы в базу записалось null, в c# нужно передавать не null, а DBNull.Value

Что касается дат и предельного интервала, то в SQL Server есть тип datetime2, который позволяет указывать любые даты, в отличие от datetime, где дата должна находиться в строго определенном интервале (сегодня +/- тройка сотен лет, точно нужно смотреть в документации).
 
Ответ # 2 # · +  +  дата добавления: 07.12.2011 / 01:21
Автор ответа:
Павел
Павел
тем: 13 / ответов: 13 / благодарностей: 0 / репутация: 0
ответов: 13
создал(а) тем: 13


Спасибо. Только не пойму, как это сделать - DBNull.Value нельзя присвоить переменной типа DateTime. Я имею в виду конструкцию :
return (TargetTradingContract == null) ? DBNULL.Value : TargetTradingContract.Date;
 
Ответ # 3 # · +  +  дата добавления: 07.12.2011 / 09:33
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


DBNull.Value нельзя присвоить переменной типа DateTime
И не только DateTime, но и к любому другому типу, исключая object

Все зависит от того, как данные попадают в базу. Обычно используется SqlCommand, если так, то нужно просто передать DBNull.Value в соответствующий параметр.

Если из функции GetDate, то она должна возвращать object, тогда можно будет использовать DBNull.Value.
 
Ответ # 4 # · +  +  дата добавления: 07.12.2011 / 10:32
Автор ответа:
Павел
Павел
тем: 13 / ответов: 13 / благодарностей: 0 / репутация: 0
ответов: 13
создал(а) тем: 13


Спасибо. Понял.
Вот код, к которому я пришел.

if (person.Birthday != DateTime.MinValue)
            UpdatePersonCommand.Parameters["@Birthday"].Value = person.Birthday;
        else
            UpdatePersonCommand.Parameters["@Birthday"].Value = DBNull.Value;

А покрасивее его можно изобразить?
 
Ответ # 5 # · +  +  дата добавления: 07.12.2011 / 12:15
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Да, вполне нормальный код.

Красивее, одной строкой, можно попробовать так:
UpdatePersonCommand.Parameters["@Birthday"].Value = (person.Birthday != DateTime.MinValue ? person.Birthday : DBNull.Value);

Еще можно хелпер-функцию написать, если подобный код нужен будет часто:
public static object GetDateValue(DateTime d)
{
  return (d != DateTime.MinValue ? d : DBNull.Value)
}
UpdatePersonCommand.Parameters["@Birthday"].Value = GetDateValue(person.Birthday);
 
Страница: 1 + Создать новую тему