Процедура обновляет только первое значение

#vb.net #stored-procedures #foreach #parameters

#vb.net #хранимые процедуры #foreach #параметры

Вопрос:

У меня есть эта процедура SQL для обновления записей с заданным значением @StepId. Я получил значения из скрытого поля в виде массива и зациклил их. Проблема в том, что процедура обновляет только первое значение. Цикл происходит, но не обновляет более 1 значения. мой массив содержит что-то вроде {1000,2000,3000,} моими параметрами являются @StepId (int) @DateCalculationRule (char) @Result (int)

 Private Sub buttonCalculateDatesClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles buttonCalculateDates.Click

        Dim mySteps As String
        Dim myRule As String
        Dim ok As Integer = 1
        Dim connectionString As String = WebConfigurationManager.ConnectionStrings("cnnstring").ConnectionString
        Dim conn As SqlConnection = New SqlConnection(connectionString)
        Dim cmd As New SqlCommand("SaveStepDeadlineRule", conn)
        conn.Open()
        conn.CreateCommand()
        cmd.CommandType = CommandType.StoredProcedure
        myRule = HiddRule.Value
        mySteps = HiddStepIDs.Value

        'Separate string by comas
        Dim parts As String() = mySteps.Split(New Char() {","c})
        Dim part As String

        For Each part In parts

            cmd.Parameters.Add(New SqlParameter("@StepId", part))
            cmd.Parameters.Add(New SqlParameter("@DateCalculationRule", myRule))
            cmd.Parameters.Add(New SqlParameter("@Result", 0))
            cmd.Parameters("@Result").Direction = ParameterDirection.Output
            Try

                cmd.ExecuteNonQuery()
                ok = IIf(IsDBNull(cmd.Parameters("@Result").Value), 1, cmd.Parameters("@Result").Value)
                RadGrid1.Rebind()


            Catch ex As Exception
                ok = 1
            End Try

        Next
        conn.Close()
    End Sub
 

Комментарии:

1. Должны ли вы очищать коллекцию параметров после каждого выполнения?

Ответ №1:

Вам нужно будет очищать свои параметры каждый раз, когда вы выполняете цикл:

 cmd.Parameters.Clear
 

Вот как это будет использоваться:

 For Each part In parts
    cmd.Parameters.Clear()

    cmd.Parameters.Add(New SqlParameter("@StepId", part))
    cmd.Parameters.Add(New SqlParameter("@DateCalculationRule", myRule))
    cmd.Parameters.Add(New SqlParameter("@Result", 0))
    cmd.Parameters("@Result").Direction = ParameterDirection.Output
    Try

        cmd.ExecuteNonQuery()
        ok = IIf(IsDBNull(cmd.Parameters("@Result").Value), 1, cmd.Parameters("@Result").Value)
        RadGrid1.Rebind()

    Catch ex As Exception
        ok = 1
    End Try

Next
 

Вы можете создать параметры вне цикла, поскольку они не меняются, а затем просто присваивать значение каждый раз, когда вы выполняете цикл:

 cmd.Parameters.Add(New SqlParameter("@StepId", 0))
cmd.Parameters.Add(New SqlParameter("@DateCalculationRule", ""))
cmd.Parameters.Add(New SqlParameter("@Result", 0))
cmd.Parameters("@Result").Direction = ParameterDirection.Output

For Each part In parts
    cmd.Parameters("@StepId").Value = part
    cmd.Parameters("@DateCalculationRule").Value = myRule

    Try

        cmd.ExecuteNonQuery()
        ok = IIf(IsDBNull(cmd.Parameters("@Result").Value), 1, cmd.Parameters("@Result").Value)
        RadGrid1.Rebind()

    Catch ex As Exception
        ok = 1
    End Try

Next