gpt4 book ai didi

sql-server - 为什么 Entity Framework 在更改 SqlParameter 顺序时会抛出异常?

转载 作者:行者123 更新时间:2023-12-02 08:50:13 26 4
gpt4 key购买 nike

我首先使用实体​​框架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();

}
}

最佳答案

这不是因为参数对象中的参数顺序 - 这是因为在第二个代码片段中,当 SP 期望 时,您显式地将 @Code 值作为第一个参数传递>成员 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)值(value)。

但是...您也可以使用命名参数来执行 SP,在这种情况下,您可以按照以下任意顺序将参数传递给 SP:

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

您会看到,我没有按照[由 SP] 定义的顺序将参数传递给 SP,但因为它们是命名的,所以我不必关心。

有关传递参数的不同方式,请参阅:此 Answer一些很好的例子。

关于sql-server - 为什么 Entity Framework 在更改 SqlParameter 顺序时会抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13816548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com