微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/mssql/81147.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐