12

我首先使用实体​​框架 4.3 代码来调用存储过程,我调用存储过程的方式是这样的:

var parameters = new[]
{
    new SqlParameter("member", 1),
    **new SqlParameter("Code","0165210662660001"),**
    new SqlParameter("PageSize", 1),
    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,@PageSize,@PageNumber" parameters).ToList();

var parameters = new[]
{
    **new SqlParameter("Code","0165210662660001"),**
    new SqlParameter("Member", 1),
    new SqlParameter("PageSize", 1),
    new SqlParameter("PageNumber",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();

        }
    }
4

1 回答 1

6

@Code这不是因为您的参数对象中的参数顺序 - 这是因为在您的第二个代码片段中,当 SP 需要一个值时,您明确地将值作为第一个参数传递Member INT

var result  = context.Database.SqlQuery<resultClass>("mySpName @Code,  @member,@PageSize,@PageNumber" parameters).ToList();

...您"0165210662660001"作为第一个参数传入,并且转换为 INT 失败。

参数对象中参数的顺序无关紧要,因为 EF(实际上是 ADO.NET)会将这些参数映射到@parametername查询字符串中的值。因此,new 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,但是因为它们被命名了,所以我不必在意。

有关传递参数的不同方式,请参阅:This Answer以获得一些很好的示例。

于 2012-12-19T14:25:57.603 回答