sql-server – 为什么更改SqlParameter顺序时Entity Framework会
我使用实体框架4.3代码首先调用存储过程我调用存储过程的方式是这样的:
var parameters = new[] { new SqlParameter("member",1),**new SqlParameter("Code","0165210662660001"),** new SqlParameter("PageSize",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,@PageNumber" parameters).ToList(); var parameters = new[] { **new SqlParameter("Code",** new SqlParameter("Member",new SqlParameter("PageSize",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(); } } 解决方法这不是因为参数对象中的参数顺序 – 这是因为在第二个代码片段中,当SP期望成员INT值时,您将显式传递@Code值作为第一个参数.var result = context.Database.SqlQuery<resultClass>("mySpName @Code,@PageNumber" parameters).ToList(); …您正在传入“0165210662660001”作为第一个参数,转换为INT失败. 您的参数对象中参数的顺序是不相关的,因为EF(ADO.NET实际上)会将这些参数映射到查询字符串中的@parametername值.因此,新的SqlParameter(“Code”,“0165210662660001”)将被映射到查询中的@Code位置 – 其中第二个代码被删除的实际上是SP所预期的Member值的位置. 但是,您也可以使用命名参数执行SP,在这种情况下,可以按以下顺序将参数传递给SP: db.Database.SqlQuery<resultClass>("mySpName PageNumber=@PageNumber,Code=@Code,PageSize=@PageSize,Member=@member",parameters).ToList(); 你看到我没有按照它们由SP定义的顺序将参数传递给SP,而是因为它们被命名,我不需要关心. 对于不同的传递参数的方法,请参见:这个Answer为一些很好的例子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |