В процедуре указано слишком много аргументов - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть этот код в функции:

    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 и т. Д.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Я исправлю это:

        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. Спасибо за ответы и предоставленную помощь.

0 голосов
/ 06 февраля 2020

Вы, кажется, получаете 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 is Dictionary (Of строка, объект), которая имеет имена параметров без @ и значений?)

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 / секунда ForEach прочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...