2017-04-05 5 views
0

問題が発生しました。私はエラーが発生しています "プロシージャまたは関数 'SP_RPT_User'はパラメータ '@deptName'を提供しませんでした。パラメータが提供されている間は、C#アプリケーションで。名前をコピーして置き換えても。まだ成功していない。手順ストアドプロシージャは、提供されているものの一部の入力を期待しています

ストアド

public DataTable SP_RPT_User(int loggedid, String deptName, String OfficeName, String empType) 
    { 
     int updatedrows = 0; 

     DataTable table = new DataTable(); 
     try 
     { 
      cCommand = new System.Data.SqlClient.SqlCommand("SP_RPT_User", connection); 
      cCommand.CommandType = CommandType.StoredProcedure; 

      cCommand.Parameters.Add("@loggedId", SqlDbType.Int).Value = loggedid; 
      cCommand.Parameters.Add("@deptName", SqlDbType.NVarChar, 200).Value = deptName; 
      cCommand.Parameters.Add("@OfficeName", SqlDbType.VarChar, 150).Value = OfficeName; 
      cCommand.Parameters.Add("@empType", SqlDbType.VarChar, 150).Value = empType; 


      cCommand.CommandTimeout = 90000; 
      connection.Open(); 
      updatedrows = cCommand.ExecuteNonQuery(); 

      using (var da = new SqlDataAdapter(cCommand)) 
      { 
       cCommand.CommandType = CommandType.StoredProcedure; 
       da.Fill(table); 
      } 

     } 
     catch (Exception Ex) 
     { 
      connection.Close(); 
      // return -100; 
     } 
     finally 
     { 
      connection.Close(); 
     } 

     return table; 

    } 

ALTER PROCEDURE [dbo].[SP_RPT_User] -- Add the parameters for the stored procedure here @loggedId int, @deptName NVarChar(200), @OfficeName varchar(150), @empType varchar(150) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; declare @sql nvarchar(max); set @sql ='SELECT ...'; // here is one query if(@deptName != '') set @sql = @sql + ' and dbo.TB_Department.name like ''%'[email protected]+'%'''; Declare @params nvarchar(500) SELECT @params ='@loggedId int,'+ '@deptName NVarChar(200),'+ '@OfficeName varchar(150),'+ '@empType varchar(150)' exec sp_executesql @sql, @params,@loggedId,@deptName,@OfficeName,@empType; END 

誰も助けができます。前もって感謝します。 私はSQL Server 2014とvs2015を使用しています。

答えて

1

私は推測は、クエリを実行しながら、C#でdeptName値がnullであるということです。そのような場合には、パラメータ値としてnullを持つようにDBNull.Valueを渡す必要があります。

var param = cCommand.Parameters.Add("@deptName", SqlDbType.NVarChar, 200); 
param.Value = deptName ?? DBNull.Value; 

あなたの手順から、私はあなたが空の文字列と比較していることがわかりので、その条件を満たすように?? string.Emptyを使用しています。

+0

はい、あなたは正しいですdeptNameはC#でnullと等しいです。常にnullになるわけではありません。ユーザーがフィルタリングのために値を入力したい場合は、deptNameにフィルタを適用する必要があります。 –

+0

その選択は今問題ではありません。あなたが 'null'を取った瞬間、例外を取り除くためにC#null以外のものにパラメータ値を設定する必要があります。 '?? '演算子はそれだけを行います - 最初が' null'ならば2番目の値を使います。 – Rafal

+0

ありがとうございます –

関連する問題