【问题标题】:The procedure has too many arguments specified该过程指定的参数过多
【发布时间】:2020-02-06 15:40:46
【问题描述】:

我把这段代码变成了一个函数:

    Adp.SelectCommand = New SqlCommand()
    Adp.SelectCommand.Connection = oConn
    Adp.SelectCommand.CommandText = sp
    Adp.SelectCommand.CommandType = CommandType.StoredProcedure
    SqlCommandBuilder.DeriveParameters(Adp.SelectCommand)
    table = New DataTable
    Dim resultado = 0

    Dim inputParamList As New List(Of SqlParameter)
    For Each param As SqlParameter In Adp.SelectCommand.Parameters
        If param.Direction = Data.ParameterDirection.Input OrElse _
           param.Direction = Data.ParameterDirection.InputOutput Then
            inputParamList.Add(param)
        End If
    Next

    For Each parame As SqlParameter In inputParamList
        Dim metodo() As String
        Dim paramName As String = parame.ParameterName.ToString()
        Dim paramValue As Object = DBNull.Value

        metodo = parame.ParameterName.ToString().Split("@")
        paramValue = Parametros(metodo(1))
        Adp.SelectCommand.Parameters.AddWithValue(paramName, paramValue)
    Next

    resultado = Adp.SelectCommand.ExecuteNonQuery()
    Adp.Fill(table)

Catch ex As Exception
    MessageBox.Show("Ocurrió una excepción en: " + ex.Message + "", "SystemA", _
                     MessageBoxButtons.OK)
    Adp.Dispose()
    table.Dispose()
End Try

Return table

基本上,我要做的是直接将存储过程具有的参数读取到数据库中,并根据我拥有的数量(输入)在此循环中创建它们。到目前为止一切顺利,当我必须用数据库中的行结果填充 DataTable 时,我收到消息:“该过程指定了太多参数”。但是如果我调试代码,它会正确地为我分配 sql 值和参数。如果它们是 3,则创建 3,如果是 1,则创建 1,依此类推。

【问题讨论】:

  • 该错误意味着 SQL Server 上的存储过程不希望您发送给它的参数那么多。由于我们看不到您正在执行的存储过程或传递给它的参数,因此我们只能建议您仔细检查所有假设。
  • 这很奇怪,因为在循环中它会生成并传递正确数量的参数(因为我从 BD 获取它们)。如果其他人发生在你身上,请告诉我你的经历。
  • metodo = parame.ParameterName.ToString().Split("@") 将从参数名称中删除 @@ 不得从参数名称中删除。

标签: sql-server vb.net ado.net


【解决方案1】:

我正在修复它:

        Dim inputParamList As New List(Of SqlParameter)
        For Each param As SqlParameter In Adp.SelectCommand.Parameters
            If param.Direction = Data.ParameterDirection.Input OrElse param.Direction = Data.ParameterDirection.InputOutput Then
                inputParamList.Add(param)
            End If
        Next

        For Each parame As SqlParameter In inputParamList
            Dim metodo() As String
            Dim paramName As String
            Dim paramValue As Object

            metodo = parame.ParameterName.ToString().Split("@")
            paramName = parame.ParameterName
            paramValue = Parametros(metodo(1))

            Adp.SelectCommand.Parameters(parame.ParameterName).Value = paramValue
       ==>  'Adp.SelectCommand.Parameters.Add(parame.ParameterName, parame.SqlDbType)
        Next

        Adp.Fill(table)

    Catch ex As Exception
        MessageBox.Show("Ocurrió una excepción en: " + ex.Message + "", "Sistema de Agencias", MessageBoxButtons.OK)
        Adp.Dispose()
        table.Dispose()
    End Try

    Return table

只需评论“添加”行即可。这是因为我试图添加参数并且足以将封装方法的值传递给 SQLParameter 类型的参数。感谢您提供的答案和帮助。

【讨论】:

    【解决方案2】:

    您似乎让 SqlCommandBuilder 从数据库下载所有参数信息并将其添加到具有填充参数集合的 SqlCommand 中,但随后您跳过它查找输入参数,将它们加载到列表中并枚举它添加甚至同一命令的更多参数:

    For Each parame As SqlParameter In inputParamList
        Dim metodo() As String
        Dim paramName As String = parame.ParameterName.ToString()
        Dim paramValue As Object = DBNull.Value
    
        metodo = parame.ParameterName.ToString().Split("@")
        paramValue = Parametros(metodo(1))
    
        'you're adding more parameters, with a slightly different but essentially same name!!?
        Adp.SelectCommand.Parameters.AddWithValue(paramName, paramValue)
    Next
    

    当然,您应该只枚举现有参数并根据它们的名称为它们提供一个值(类型将/应该已经是正确的?Parametros 是一个 Dictionary(Of string, object),它的参数名称没有 @ 和 values ? )

    For Each param As SqlParameter In Adp.SelectCommand.Parameters
        If param.Direction = Data.ParameterDirection.Input OrElse _
           param.Direction = Data.ParameterDirection.InputOutput Then
            param.Value = Parametros(param.ParameterName.TrimStart("@"c))
        End If
    Next
    

    扔掉所有 List inputParam/second ForEach

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 2018-06-30
      • 2023-03-26
      • 2014-02-08
      相关资源
      最近更新 更多