- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我首先使用实体框架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/
我正在尝试使用这些命名空间之一 //using Microsoft.Data.SqlClient; using System.Data.SqlClient; 我的模型 public class Get
我将我的项目从 ASP.NET Core 2.2 迁移到 ASP.NET Core 3.0。现在我得到了这个异常(exception)。在 ASP.NET Core 2.2 中,它使用 FromSql
我想知道如何SqlParameter知道没有指定的类型吗? 例如,在实例化参数对象时,您不需要指定 DB 类型。以某种方式执行命令时,.net 会为您处理此问题。在幕后是否有某种转换正在发生?当你做/
我们有一个代码块,它创建一个 sqlParameters 列表,然后将它们传递给存储过程。要求根据输入文本框是否为空有条件地使一些值无效。 基本代码: var SqlParams = new List
如何设置SqlParameter的值相当于 SQL INSERT 语句的 DEFAULT 关键字? MSDN documentation表示“使用 null 或不设置 Value 以使用参数的默认值。
如何设置SqlParameter的值相当于 SQL INSERT 语句的 DEFAULT 关键字? MSDN documentation表示“使用 null 或不设置 Value 以使用参数的默认值。
我想从我的代码中删除手动转义。而不是这个,我想使用 SqlParameter 对象。 foreach (ThreadPost post in ThreadPosts) { string ne
Sql命令构建 我已经构建了如下的 Sql 命令: string _InsertVehicleQuery = "INSERT INTO VSI_VehicleRecords(StockNumb
SqlParameter[] _parameters = { new SqlParameter( "@IDNumber", Person.IDNumber ),
给定以下代码行: cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.Disp
我正在尝试访问一个存储过程,但我收到一条错误消息: Procedure or function 'getbug' expects parameter '@bugID', which was not s
我需要检查 SqlParameter 对象的值并根据特殊标签更改它。即:[BB] ==> 棒球,[FP] ==> 快投。 我可以用这样的附加函数来做到这一点: _params.Add(new SqlP
我正在尝试转换: command.Parameters.Add (new SqliteParameter (DbType.Int32) { Value = id }); 到一个普通的 SqlParam
我有一个网络服务,所以处理程序一直被同时调用多次。 我在里面创建了 SqlConnection 和 SqlCommand。我必须执行大约 7 个不同的命令。不同的命令需要不同的参数,所以我只添加一次:
我收到这个错误: System.Data.SqlClient.SqlException: 'The parameterized query '(@inputKarakterSoort varchar(
我有一个 SqlCommand我想打电话Prepare()在谁的CommandType = Text (它 不能 是一个存储过程)。 为了做到这一点,我需要设置 Size参数上的属性非零,否则抛出异常
这个问题已经有答案了: SQL Server error "Procedure expects parameter" (1 个回答) 已关闭 8 年前。 我正在尝试从 C# 程序访问存储过程,令人难以
我正在使用最新版本的 MiniProfiler,一切都已按我的预期设置和工作。我唯一的问题是 SqlParameters 没有显示。 例如,我正在运行一个存储过程:- var cmd = dbcon.
我有一个 SqlCommand,它运行一个包含两个整数输出参数的存储过程。就在 SqlCommand 运行之前,我可以看到输出参数设置为正确的值,但是当命令实际执行时,它对参数 1 使用 NULL,对
我正在开发一个必须支持多种语言的应用程序。为了解决特殊字符问题,我在文本字段中使用了 NVarhcar。所以我对文本字段的 SQL 查询是 insert into tbl_text(text)valu
我是一名优秀的程序员,十分优秀!