2012-04-17 71 views
1

我在使用日期字段搜索數據時遇到問題。搜索日期的問題

我有一個存儲過程正在執行搜索:

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 @[email protected]@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); 

然後,它的工作原理,但沒有使用日期,以搜尋的能力。

當我從服務器執行存儲過程,並傳遞參數包括日期它工作正常。

有人可以幫助我,看看我做錯了什麼!!!?

感謝

+4

:轉換這樣的:

AND (Cost Like '%' + @TrainingCost +'%' or @TrainingCost is null) 

要這樣:

AND (Cost = @TrainingCost or @TrainingCost is null) 

同樣,如果你需要空,妥善處理了嗎? – 2012-04-17 02:49:13

+0

您是否檢查過您傳遞的日期格式是正確的?他們應該是日期時間,而不是字符串 – jzm 2012-04-17 02:49:22

+0

我已經嘗試使用日期時間,但它仍然不工作 – vitalix 2012-04-17 02:56:32

回答

0

如果您使用的是SQL 2008,那麼你可以使用CAST函數的參數@StartDate和@EndDate這是字符串類型轉換爲日期在下面的查詢

AND ([Start Date] >= CAST(@StartDate AS DATE) or @StartDate is null) 
AND ([Start Date] <= CAST(@EndDate AS DATE) or @EndDate is null) 
0

使用您的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])) 
0

更改此:

@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())); 

因此,更改您的存儲過程,這看起來不尋常,一個成本領域就是金錢;錢不應該作爲字符串處理。你爲什麼要定義日期爲文本

MyDataAdapter.SelectCommand.Parameters["@TrainingCost"].Value = 
    CostTextBox.Text.Trim().Length == 0 ? 
     (decimal?) null : 
     (decimal?) decimal.Parse(CostTextBox.Text.Trim());