Sql server 为什么实体框架在更改SqlParameter顺序时引发异常?
我首先使用entity framework 4.3代码调用存储过程我调用存储过程的方式如下:Sql server 为什么实体框架在更改SqlParameter顺序时引发异常?,sql-server,entity-framework,Sql Server,Entity Framework,我首先使用entity framework 4.3代码调用存储过程我调用存储过程的方式如下: var parameters = new[] { new SqlParameter("member", 1), **new SqlParameter("Code","0165210662660001"),** new SqlParameter("PageSize", 1), new SqlParameter("PageNumber",1) }; var result
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();
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)
};
存储过程如下所示:
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();
}
}
公共类blahContext
{
int i=0;
公共IEnumerable ExecuteStoreQuery(字符串SPname,SqlParameter[]参数)
{
使用(var context=new CADAContext())
{
string para=string.Join(“,”,(来自参数中的p
其中,“NULL”等于(p.Value)
选择string.Concat(新对象[]{“@”,p.ParameterName,“={”,this.i++,“}”}”).ToList();
对象[]x=(来自参数中的p
其中,“NULL”等于(p.Value)
选择p.Value).ToArray();
返回context.Database.SqlQuery(SPname+“”+para,x).ToList();
}
}
这不是因为parameters对象中的参数顺序,而是因为在第二个代码段中,当SP需要成员INT
值时,您显式地将@code
值作为第一个参数传递
var result = context.Database.SqlQuery<resultClass>("mySpName @Code, @member,@PageSize,@PageNumber" parameters).ToList();
您可以看到,我没有按照SP定义的顺序将参数传递给SP,但是因为它们的名称我不必在意
有关传递参数的不同方法,请参见:这是一些很好的示例。这是因为您在调用SP时更改了参数的顺序-请参见下面我的答案以获得澄清。这不是一个解决方法,我通过编辑问题添加了解决方法看起来参数的顺序绝对重要…例如,如果SP在这个o中有参数顺序:A,B,C-然后它将前3个参数映射到A,B,C。如果在传递参数值时使用命名参数,则不会映射。例如,exec mySpName PageNumber=1,Code=2,PageSize=3,Member='alpha'
var result = context.Database.SqlQuery<resultClass>("mySpName @Code, @member,@PageSize,@PageNumber" parameters).ToList();
db.Database.SqlQuery<resultClass>("mySpName PageNumber=@PageNumber,Code=@Code,PageSize=@PageSize,Member=@member", parameters).ToList();