[英]Problems searching dates
我在搜索帶有日期字段的數據時遇到問題。
我有一個執行搜索的存儲過程:
ALTER PROCEDURE [dbo].[spSearchTraining]
(
@CourseName VARCHAR(50)= null,
@TrainingProvider VARCHAR(50)= null,
@TrainingCost VARCHAR(50) = null,
@StartDate Varchar(50) = null,
@EndDate Varchar(50)= null,
@RowCount int output
)
AS
BEGIN
SELECT * FROM vwTrainingDetails
WHERE ( CourseName Like '%' + @CourseName +'%' or @CourseName is null)
AND ( TrainingProvider Like '%' + @TrainingProvider + '%' or @TrainingProvider is null)
AND ( Cost Like '%' + @TrainingCost +'%' or @TrainingCost is null)
AND ([Start Date] >= @StartDate or @StartDate is null)
AND ([Start Date] <= @EndDate or @EndDate is null)
select @RowCount=@@ROWCOUNT
END
我傳遞參數如下:
//Create and add a parameter to Parameters collection for the stored procedure.
MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@CourseName", SqlDbType.VarChar, 40));
MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@TrainingProvider", SqlDbType.VarChar, 40));
MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@TrainingCost", SqlDbType.VarChar, 40));
MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.VarChar, 40));
MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.VarChar, 40));
//string mysdate = (StartTextBox.Text).ToString;
//Assign the search value to the parameter.
MyDataAdapter.SelectCommand.Parameters["@CourseName"].Value = (CourseTextBox.Text).Trim();
MyDataAdapter.SelectCommand.Parameters["@TrainingProvider"].Value = (ProviderTextBox.Text).Trim();
MyDataAdapter.SelectCommand.Parameters["@TrainingCost"].Value = (CostTextBox.Text).Trim();
MyDataAdapter.SelectCommand.Parameters["@StartDate"].Value = (StartTextBox.Text);
MyDataAdapter.SelectCommand.Parameters["@EndDate"].Value =(EndTextBox.Text);
我遇到的問題是,當我按原樣運行時,存儲過程不返回任何內容。 如果我注釋掉:
MyDataAdapter.SelectCommand.Parameters["@StartDate"].Value = (StartTextBox.Text);
MyDataAdapter.SelectCommand.Parameters["@EndDate"].Value =(EndTextBox.Text);
然后就可以了,但是無法使用日期進行搜索。
當我從服務器執行存儲過程並傳遞包括日期在內的參數時,它可以正常工作。
有人可以幫我看看我在做什么錯!!!!
謝謝
如果使用的是SQL 2008,則可以使用CAST函數將字符串類型的參數@StartDate和@EndDate轉換為Date。
AND ([Start Date] >= CAST(@StartDate AS DATE) or @StartDate is null)
AND ([Start Date] <= CAST(@EndDate AS DATE) or @EndDate is null)
在SP中使用以下查詢
SELECT *
FROM vwTrainingDetails
WHERE ( CourseName Like '%' + ISNULL(@CourseName,CourseName) +'%')
AND ( TrainingProvider Like '%' + ISNULL(@TrainingProvider, TrainingProvider) + '%')
AND ( Cost Like '%' + ISNULL(@TrainingCost,Cost) +'%')
AND ([Start Date] >= ISNULL( @StartDate, [Start Date]))
AND ([Start Date] <= ISNULL(@EndDate, [Start Date]))
更改此:
@StartDate Varchar(50) = null,
@EndDate Varchar(50)= null,
對此:
@StartDate DATE = null,
@EndDate DATE = null,
然后更改此:
MyDataAdapter.SelectCommand.Parameters.Add(
new SqlParameter("@StartDate", SqlDbType.Date));
MyDataAdapter.SelectCommand.Parameters.Add(
new SqlParameter("@EndDate", SqlDbType.Date));
對此:
// I don't know the exact format of your date,
// fill-in this accordingly from your Substring'd textboxes:
int startYear = int.Parse(...);
int startMonth = int.Parse(...);
int startDay = int.Parse(...);
int endYear = int.Parse(...);
int endMonth = int.Parse(...);
int endDay = int.Parse(...);
DateTime startDate = new DateTime(startYear,startMonth,startDay);
DateTime endDate = new DateTime(endYear,endMonth,endDay);
MyDataAdapter.SelectCommand.Parameters["@StartDate"].Value = startDate;
MyDataAdapter.SelectCommand.Parameters["@EndDate"].Value = endDate;
您還可以將參數縮短為:
MyDataAdapter.SelectCommand.Parameters.AddWithValue("@CourseName",
CourseTextBox.Text.Trim());
MyDataAdapter.SelectCommand.Parameters.AddWithValue("@TrainingProvider",
ProviderTextBox.Text.Trim());
MyDataAdapter.SelectCommand.Parameters.AddWithValue("@TrainingCost",
CostTextBox.Text.Trim());
MyDataAdapter.SelectCommand.Parameters.AddWithValue("@StartDate", startDate);
MyDataAdapter.SelectCommand.Parameters.AddWithValue("@EndDate", endDate);
還有一件事,例如,將此@TrainingCost VARCHAR(50) = null,
更改為@TrainingCost NUMERIC(18,6) = null
。
然后更改此:
MyDataAdapter.SelectCommand.Parameters.Add(
new SqlParameter("@TrainingCost", SqlDbType.Varchar, 40));
至:
MyDataAdapter.SelectCommand.Parameters.Add(
new SqlParameter("@TrainingCost", SqlDbType.Decimal));
然后也更改此:
MyDataAdapter.SelectCommand.Parameters["@TrainingCost"].Value =
decimal.Parse(CostTextBox.Text.Trim());
或這個:
MyDataAdapter.SelectCommand.Parameters.AddWithValue("@TrainingCost",
decimal.Parse(CostTextBox.Text.Trim()));
因此,也要更改您存儲的過程,這看起來很不正常,Cost字段是金錢; 錢不應作為字符串處理。 轉換為:
AND ( Cost Like '%' + @TrainingCost +'%' or @TrainingCost is null)
對此:
AND (Cost = @TrainingCost or @TrainingCost is null)
同樣,如果您需要null,請正確處理它:
MyDataAdapter.SelectCommand.Parameters["@TrainingCost"].Value =
CostTextBox.Text.Trim().Length == 0 ?
(decimal?) null :
(decimal?) decimal.Parse(CostTextBox.Text.Trim());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.