将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); 

当我执行此操作时,只给出某些参数的实际日期时间,其余全部为空。 所以要明确的是,从星期一到星期三的所有参数都有一个日期时间值。 周四rest,直到星期天还没有。 所以那些传递为null。 我收到这样的错误:

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

我在stackoverflow和谷歌上找到了一些答案,但我发现的答案从来没有对我有用..

所以我的问题是,我怎样才能确保如果我的DateTime参数的值为null,则该值被sql理解并实际传递为null而不是告诉我参数未提供。

希望有人在这里可以帮助我。

谢谢。

编辑:这是解决方案:

 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); 

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

你试过DBNull.Value吗?

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

此外,您的代码显示“@ MoFrom1”,但错误与@ ThFrom1有关

使用null合并运算符 ??DBNull.Value

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

看起来你没有分配空值,如下所示:

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

修改存储过程是有效的,但我认为它有点草率。

你可以在代码中处理它,这对我有用:

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

使myDate DateTime类型可以为空,如果文本框中的值为null,则将myDate设为null并将其发送到存储过程。