#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