2010-06-22 134 views
4

我有一個搜索頁面,它具有日期文本字段。用戶可能會或可能不會填充此字段。但是該字段是被調用來執行搜索查詢的SQL存儲過程的參數。將參數值傳遞給asp.net中可選字符串的SQL存儲過程

當我走過的代碼(日期字段爲空),我得到一個錯誤,該值無法轉換爲DateTime

我如何轉換爲空值,日期時間,因爲參數是查詢期望?

cmdSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
cmdSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim()); 
+0

你認爲這個問題與ASP.NET有什麼關係? – 2010-06-22 14:33:11

回答

5

如果您將SQL proc中的參數設置爲可選參數,通過提供默認值

CREATE PROCEDURE MyProc 
... 
@StartDate datetime = null, 
.... 

他們你可以省略發送該參數從C#代碼

DateTime result; 
if (DateTime.TryParse(txtStartDate.Text, out result)) 
{ 
    cmdSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
    cmdSearch.Parameters["@StartDate"].Value = result; 
} 

如果文本字段的解析不成功,參數沒有在參數列表中,並將該數據庫使用默認值。

此外,使用DateTime.TryParse(..)可防止處理異常。

+0

我覺得你釘他哥們!到目前爲止您的評論「如果解析文本字段失敗,參數不會添加到參數列表中,並且數據庫使用默認值。」我認爲所有情況下都必須通過一個參數。今天學到了一些東西! – user279521 2010-06-22 14:43:58

+1

Thx。我想指出的一點是,從設計的角度來看,它將數據庫過程和數據層代碼結合在一起,所以它可能不易維護。另一方面,更改默認傳遞值只需要proc更新,而不是代碼重新編譯。 – SWeko 2010-06-22 15:11:37

2
cmdSearch.Parameters["@StartDate"].Value = 
    String.IsNullOrEmpty(txtStartDate.Text) ? SqlDateTime.MinValue : 
     Convert.ToDateTime(txtStartDate.Text.Trim()); 

,將檢查,看看是否文本爲空或試圖解析前值一個空字符串。

一定要使用SqlDateTime結構,而不是DateTime,因爲兩者有很大的不同MinValue s。

請記住,這不會修復TextBox文本格式不正確的情況。 在這些情況下,您將繼續獲得例外!

+0

根據實施sproc的方式,您可能需要使用DateTime.MinValue(或MaxValue)而不是DBNull.Value。這一切都取決於sproc如何處理它。如果它提供了一個默認值(如果沒有提供),那麼將它保留下來也是一個選項。 – tvanfosson 2010-06-22 14:15:09

+0

我瞭解日期格式問題。我將爲此創建驗證。 但是,當我嘗試使用代碼時出現錯誤: 無法確定條件表達式的類型,因爲'System.DBNull'和'System.DateTime'之間沒有隱式轉換 – user279521 2010-06-22 14:17:02

+0

@ user279521 - 更新了我的答案以傳遞MinValue而不是空。 – 2010-06-22 14:31:56

2

紙環繞整個事情和測試的if聲明,看看是否String.IsNullOrEmpty(txtStartDate.Text)

編輯

這就是我的意思的,「整個事情」 - 道歉不更清澈

if (!String.IsNullOrEmpty(txtStartDate.Text)) 
    cmdSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim()); 
else 
    cmdSearch.Parameters["@StartDate"].Value = DateTime.MinValue; 
+0

+1,假設整個事情你的意思是添加startdate參數的部分。如果它是空的,你可以選擇。要麼根本不傳遞參數,要麼傳入null或其他默認值。如果您選擇不通過它,請確保s'proc在參數部分中分配了默認值。類似於「@StartDate datetime = null」 – NotMe 2010-06-22 14:14:10

+1

在if語句中包裝整個事件將導致查詢中缺少參數。您仍然需要添加參數,但如果文本爲空,請將該值設置爲null。 – 2010-06-22 14:14:20

+0

正確的賈斯汀。我想到了if語句,但是這個參數會被忽略掉; – user279521 2010-06-22 14:18:14

相關問題