2017-12-20 20 views
0

私は、ストアプロシージャにアクセスしようとするリポジトリパターンパラメータ化されたクエリ '@QuotationNo varchar()、@ AgencyName varchar()、@ ContractS'は、提供されていないパラメータ '@QuotationNo'を要求します

以下コマンドここ

var reportFilterDb = 
       _iGenericReportProcRepository.ExecuteStoreProcFunction("StoreProcReport @QuotationNo, @AgencyName, @ContractStartDate, @ContractEndDate, @contractTerm", 
        new SqlParameter("QuotationNo", SqlDbType.VarChar) { Value = filter.QuotationNo }, 
        new SqlParameter("AgencyName", SqlDbType.VarChar) { Value = filter.AgencyName }, 
        new SqlParameter("ContractStartDate", SqlDbType.DateTime) { Value = filter.FContractStartDate }, 
        new SqlParameter("ContractEndDate", SqlDbType.DateTime) { Value = filter.FContractEndDate }, 
        new SqlParameter("contractTerm", SqlDbType.Int) { Value = filter.Term } 
        ).ToList(); 

有する汎用リポジトリパターン

public virtual IEnumerable<T> ExecuteStoreProcFunction(string query, params object[] parameters) 
     { 
      return _entities.Database.SqlQuery<T>(query, parameters).ToList(); 
     } 

は、店舗手順構造

であります210
CREATE PROCEDURE [dbo].[StoreProcReport] 
@QuotationNo varchar(max) null, 
@AgencyName varchar(max) null, 
@ContractStartDate datetime null, 
@ContractEndDate datetime null, 
@contractTerm int null 

AS 
SET NOCOUNT ON; 
SELECT con.Contract_AgencyName, con.Contract_EndDate, con.Contract_Id as 'ContractId', con.Contract_QuoteNo, con.Contract_StartDate, 
ConSer.ContractService_Id, ConSer.Description,ConSer.MonthlyUnitPrice, ConSer.OrderEndDate, ConSer.OrderStartDate,ConSer.OrderTermMonths, 
ConSer.Quantity, ConSer.TotalPrice 
    FROM Contract AS con join ContractService as ConSer on con.Contract_Id = ConSer.Contract_Id 
    WHERE (con.Contract_QuoteNo = @QuotationNo OR @QuotationNo IS NULL) 
    AND (con.Contract_AgencyName = @AgencyName OR @AgencyName IS NULL) 
    AND (con.Contract_StartDate = @ContractStartDate OR @ContractStartDate IS NULL) 
    AND (con.Contract_EndDate = @ContractEndDate OR @ContractEndDate IS NULL) 
    AND (ConSer.OrderTermMonths = @contractTerm OR @contractTerm IS NULL) 
GO 

私は、パラメータ化クエリ '(@QuotationNo VARCHAR()は、AgencyNameのVARCHAR()@、契約@'「パラメータを期待

としてエラーを取得して結果を実行することはできませんよ@QuotationNo 」、これ

+1

'SqlParameter( "QuotationNoが"' SqlParameter 'すべきではない( "QuotationNo @"':代わりに、自動的にそのようなことを行いますDapperのようなツールを検討します? – David

+0

同じエラーが発生しました –

+0

ExecuteStoreProcFunctionは何ですか?ExecuteScalarなどのメソッドを使用してプロシージャを実行していますか? –

答えて

4

を供給していなかったfilter.QuotationNonullであれば、パラメータは恐ろしいAPIの経験ですを、追加されません。その代わりに、.Value = (object)filter.QutationNo ?? DBNull.Value(すべてのパラメータについてなど)を試してください。

_connection.Execute("StoreProcReport", new { // or Query<T> etc 
    filter.QuotationNo, 
    filter.AgencyName, 
    ContractStartDate = filter.FContractStartDate, 
    ContractEndDate = filter.FContractEndDate, 
    contractTerm = filter.Term, 
}, commandType: CommandType.StoredProcedure); 
+0

パーフェクトアンサー。 ..ありがとうございました....ナル値のため、それは動作していませんでした..... –

0

私にとってこの作品

var reportFilterDb = 
       _iGenericReportProcRepository.ExecuteStoreProcFunction("EXEC StoreProcReport @QuotationNo, @AgencyName, @ContractStartDate, @ContractEndDate, @contractTerm", 
        new SqlParameter("@QuotationNo", SqlDbType.VarChar) { Value = (object)filter.QuotationNo ?? DBNull.Value }, 
        new SqlParameter("@AgencyName", SqlDbType.VarChar) { Value = (object)filter.AgencyName ?? DBNull.Value }, 
        new SqlParameter("@ContractStartDate", SqlDbType.DateTime) { Value = (object)filter.FContractStartDate ?? DBNull.Value }, 
        new SqlParameter("@ContractEndDate", SqlDbType.DateTime) { Value = (object)filter.FContractEndDate ?? DBNull.Value }, 
        new SqlParameter("@contractTerm", SqlDbType.Int) { Value = (object)filter.Term ?? DBNull.Value } 
        ).ToList();