簡體   English   中英

在沒有參數化查詢的情況下在 sql server 中插入來自 c# 的日期時間

[英]Insert date-time from c# in sql server without parametrized query's

我正在開發一個相當古老的應用程序,當時沒有使用參數化查詢。

我必須在sql表的一列中插入日期時間值,數據類型為date-time ,該列中不允許使用空值。

我的代碼。

var expires = dtpExpires.Enabled ? dtpExpires.Value.ToString() : "'1/1/1900 12:00:00 AM'";
string query = "INSERT INTO route (expires) Values ("+ expires +")";

問題在於,當日期選擇器被禁用時,必須傳遞一個默認值,因為 null 是不允許的。 因此,為此我必須包含一個額外的''來環繞日期並且它可以正常工作。

但是當日期選擇器被啟用並且有效的日期時間試圖插入到數據庫中時,它會由於缺少''而失敗,這包裹在expires變量周圍。

在沒有參數化查詢的情況下,是否有任何干凈的方法可以做到這一點。 更新代碼時也會出現同樣的問題。 是否可以有一種干凈的方法來處理這兩種情況,而不是只添加if-else子句。

編輯

避免“無法確定條件表達式的類型,因為‘string’和‘System.DBNull’之間沒有隱式轉換”

SqlCommand command = new SqlCommand("INSERT INTO route (expires) 
                                   Values (@dtpExpires)", connections);
SqlParameter dtpExpires= new SqlParameter("@dtpExpires", SqlDbType.DateTime, 10);
dtpExpires.Value = dtpExpires.Enabled ? dtpExpires.Value : DBNull.Value;
command.Parameters.Add(dtpExpires);

給你信息 OP@ankur

使用參數代替串聯的好處

  • 安全。 連接使您可以進行 SQL 注入,尤其是當 TB 代表文本框時。 (強制性XKCD卡通)
  • 類型安全。 您解決了許多日期時間和數字格式問題。
  • 速度。 查詢不會一直更改,系統可能能夠重新使用查詢句柄。

筆記

最好使用 pram 查詢來避免 sql 注入攻擊。

由於您將日期時間和空數據作為字符串發送,因此使用 CONVERT 函數讓 sql server 處理從字符串到日期時間的轉換

  var expires = dtpExpires.Enabled ? "'" + tpExpires.Value.ToString() + "'" : "null";

  string query = "INSERT INTO route (expires) Values (CONVERT(datetime, " + expires + "))";

暫無
暫無

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

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