簡體   English   中英

我的 SQLParameter 沒有正確傳遞 NULL

[英]My SQLParameter isn't passing NULL correctly

我有這個具有日期選擇器框的 C# 網絡表單。 如果日期設置為空(默認值),我希望它將 NULL 傳遞給數據庫。 這發生在我的參數化查詢中。

SqlParameter CMActionDate = new SqlParameter();
CMActionDate.ParameterName = "@ActionDate";
if (ActionDate.Equals(""))
  {
      CMActionDate.Value = System.Data.SqlTypes.SqlDateTime.Null;
  }
  else
  {
      CMActionDate.Value = ActionDate;
  }

當我打開調試時,我看到日期確實是“”,所以它進入 IF 語句並將 actiondate.value 設置為 {Null},就像我認為的那樣。

然而。

然后當它執行非查詢時,我單擊放大鏡並看到:

UPDATE table SET [action_date] = '' WHERE [id] = 2488

我想看到的是:

UPDATE table SET [action_date] = 'Null' WHERE [id] = 2488

由於 action_date 從未真正設置為 NULL,因此 datetime 字段中的值將恢復為“01/01/1900 12:00:00AM”,這本身就是一種痛苦。

我嘗試將 CMActionDate.Value 設置為以下值無濟於事(我得到與上面相同的結果。):

  • DBNull.值;
  • “無效的”;
  • SqlDateTime.Null;
  • null;

幫助。

編輯

可能我沒說清楚? 是的,參數化查詢當然是這樣的:

"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_id + "";

但是當我在 VS 中調試這個東西時,我在 ExecuteNonQuery(); 之前放了一個斷點。 所以我可以看到它正在嘗試運行的 SQL。 在那里我看到了實際的 SQL 並看到了 action_date='' 的位。

這有幫助嗎?

您不應該看到“”或“空”。 如果您正確使用參數化查詢,它應該如下所示:

更新表 SET [action_date] = @ActionDate WHERE [id] = @ID

參數化查詢的重點是實際參數值永遠不會直接替換到查詢字符串中。

您的查詢代碼應如下所示:

string sql = "UPDATE table SET [action_date]= @ActionDate WHERE [id]= @CM_id";

using (var cn = new SqlConnection("your connection string here."))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add("@ActionDate", SqlDbTypes.DateTime).Value = 
         ActionDate.Equals("")? DBNull.Value : DateTime.Parse(ActionDate);
    cmd.Parameters.Add("@CM_id", SqlDbTypes.Int).Value = 2488;

    cn.Open();
    cmd.ExecuteNonQuery();
}

此代碼的結果是您的查詢參數作為數據發送到服務器。 在您的 C# 代碼中,您永遠無法查看替換數據的查詢字符串:它是單獨發送到服務器的。

這可以防止服務器由於清理參數值時出錯而將參數值作為代碼執行的任何可能性。 數據是完全獨立的,不需要首先針對該上下文進行清理。 它還允許服務器緩存和重用查詢的執行計划,從而帶來(小的)性能提升。

您的參數化查詢應顯示

UPDATE table SET [action_date] = @ActionDate WHERE [id] = @id

並且參數值應該有一個 null 等效值。

你的 sql 是

"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' 
 WHERE [id] = " + @CM_id + "";

這真的沒有意義。 您應該讓 sql 替換 @ActionDate 和 @CM_ID,而不是構建動態 sql 查詢。

您的 sql 應該是:

String sql = "UPDATE table SET [action_date] = @ActionDate WHERE [id] = @CM_id"

變量周圍不應該有字符串連接,也不應該用引號引起來。

您的查詢肯定與發布的查詢不同。

您的 @parameter 需要在您的字符串中,以便正確讀取。 您看到 ActionDate = '' 因為 @ActionDate 很可能不存在。

你需要類似的東西

string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";

請注意,沒有發生字符串連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM