Как вставить нулевое значение в столбец DateTime? - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь сохранить нулевое значение в столбце DateTime.Мой код выглядит следующим образом:

protected void btnInsert_Click(object sender, EventArgs e)
{
    try
    {
        ChangeModule cm = new ChangeModule();
        cm.CR_REF_NO = txtCRRefNumber.Text.Trim();
        cm.SLA_DELIVERY_DATE_WAIVER = DateTime.ParseExact(txtSLADeliveryDateWaiver.Text, "dd/MM/yy", null);
        else /*This else part is causing problem since I assigned null*/
             cm.SLA_DELIVERY_DATE_WAIVER = null;
    }
    catch (Exception ex)
    {
       throw ex;
    }
}

Код работает нормально, пока в SLA_DELIVERY_DATE_WAIVER существует правильная дата, но выдается ошибка при наличии пустого текстового поля.

Ответы [ 9 ]

2 голосов
/ 12 сентября 2011

Нельзя установить для свойства DateTime значение null, поскольку DateTime является типом значения.Вам нужно изменить его на свойство Nullable<DateTime> (он же DateTime?) - и затем убедиться, что оно обрабатывается соответствующим образом на вашем уровне хранения.Пока неясно, что в данный момент выполняет взаимодействие с базой данных.

Вы должны прочитать о Типах значений Nullable на MSDN .

Вам также нужно изменить код нана самом деле есть оператор if, например

DateTime dt;
if (DateTime.TryParseExact(txtSLADeliveryDateWaiver.Text,
                           "dd/MM/yy", null, DateTimeStyles.None, out dt))
{
    cm.SLA_DELIVERY_DATE_WAIVER = dt;
}
else
{
    cm.SLA_DELIVERY_DATE_WAIVER = null;
}

(Вы также должны избавиться от блока try / catch - это на самом деле наносит вред вашему коду, так как он в настоящее время маскирует источникисключений, даже если не загромождать это.)

0 голосов
/ 14 мая 2016
try
{
    ChangeModule cm = new ChangeModule();
    cm.CR_REF_NO = txtCRRefNumber.Text.Trim();
    cm.SLA_DELIVERY_DATE_WAIVER = DateTime.ParseExact(txtSLADeliveryDateWaiver.Text, "dd/MM/yy", null);
    else
         cm.SLA_DELIVERY_DATE_WAIVER = DBNULL.Value;
}
catch (Exception ex)
{
   throw ex;
}
0 голосов
/ 16 февраля 2015
if (dtProcessStart.Text.Trim() == "")
{
    cmd.Parameters.Add("@ProcessStartDttm", SqlDbType.DateTime).Value = DBNull.Value;
}
0 голосов
/ 26 ноября 2013

Изменение хранимой процедуры работает, но я думаю, что это немного небрежно.

Вы можете обработать это в коде, эта работа для меня:

            DateTime? myDate;

        if (TextBoxWithDate.Text != "")
        {
            myDate = DateTime.Parse(TextBoxWithDate.Text);
        }
        else
        {
            myDate = null;
        }

Сделайте myDate DateTime типом, но обнуляемым, если значение из текстового поля равно нулю, сделайте myDate пустым и отправьте его в хранимую процедуру.

0 голосов
/ 19 сентября 2011

Проблема заключается в отправке нулевых значений в параметры даты в хранимых процедурах сервера SQL.Следовательно, всякий раз, когда есть необходимость передать нулевую дату из внешнего приложения, передайте некоторое количество мин.например, «1/1/1753».

Внутри хранимой процедуры SQL Server проверьте нулевую дату, как показано ниже:

IF DATEDIFF(DD, @DATE, '1/1/1753') = 0
    SET @DATE = NULL

Теперь вы можете использовать @DATE внутри SQLХранимая процедура на сервере, как вам нравится.

0 голосов
/ 12 сентября 2011

Вы получили исключение, когда есть пустое текстовое поле, потому что DateTime.ParseExact () выдало исключение FormatException, когда строка для анализа - пустая строка.Вместо этого используйте DateTime.TryParseExact () .

По вашему вопросу похоже, что cm.SLA_DELIVERY_DATE_WAIVER равно DateTime, измените его тип на DateTime?, поэтому в случае пустого текстового поля: - TryParseExact() не выйдет из строя - cm.SLA_DELIVERY_DATE_WAIVER сможет сохранить значение NULL

0 голосов
/ 12 сентября 2011

DateTime не является Nullable как таковым, вам нужно указать его как Nullable, как уже отмечалось.

Так

DateTime SLA_DELIVERY_DATE_WAIVER { get; set; }

не работает, нужно сделать

DateTime? SLA_DELIVERY_DATE_WAIVER { get; set; }

или

Nullable<DateTime> SLA_DELIVERY_DATE_WAIVER { get; set; }

Вы храните это в базе данных? Тогда вам нужен столбец, который можно обнулять.

0 голосов
/ 12 сентября 2011

DateTime не может иметь значение null, но, добавляя знак вопроса '?' в типе данных перед или DateTime, в то время как объявление делает его обнуляемым, что-то вроде этого:

DateTime? nullableDateTime = null;
0 голосов
/ 12 сентября 2011

Если вы сделаете SLA_DELIVERY_DATE_WAIVER обнуляемым DateTime, то вы можете сделать это:

 protected void btnInsert_Click(object sender, EventArgs e)
    {
        try
        {
            ChangeModule cm = new ChangeModule();
            cm.CR_REF_NO = txtCRRefNumber.Text.Trim();
            cm.SLA_DELIVERY_DATE_WAIVER = String.IsNullOrEmpty(txtSLADeliveryDateWaiver.Text)? null : DateTime.ParseExact(txtSLADeliveryDateWaiver.Text, "dd/MM/yy", null);

        }
        catch (Exception ex)
        {
           throw ex;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...