ストアド プロシージャを呼び出す方法として、最初にエンティティ フレームワーク 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();
}
}