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

Posted

技术标签:

【中文标题】参数化查询需要未提供的参数 p1【英文标题】:The parameterized query expects the parameter p1 which was not supplied 【发布时间】:2016-04-16 11:06:34 【问题描述】:

我有一个存储过程如下:

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

但是当我使用 Entity Framework 的 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

谁能帮忙?

【问题讨论】:

你能试试 new SqlParameter("@p7", SqlChars.Null) @jpgrassi,我看到你删除了你的评论。这是难以置信的。我将 p1 和 p6 的值都更改为 1。有效。为什么讨厌0?我需要传递值 0,该值设置为默认值以显示存储过程中的所有信息。不幸的是,我无法更改存储过程 @halit,我没有发现任何区别。 所有参数都应该以@开头 @halit,我试过了,但没有任何区别。请参阅下面大卫回答下的评论。 【参考方案1】:

“由于某种原因,当我传递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));

【讨论】:

【参考方案2】:

“@”在声明 SqlParameter 时是可选的,有无都可以。使用 SqlParameter 重载 (string, object) 时,您可以像这样强制转换一个常量值,例如 0:

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

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

【讨论】:

以上是关于参数化查询需要未提供的参数 p1的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 参数化查询的功能就像它在 C# 应用程序中未参数化一样

VBA ADO 参数化 LIKE 查询

什么是参数化查询?

ASP.NET C# SQL 提交错误

如何使用Like运算符参数化查询

AWS Athena - 如何参数化 SQL 查询