我使用实体框架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,而是因为它们被命名,我不需要关心.