加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 为什么更改SqlParameter顺序时Entity Framework会

发布时间:2020-12-12 16:55:16 所属栏目:MsSql教程 来源:网络整理
导读:我使用实体框架4.3代码首先调用存储过程我调用存储过程的方式是这样的: var parameters = new[]{ new SqlParameter("member",1),**new SqlParameter("Code","0165210662660001"),** new SqlParameter("PageSize",new SqlParameter("PageNumber",1)};var resu
我使用实体框架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为一些很好的例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读