过程或函数“过程名称”需要一个未提供的参数“参数名称”很少发生

Posted

技术标签:

【中文标题】过程或函数“过程名称”需要一个未提供的参数“参数名称”很少发生【英文标题】:Procedure or function "Procedure name" expects a parameter "Param name" which was not supplied occurs rarely 【发布时间】:2014-04-22 05:00:34 【问题描述】:

我在 VB.NET 中有一个 Web 服务函数,它将参数发送到 SQL Server 存储过程。

在部署的机器上运行了两个月,一切正常。

但现在错误

过程或函数 GetEmployeeDetails 需要一个未提供的参数 @Progress'

在部署的机器上只发生一次。

出错前后一切正常。

网络服务代码:

 Public Function GetLocation(ByVal oldNumber As Integer, ByVal NewNumber As Integer, ByVal Location As String,ByVal Progress As String, ByVal Name As String, ByVal ID As String) As String
 Try
    Command1 = New SqlCommand("GetEmployeeDetails", connection1)

    With Command1
        .CommandType = CommandType.StoredProcedure
        .Parameters.Add("@oldNumber", SqlDbType.Int).Value = oldNumber
        .Parameters.Add("@NewNumber", SqlDbType.Int).Value = NewNumber
        .Parameters.Add("@Location", SqlDbType.VarChar, 10).Value = Location
        .Parameters.Add("@Progress", SqlDbType.Char, 10).Value = IIf(Progress = "", System.DBNull.Value, Progress)
        .Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = Name
        .Parameters.Add("@ID", SqlDbType.VarChar, 50).Value = ID

        .Connection.Open()
        .ExecuteNonQuery()
        .Connection.Close()
    End With

存储过程参数:

ALTER PROCEDURE GetEmployeeDetails 
(
    @oldNumber AS INTEGER,
    @NewNumber AS INTEGER, 
    @Location AS VARCHAR(10),
    @Progress AS CHAR(1),
    @Name AS VARCHAR(50),
    @ID AS VARCHAR(50)
) 
As

我只是想知道为什么所有参数都正确传递后会报错?

【问题讨论】:

您可以尝试将DBNull.Value 以外的其他内容传递给@Progress 吗?如果值为空 ("") - 你可以传入 * 或其他什么吗?如果您不为给定参数提供值,则可能会发生此错误(“未提供参数”),例如如果您的源值恰好为 null 或为空 marc_s 如果我通过 DBNULL.Value 是不是错了,但它一直正常工作。 不确定它是否真的是 @Progress 参数 - 但我怀疑其中一个参数被设置为 null 或空,因此存储过程“认为”它没有得到值。 ... @Progress 是 CHAR(1) 还是 CHAR(10)? 它是 Char(1),但在 VB.NET 中用作 char(10) 会产生任何差异 【参考方案1】:

因为您在 sql 中将参数声明为 CHAR(1),但在 Vb.net 中却像 Char(10) 一样使用。

试试这个

ALTER PROCEDURE GetEmployeeDetails 
(
    @oldNumber AS INTEGER,
    @NewNumber AS INTEGER, 
    @Location AS VARCHAR(10),
    @Progress AS CHAR(10),
    @Name AS VARCHAR(50),
    @ID AS VARCHAR(50)
) 
As

【讨论】:

该错误很少发生。真的是 Char 声明有很大的不同。因为当我们将 10 个字符传递给声明为 Char(1) 的 Sql 变量时,它将截断除第一个之外的字符。

以上是关于过程或函数“过程名称”需要一个未提供的参数“参数名称”很少发生的主要内容,如果未能解决你的问题,请参考以下文章

过程或函数“SP”需要参数“@param”,但未提供该参数

过程或函数“uspExportGetMailinfoTest”需要参数“@CUSTOMER”,但未提供该参数。我错过了啥?

存储过程或函数需要未提供的参数

存储过程与自定义函数

delphi 过程或函数需要参数,但未提供

MySQL存储过程语句及调用