[英]Passing null as SQLParameter DateTime value
我有以下查詢:
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參數的值為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 );
修改存儲過程是有效的,但我認為它有點草率。
你可以在代碼中處理它,這對我有用:
DateTime? myDate;
if (TextBoxWithDate.Text != "")
{
myDate = DateTime.Parse(TextBoxWithDate.Text);
}
else
{
myDate = null;
}
使myDate DateTime類型可以為空,如果文本框中的值為null,則將myDate設為null並將其發送到存儲過程。
看起來你沒有分配空值,如下所示:
var thFrom1Param = new SqlParameter("@ThFrom1", SqlDbType.SqlDateTime);
thFrom1Param.Value = DBNull.Value;
thFrom1Param.Direction = ParameterDirection.Input;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.