none
Ejecutar un Stored Procedure dentro de un ciclo for RRS feed

  • Pregunta

  • Buenas noches

    Tengo una duda acerca de un proceso que estoy ejecutando, lo que pasa es que tengo un grid con un checkbox que agrego con un itemtemplate, una vez que ejecuto el programa, doy la opcion de seleccionar cualquier celda y de alli, mandar el ID a la BD para eliminar el registro, pero necesito hacerlo al momento de dar click en un boton que ya tengo agregado.

    Para leer el valor de cada celda, tengo un for, que recorre celda por celda, dentro de ese for, tengo la asignacion del checkbox a una variable la cual me va a permitir determinar que celda esta seleccionada y cual no, y de alli, capturo el ID de la celda, de acuerdo al parametro DATAKEYS que defini dentro del gridview, el detalle, es que ese ID necesito mandarlo al SP directamente, que haga el borrado dentro de la BD y despues vuelva al ciclo, el problema es que cuando hago ese recorrido, la primera vez, funciona bien, el problema es que cuando vuelve a entrar al for y encuentra otra celda seleccionada, marca error de que se estan enviando muchos parametros al SP y solo debe de recibir 1, entonces no se en que momento se esta uniendo el valor o como lo mande, ya que el ExecuteNonQuery() solo deberia de ejecutarse una vez, agrego el ejemplo de como lo estoy realizando, dado que ya intente con varias opciones, ya intente dentro del IF abrir y cerrar la BD y no permite, ya intente abrir la BD antes de entrar al for y cerrar al terminar el ciclo y usar una lista no se si me permita mandarlos y en el SP, mandarlo con un in (), pero no se si me agregue las comas que van entre cada valor, realmente ya me confundi, porque no se en que punto me esta generando problema.

    Adjunto codigo para revision...

    Try


                oConexion.ConnectionString = connString.ToString


                oConexion.Open()


                oComando.CommandTimeout = 3
                oComando.CommandText = "sp_borraempleados"
                oComando.CommandType = Data.CommandType.StoredProcedure
                oComando.Connection = oConexion


                For index As Integer = 0 To gvwrecopilar.Rows.Count() - 1


                    cb = CType(gvwrecopilar.Rows(index).FindControl("chbseleccion"), CheckBox)


                    If cb.Checked Then


                        id = gvwrecopilar.DataKeys(index).Value

                        oComando.Parameters.AddWithValue("@id", id)

                        oComando.ExecuteNonQuery()

                    End If


                Next

                oConexion.Close()
                oComando = Nothing
                oConexion = Nothing


            Catch ex As Exception


                lblerror.Text = ex.Message


            End Try 

    Agradezco su atencion y quedo en espera de su amable respuesta...


    Diego Berra Suarez

    miércoles, 8 de febrero de 2012 6:15

Respuestas

  • hola

    aconsejaria estructures algo mejor el codigo

    Try
    
    
    	Using cnn As New SqlConnection(connString.ToString)
    		cnn.Open()
    		
    		Dim cmd As New SqlCommand("sp_borraempleados", cnn)
    		cmd.CommandType = Data.CommandType.StoredProcedure
    		
    		For Each row As GridViewRow In gvwrecopilar.Rows
    
    			Dim cb As CheckBox = CType(row.FindControl("chbseleccion"), CheckBox)
    
    			If cb.Checked Then
    
    				Dim id As Integer = CInt(gvwrecopilar.DataKeys(row.Index).Value)
    				
    				cmd.Parameters.Clear()
    				cmd.Parameters.AddWithValue("@id", id)
    				cmd.ExecuteNonQuery()
    
    			End If
    
    
    		Next
    
    	End Using
    
    Catch ex As Exception
    	lblerror.Text = ex.Message
    End Try 

    compara esta estructura con la que tienes y veras que queda algo mas mantenible

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Propuesto como respuesta Corsario007 miércoles, 8 de febrero de 2012 18:46
    • Marcado como respuesta robotony79 jueves, 9 de febrero de 2012 5:04
    miércoles, 8 de febrero de 2012 11:47

Todas las respuestas

  • El problema es que a cada vuelta del bucle haces un "oComando.Parameters.AddWithValue...", con lo que cada vez el oComando tiene un parámetro más.

    Una solución sencilla es poner oComando.Parameters.Clear() al principio del bucle.

    Otra solución más eficiente es usar oComando.Parameters.Add.... para crear el parámetro FUERA del bucle, y luego dentro del bucle simplemente cambiar el .Value del parámetro (en lugar de volver a añadir el parámetro).

    miércoles, 8 de febrero de 2012 8:24
  • hola

    aconsejaria estructures algo mejor el codigo

    Try
    
    
    	Using cnn As New SqlConnection(connString.ToString)
    		cnn.Open()
    		
    		Dim cmd As New SqlCommand("sp_borraempleados", cnn)
    		cmd.CommandType = Data.CommandType.StoredProcedure
    		
    		For Each row As GridViewRow In gvwrecopilar.Rows
    
    			Dim cb As CheckBox = CType(row.FindControl("chbseleccion"), CheckBox)
    
    			If cb.Checked Then
    
    				Dim id As Integer = CInt(gvwrecopilar.DataKeys(row.Index).Value)
    				
    				cmd.Parameters.Clear()
    				cmd.Parameters.AddWithValue("@id", id)
    				cmd.ExecuteNonQuery()
    
    			End If
    
    
    		Next
    
    	End Using
    
    Catch ex As Exception
    	lblerror.Text = ex.Message
    End Try 

    compara esta estructura con la que tienes y veras que queda algo mas mantenible

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Propuesto como respuesta Corsario007 miércoles, 8 de febrero de 2012 18:46
    • Marcado como respuesta robotony79 jueves, 9 de febrero de 2012 5:04
    miércoles, 8 de febrero de 2012 11:47
  • Que tal

    Muchas gracias por sus respuestas, agradezco la nueva estructura de codigo que me envias y la voy a poner en practica, ademas de esto, voy a agregar el Parameters.Clear para eliminar el valor que manejo desde cada entrada al for.

    Gracias por su atencion y les deseo un excelente dia!!!

    Saludos


    Diego Berra Suarez

    jueves, 9 de febrero de 2012 5:06