UPDATE:修改下面的代碼,以允許範圍(包括無界範圍)
一個存儲過程可以很容易地處理的查詢,如此,如果正確地明白。只需檢查NULL
即可使參數可選。如果參數是NULL
,請不要根據它進行查詢。
CREATE PROCEDURE schema.FindPayments
(
@MinPrice double = NULL,
@MaxPrice double = NULL,
@Currency char(3) = NULL,
@MinTranDate datetime = NULL,
@MaxTranDate datetime = NULL,
@TranStatus int = NULL
)
AS BEGIN
SELECT *
FROM Payments
WHERE (
@MinPrice IS NULL
OR TotalPrice >= @MinPrice
)
OR (
@MaxPrice IS NULL
OR TotalPrice <= @MaxPrice
)
OR (
@Currency IS NULL
OR Currency = @Currency
)
OR (
@MinTranDate IS NULL
OR TranDate >= @MinTranDate
)
OR (
@MaxTranDate IS NULL
OR TranDate <= @MaxTranDate
)
OR (
@TranStatus IS NULL
OR TranStatus = @TranStatus
)
END
現在您還可以從這個代碼存儲過程中無論是DBNull.Value
通過爲未指定的參數,或者因爲我分配NULL
爲默認爲所有paramters,你可以通過選定的參數。
SqlCommand l_findPayments = new SqlCommand("FindPayments", new SqlConnection("..."));
l_findPayments.CommandType = CommandType.StoredProcedure;
if (l_totalPriceComparison == "Exact Amount")
{
findPayments.Parameters.Add(new SqlParameter("@MinPrice", l_price));
findPayments.Parameters.Add(new SqlParameter("@MaxPrice", l_price));
}
else if (l_totalPriceComparison == "Below Amount")
findPayments.Parameters.Add(new SqlParameter("@MaxPrice", l_price));
else if (l_totalPriceComparison == "Above Amount")
findPayments.Parameters.Add(new SqlParameter("@MinPrice", l_price));
// "Any Price" will just leave the parameter
// blank, so it will not filter on price
// ... repeat for all params
SqlDataReader l_result = l_findPayments.ExecuteReader();
來源
2013-06-21 17:38:37
JDB
只有當用戶選擇「確切金額」,「確切日期」和除「任何狀態」以外的任何狀態時,這才起作用。例如,如果用戶選擇「低於金額」,則將無法返回準確的結果。 – HardCode
@HardCode - 你是對的。一個簡單的修改將允許你指定範圍。一個確切的值'N'只會在'N到N'的範圍內。對於像「任何狀態」這樣的東西,您只需將參數留空即可(因此返回任何狀態)。 – JDB