12

ストアド プロシージャを呼び出す方法として、最初にエンティティ フレームワーク 4.3 コードを使用しています。ストアド プロシージャを呼び出す方法は次のとおりです。

var parameters = new[]
{
    new SqlParameter("member", 1),
    **new SqlParameter("Code","0165210662660001"),**
    new SqlParameter("PageSize", 1),
    new SqlParameter("PageNumber",1)
};

var result  = context.Database.SqlQuery<resultClass>(
    "mySpName @member, @Code, @PageSize,@PageNumber" parameters).ToList();

SqlServer で実行され、結果が得られます。

しかし、次のようにパラメータの順序を変更すると:

var result  = context.Database.SqlQuery<resultClass>("mySpName @Code,  @member,@PageSize,@PageNumber" parameters).ToList();

var parameters = new[]
{
    **new SqlParameter("Code","0165210662660001"),**
    new SqlParameter("Member", 1),
    new SqlParameter("PageSize", 1),
    new SqlParameter("PageNumber",1)
};

次のようなエラーが発生しました:

 Error converting data type nvarchar to int

ストアド プロシージャは次のようになります。

ALTER PROCEDURE [c].[mySpName]
    @Member INT ,
    @Code VARCHAR (50) ,
    @PageSize INT ,
    @PageNumber INT
 AS 

なぜ私はこの注文を受けるのですか?パラメータの順序を維持することは重要ですか? パラメータの順序を気にせずにストアド プロシージャを呼び出せるようにするにはどうすればよいですか?

============ 私は回避策を見つけ、それは完全に動作します ============

public class blahContext<T>
{
    int i = 0;
    public  IEnumerable<T> ExecuteStoreQuery(string SPname, SqlParameter[] parameters)
    {

        using (var context = new CADAContext())
        {


            string para = string.Join(", ", (from p in parameters
                                             where !"NULL".Equals(p.Value)
                                             select string.Concat(new object[] { "@", p.ParameterName, "={", this.i++, "}" })).ToList<string>());

            object[] x = (from p in parameters
                          where !"NULL".Equals(p.Value)
                          select p.Value).ToArray<object>();

            return context.Database.SqlQuery<T>(SPname + " " + para, x).ToList();

        }
    }
4

1 に答える 1

6

これは、パラメーター オブジェクトのパラメーターの順序が原因ではありません@Code。SP が値を期待しているときに、2 番目のコード スニペットで最初のパラメーターとして値を明示的に渡しているためMember INTです。

var result  = context.Database.SqlQuery<resultClass>("mySpName @Code,  @member,@PageSize,@PageNumber" parameters).ToList();

..."0165210662660001"最初のパラメーターとして渡しており、INT への変換が失敗しています。

パラメーター オブジェクト内のパラメーターの順序は、EF (実際には ADO.NET) がこれらのパラメーターを@parameternameクエリ文字列の値にマップするため、無関係です。そのため、クエリnew SqlParameter("Code","0165210662660001")の位置にマップされ@Codeます.2番目に切り取られたコードは、実際にはSPが期待するメンバー値の位置です.

ただし...名前付きパラメーターを使用してSPを実行することもできます。その場合、以下のように任意の順序でパラメーターをSPに渡すことができます。

db.Database.SqlQuery<resultClass>("mySpName PageNumber=@PageNumber,Code=@Code,PageSize=@PageSize,Member=@member", parameters).ToList();

[SPによって]定義された順序でSPにパラメータを渡していないことがわかりますが、名前が付けられているため、気にする必要はありません。

パラメータを渡すさまざまな方法については、次を参照してください。いくつかの良い例については、この回答を参照してください。

于 2012-12-19T14:25:57.603 に答える