2012-04-17 22 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); 

をそれからそれは日付を使用して検索する機能なしではなく動作します。

サーバーからストアドプロシージャを実行し、日付を含むパラメータを渡すと正常に動作します。

誰かが私を助けて、私が間違っていることを見ることはできますか?

おかげであなたは、あなたがして、クエリ以下

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

:あなたがnullの必要がある場合

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

同様に、それを適切に処理します。これに

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

:この変換? –

+0

渡した日付形式が正しいことを確認しましたか?また、それらはDateTimeでなく、文字列ではない – jzm

+0

DateTimeを使用しようとしましたが、それでも動作しません – vitalix

答えて

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と@EndDateを変換するにはCAST関数を使用することができますSQL 2008を使用している場合

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 NUMERIC(18,6) = nullに、この@TrainingCost VARCHAR(50) = 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())); 

したがって、保存されたprocも変更します。これは珍しいものです。コストフィールドはお金です。お金は文字列として扱われるべきではありません。なぜあなたはテキストとして日付を定義している

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