Передача null в качестве значения SQLParameter DateTime

У меня есть следующий запрос:

INSERT INTO CWS_FORWARDING_PROFILE
           (TNR_COMPANY_PROFILE,BOL_FORWARD_MAIL,BOL_FORWARD_SMS,BOL_FORWARD_MESSAGES
           ,DT_MO_FROM1,DT_MO_FROM2,DT_MO_FROM3,DT_MO_TO1,DT_MO_TO2,DT_MO_TO3
           ,DT_TU_FROM1,DT_TU_FROM2,DT_TU_FROM3,DT_TU_TO1,DT_TU_TO2,DT_TU_TO3
           ,DT_WE_FROM1,DT_WE_FROM2,DT_WE_FROM3,DT_WE_TO1,DT_WE_TO2,DT_WE_TO3
           ,DT_TH_FROM1,DT_TH_FROM2,DT_TH_FROM3,DT_TH_TO1,DT_TH_TO2,DT_TH_TO3
           ,DT_FR_FROM1,DT_FR_FROM2,DT_FR_FROM3,DT_FR_TO1,DT_FR_TO2,DT_FR_TO3
           ,DT_SA_FROM1,DT_SA_FROM2,DT_SA_FROM3,DT_SA_TO1,DT_SA_TO2,DT_SA_TO3
           ,DT_SU_FROM1,DT_SU_FROM2,DT_SU_FROM3,DT_SU_TO1,DT_SU_TO2,DT_SU_TO3)

            VALUES(@tnrProfile, @forwardMail, @forwardSms, @forwardMessages,
                    @MoFrom1, @MoFrom2, @MoFrom3, @MoTo1, @MoTo2, @MoTo3,
                    @TuFrom1, @TuFrom2, @TuFrom3, @TuTo1, @TuTo2, @TuTo3,
                    @WeFrom1, @WeFrom2, @WeFrom3, @WeTo1, @WeTo2, @WeTo3,
                    @ThFrom1, @ThFrom2, @ThFrom3, @ThTo1, @ThTo2, @ThTo3,
                    @FrFrom1, @FrFrom2, @FrFrom3, @FrTo1, @FrTo2, @FrTo3,
                    @SaFrom1, @SaFrom2, @SaFrom3, @SaTo1, @SaTo2, @SaTo3,
                    @SuFrom1, @SuFrom2, @SuFrom3, @SuTo1, @SuTo2, @SuTo3);

Я добавляю свои параметры DateTime следующим образом:

SqlParameter moFrom1Param = new SqlParameter("@MoFrom1", dTOForwarding.MoFrom1);
            moFrom1Param.IsNullable = true;
            moFrom1Param.Direction = ParameterDirection.Input;
            moFrom1Param.SqlDbType = SqlDbType.DateTime;
            cmd.Parameters.Add(moFrom1Param);

Когда я выполняю это, но даю только фактическую дату и время определенным параметрам, а все остальное равно нулю. Чтобы было ясно, все параметры с понедельника по среду имеют значение даты и времени. Остаток четверга до воскресенья не имеет. Таким образом, они передаются как null. Я получаю такую ​​​​ошибку:

The parameterized query '(@tnrProfile int,@forwardMail bit,@forwardSms bit,@forwardMessag' expects the parameter '@ThFrom1', which was not supplied.

Я искал некоторые ответы здесь, в stackoverflow и google, но ответы, которые я нашел, никогда не работали для меня.

Итак, мой вопрос: как я могу убедиться, что если мой параметр DateTime имеет нулевое значение как значение, это значение понимается sql и фактически передается как нулевое вместо того, чтобы сообщать мне, что параметр не был предоставлен.

Надеюсь, кто-нибудь здесь может мне помочь.

Спасибо.

редактировать: это решение:

SqlParameter moFrom1Param = new SqlParameter("@MoFrom1", dTOForwarding.MoFrom1 == null ?
                (Object)DBNull.Value : dTOForwarding.MoFrom1);
            moFrom1Param.IsNullable = true;
            moFrom1Param.Direction = ParameterDirection.Input;
            moFrom1Param.SqlDbType = SqlDbType.DateTime;
            cmd.Parameters.Add(moFrom1Param);

person JeremyVm    schedule 21.09.2011    source источник
comment
Рассматривали ли вы возможность нормализовать свои данные, чтобы хранить только те пары «От/Ку», которые действительно существуют, и вы могли бы справиться с более чем тремя?   -  person Damien_The_Unbeliever    schedule 21.09.2011


Ответы (5)


Вы пробовали DBNull.Value?

SqlParameter moFrom1Param;
if (dTOForwarding.MoFrom1 != null)
    moFrom1Param = new SqlParameter("@MoFrom1", dTOForwarding.MoFrom1);  
else
    moFrom1Param = new SqlParameter("@MoFrom1", DBNull.Value);  

также ваш код показывает «@MoFrom1», но ошибка связана с @ThFrom1

person Guillaume    schedule 21.09.2011
comment
Гийом, я только что попробовал это. Он не компилируется. Оператор '??' нельзя применять к операндам типа SqlParameter и DBNull. - person JeremyVm; 21.09.2011
comment
Гийом, я передаю все параметры. Я только что показал, как я добавляю 1 параметр. Я делаю то же самое для всех остальных. Всего 47, из которых 42 — DateTime. - person JeremyVm; 21.09.2011
comment
Отредактировал мой ответ, чтобы удалить ?? оператор и выполните логику с правильным значением. - person Guillaume; 21.09.2011
comment
Это решение сработало для меня с нулевым DateTime. Другие решения не сработали. - person Christian Davén; 17.04.2015

похоже, вы не присваиваете нулевое значение, что-то вроде этого:

var thFrom1Param = new SqlParameter("@ThFrom1", SqlDbType.SqlDateTime);
thFrom1Param.Value = DBNull.Value;
thFrom1Param.Direction = ParameterDirection.Input;
person Davide Piras    schedule 21.09.2011

Используйте нулевой оператор объединения ?? в сочетании с DBNull.Value:

SqlParameter moFrom1Param;

moFrom1Param = new SqlParameter( "@MoFrom1", dTOForwarding.MoFrom1 ?? DBNull.Value );  
person SetFreeByTruth    schedule 27.01.2014

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

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

        DateTime? myDate;

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

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

person Diomedes    schedule 26.11.2013

person    schedule
comment
Когда я пытаюсь это сделать, я получаю следующую ошибку: Тип условного выражения не может быть определен, потому что нет неявного преобразования между «System.DBNull» и «System.Data.SqlClient.SqlParameter». - person JeremyVm; 21.09.2011
comment
Спасибо! Это помогло мне получить правильный ответ :) Просто нужно было добавить приведение к DBNull.Value, чтобы заставить его работать. - person JeremyVm; 21.09.2011
comment
Удивлен, что ему понадобился актерский состав, но рад, что вы все равно разобрались :) - person iDevForFun; 21.09.2011
comment
Спасибо, Джереми. Мне нужно (object)DBNull.Value - person Ian; 20.11.2017