参数化查询需要未提供的参数p1

本文关键字:参数 p1 查询 | 更新日期: 2023-09-27 18:29:50

我有一个存储的过程,如下所示:

CREATE PROCEDURE [dbo].[MyProc] 
    @p1 as int,
    @p2 as smalldatetime,
    @p3 as int,
    @p4 as varchar(255),
    @p5 as int = null,
    @p6 as numeric(18,2) = 0,
    @p7 as char(2) = null
AS
...

当我执行以下操作时,我会得到结果:

EXEC dbo.MyProc
    @p1 = 0,
    @p2 = '5/29/2015',
    @p3 = NULL,
    @p4 = NULL,
    @p5 = 233,
    @p6 = 0,
    @p7 = NULL

但当我使用实体框架的Database.SqlQuery时,我得到的The parameterized query '(@p1 bigint @p2 datetime @p3 nvarchar(4' expects the parameter '@p1' which was not supplied.是我使用的代码。

using (var context = new DbContext())
{   
    context.Database.ExecuteSqlCommand(
        @"EXEC dbo.MyProc @p1, @p2, @p3, @p4, @p5, @p6, @p7",
        new SqlParameter("p1", 0),
        new SqlParameter("p2", myDate), //myDate has value
        new SqlParameter("p3", DBNull.Value),
        new SqlParameter("p4", DBNull.Value),
        new SqlParameter("p5", myValue),//myValue has value
        new SqlParameter("p6", 0),
        new SqlParameter("p7", string.Empty));//I tried this with DBNull.Value; but no difference
}

有人能帮忙吗?

参数化查询需要未提供的参数p1

"由于某种原因,当我传递0时,它被转换为BigInt。我不知道为什么。我将0解析为int,它成功了。

using (var context = new DbContext())
{   
    context.Database.ExecuteSqlCommand(
        @"EXEC dbo.MyProc @p1, @p2, @p3, @p4, @p5, @p6, @p7",
        new SqlParameter("p1", int.Parse("0"),
        new SqlParameter("p2", myDate),
        new SqlParameter("p3", DBNull.Value),
        new SqlParameter("p4", DBNull.Value),
        new SqlParameter("p5", myValue),
        new SqlParameter("p6", int.Parse("0")),
        new SqlParameter("p7", DBNull.Value));
}

@"在声明SqlParameter时是可选的,带或不带都可以。当使用SqlParameter重载(字符串、对象)时,您可以强制转换一个常量值,如0,如下所示:

new SqlParameter("@p1", (object)0)

因为它确实期望一个对象。这也适用于较新的Microsoft.Data.SqlClient程序集。

除了上面的答案之外,我还通过将数据作为字符串发送来解决这个问题。例如

context.Database.ExecuteSqlCommand(
                            "UPDATE event_triggers SET event_status=@event_status WHERE event_name=@event_name",
                            new SqlParameter("@event_name", $"{(int)triggerName}"),
                            new SqlParameter("@event_status", $"{(int)eventStatus}"));

请注意$"{您的int值在这里}"

新的SqlParameter("@event_status",$"{(int)eventStatus}")