4

次のコードを使用して、EF でストアド プロシージャを実行しようとしています。

var params = new object[] {new SqlParameter("@FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteStoreQuery<ResultType>("GetByName", params);

しかし、このエラーが発生し続けます:

プロシージャまたは関数 'GetByName' には、指定されていないパラメーター '@FirstName' が必要です。

そしてSQLプロファイラーから:

exec sp_executesql N'GetByName',N'@FirstName nvarchar(100),@FirstName=N'Bob'

上記の ExecuteStoreQuery コードの何が問題になっていますか?

4

3 に答える 3

10

paramsそれが予約語であることを無視して...

クエリは次のようにする必要があると考えてください。

var params = new object[] {new SqlParameter("@FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteStoreQuery<ResultType>("exec GetByName @FirstName", params);

また、その proc がデータベースとデータ モデルの標準部分である場合は、それを EDM にインポートして、コンテキストで直接利用できるようにする必要があります。

于 2012-04-23T23:46:22.393 に答える
2

「アドホック」クエリにより適したExecuteStoreQueryの代わりにExecuteFunctionを使用します。

var parameters = new ObjectParameter[] {new ObjectParameter("FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteFunction<ResultType>("GetByName", parameters);

ストアドプロシージャは、コンテキスト内の関数としてマップすることもできるため、型付きメソッドとして使用できます。EntityFrameworkでのストアドプロシージャの使用をご覧ください。

于 2012-04-23T23:38:23.797 に答える
0

これは、複数のパラメーターがある場合に、EF で SP を使用するために行ったことです。

        public virtual ObjectResult<GetEpisodeCountByPracticeId_Result> GetEpisodeCountByPracticeId(Nullable<int> practiceId, Nullable<System.DateTime> dat1)
    {

        SqlParameter practiceIdParameter = practiceId.HasValue ?
            new SqlParameter() { ParameterName = "practiceId", Value = practiceId, SqlDbType = SqlDbType.Int } :
            new SqlParameter() { ParameterName = "practiceId", SqlDbType = SqlDbType.Int }; 

        SqlParameter dat1Parameter = dat1.HasValue ?
            new SqlParameter() { ParameterName = "dat1", Value = dat1, SqlDbType = SqlDbType.DateTime }:
            new SqlParameter() { ParameterName = "dat1", SqlDbType = SqlDbType.DateTime }; 


        return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<GetEpisodeCountByPracticeId_Result>("exec GetEpisodeCountByPracticeId @practiceId, @dat1", practiceIdParameter, dat1Parameter);
    }

commandText プロパティにパラメーター (@practiceId など) を追加しないと、受け取ったエラーが発生します。

于 2014-09-22T12:22:51.273 に答える