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为一些很好的例子.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...