2017-04-17 9 views
0

ここにこのような問題があります:SQL関数の選択結果を返すメソッドを用意してください。WHERE句を指定しないで関数を呼び出すと問題はありませんが、@search結果は何も得られませんでしたが、同じクエリはMsSQL Managerで完璧に機能します。パラメータとWHERE句を持つSQL関数を呼び出すC#ExecuteReaderAsync

(Visual Studioのエンタープライズ2015年、MSSQLSERVERエクスプレス2016)

public async Task<IEnumerable<SelectedJob>> GetFunction(int? moduleId, int? specialGroupId, string search) 
    { 
     var commandText = "SELECT * FROM GUI.fGetSelectedJobs(@ModuleID, @SpecialGroupID)"; 
     var parameters = new Dictionary<string, object> { { "@ModuleID", moduleId }, { "@SpecialGroupID", specialGroupId } }; 

     if (!string.IsNullOrEmpty(search)) 
     { 
      commandText = "SELECT * FROM GUI.fGetSelectedJobs(@ModuleID, @SpecialGroupID) WHERE JobName LIKE '%@search%'"; 
      parameters = new Dictionary<string, object> { { "@ModuleID", moduleId }, { "@SpecialGroupID", specialGroupId }, { "@search", search } }; 
     } 

     var rows = await Database.QueryAsync(commandText, parameters); 

     return rows?.Select(ParseRow).ToList(); 
    } 

QueryAsync方法の一部:

var command = CreateCommand(commandText, parameters); 
      command.CommandType = commandType; 
      using (var reader = await command.ExecuteReaderAsync()) 
      while (await reader.ReadAsync()) 
       { 
        //Some job 
       } 

しかし、それは常に空のコマンドは、WHERE句で建てるときenter image description here

アイデア?

+0

GUI.fGetSelectedJobsでGUIものです。 – Kapil

+0

GUIがスキーマ名でない場合は、SELECT * FROM dbo.fGetSelectedJobsを使用してみてください。 – Kapil

答えて

2

あなたWHERE部分がWHERE JobName LIKE @search"こと、および検索文字列に%を追加する必要があります

parameters = new Dictionary<string, object> { { "@ModuleID", moduleId }, 
     { "@SpecialGroupID", specialGroupId }, { "@search", "%" + search + "%" } }; 
+1

または単に 'JobName LIKE '%" + @search + "%" ' – Fabio

+0

クエリーにパラメータを使用しない@Fabioには同意しません。 'LIKE'% '+ @search +'% '+ @search +'% '+ @ search +'% 'のようなものを意味するのでしょうか? – Pikoh

+0

私のタイプミス、もう一つのアプローチがあります。 – Fabio

関連する問題