none
Error al eliminar RRS feed

  • Pregunta

  • Hola, me podrían ayudar para ver donde puede estar el error?

    No me elimina la fila del datagrid.

     Private Function EliminarFilas() As Integer
    
            ' Hay que encerrar el código entre un bloque
            ' Try ... End Try a fin de capturar la excepción
            ' producida y actuar en consecuencia.
            '
            Try
                Using cnn As New SqlConnection("Data Source=MARTIN-PC;Initial Catalog=BASEDATOSCOMERCIO;Integrated Security=true")
    
                    ' Hay que abrir explícitamente la conexión
                    '
                    cnn.Open()
    
                    ' Creamos el comando.
                    '
                    Dim cmd As SqlCommand = cnn.CreateCommand()
    
                    ' Le indicamos la consulta T-SQL de
                    ' eliminación que vamos a ejecutar.
                    '
                    cmd.CommandText = _
                     "DELETE FROM PedProv " & _
                     "WHERE Id_PedPro = @Id_PedPro"
    
                    ' Almacenamos el número de registros que
                    ' se han eliminado.
                    '
                    Dim n As Integer
    
                    ' En lugar de recorrer todas las filas del
                    ' control DataGridView, únicamente recorremos
                    ' aquellas que actualmente se encuentran
                    ' seleccionadas.
                    '
                    For Each row As DataGridViewRow In DataGridView1.SelectedRows
    
                        ' Obtenemos el valor de la primera columna
                        ' de la fila actual, que se supone es el
                        ' valor del campo llamado Clave.
                        '
                        Dim Id As Object = row.Cells(0).Value
    
                        ' Limpiamos la colección de parámetros
                        cmd.Parameters.Clear()
    
                        ' Añadimos el parámetro
                        '
                        cmd.Parameters.AddWithValue("@Id_PedPro", Id_PedPro)
    
                        ' Ejecutamos la consulta
                        '
                        Dim result As Integer = cmd.ExecuteNonQuery()
    
                        ' Sumamos los registros eliminados
                        '
                        n += result
                    Next
    
                    ' Devolvemos el número de registros eliminados
                    MsgBox("Pedido eliminado")
                    Return n
    
                End Using
    
            Catch ex As Exception
                ' Devolvemos la excepción al procedimiento llamador
                MsgBox("Ocurrio un error al eliminar")
    
            End Try
    
        End Function
    
        Private Function Id_pedPro() As Object
            Throw New NotImplementedException
        End Function

    Saludos
    lunes, 7 de noviembre de 2016 16:53

Respuestas

  • Hola Pedro9089,

    [-] ... me podrían ayudar para ver donde puede estar el error?

    Pero que error te muestra ?

    Aparte de lo mencionado por Rodripelto, es lógico que te muestre un error ya que envías el resultado de una función y está no está implementada para devolver un valor.

    Private Function Id_pedPro() As Object
         Throw New NotImplementedException
    End Function

    Además, si cambias el valor por el de la fila te mostraría otro error : la propiedad Connection no se ha inicializado, ya que nunca estableces la conexión al SQLCommad, no lo asignas al constructor y menos a la propiedad Connection :

     cmd.Connection = cnn

    Tu código podrías simplificarse a :

     Private Function EliminarFilas() As Integer
            Using cnn As New SqlConnection("MiCadenaConexion")
                cnn.Open()
    
                Dim query = "DELETE FROM PedProv WHERE Id_PedPro = @id"
                Dim cmd As New SqlCommand(query, cnn)
    
                Dim n As Integer = 0
    
                For Each row As DataGridViewRow In DataGridView1.SelectedRows
                    cmd.Parameters.Clear()
                    cmd.Parameters.AddWithValue("@id", CInt(row.Cells(0).Value))
    
                    n += cmd.ExecuteNonQuery()
                Next
    
                MsgBox("Pedidos eliminados")
                Return n
            End Using
        End Function

    Es importante visualizar el mensaje de error para detectar el problema y/o parte del código que la está produciendo, si implementas un mensaje personalizado te mostrará "Ocurrió un problema" pero nunca sabrás el porqué ?

       Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
            Try
                EliminarFilas()
                'Cargas nuevamente los datos al DGV para actualizar la grilla
                cargarDatos()
            Catch ex As Exception
                MessageBox.Show(ex.Message)  'Muestra el error que se produce
            End Try
        End Sub

    No obstante, ya que estás elaborando una eliminación masiva podrías crear una columna de tipo DataGridViewCheckBoxColumn para que el usuario seleccione las filas a eliminar (solo es una sugerencia).

    También podrías hacer uso de Transacciones usando SQLTransaction tal y como muestro aquí. Imagínate que tengas que eliminar 10 registros y se te produce error en el registro 5, sería bueno controlar eso.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Federico32113 lunes, 7 de noviembre de 2016 21:53
    lunes, 7 de noviembre de 2016 19:27
  • Hola,

    Creo que tu error está en

    cmd.Parameters.AddWithValue("@Id_PedPro", Id_PedPro)
    

    Pones Id_PedPro cuando más arriba declaras una variable que se llama Id que contiene el valor de la celda.

    Un saludo.


    Es de buena educación dar las gracias cuando te ayudan, si alguna respuesta te ha sido de utilidad agradécelo marcandola como útil.
    Blog

    • Marcado como respuesta Federico32113 lunes, 7 de noviembre de 2016 21:53
    lunes, 7 de noviembre de 2016 17:45

Todas las respuestas

  • Hola,

    Creo que tu error está en

    cmd.Parameters.AddWithValue("@Id_PedPro", Id_PedPro)
    

    Pones Id_PedPro cuando más arriba declaras una variable que se llama Id que contiene el valor de la celda.

    Un saludo.


    Es de buena educación dar las gracias cuando te ayudan, si alguna respuesta te ha sido de utilidad agradécelo marcandola como útil.
    Blog

    • Marcado como respuesta Federico32113 lunes, 7 de noviembre de 2016 21:53
    lunes, 7 de noviembre de 2016 17:45
  • Hola Pedro9089,

    [-] ... me podrían ayudar para ver donde puede estar el error?

    Pero que error te muestra ?

    Aparte de lo mencionado por Rodripelto, es lógico que te muestre un error ya que envías el resultado de una función y está no está implementada para devolver un valor.

    Private Function Id_pedPro() As Object
         Throw New NotImplementedException
    End Function

    Además, si cambias el valor por el de la fila te mostraría otro error : la propiedad Connection no se ha inicializado, ya que nunca estableces la conexión al SQLCommad, no lo asignas al constructor y menos a la propiedad Connection :

     cmd.Connection = cnn

    Tu código podrías simplificarse a :

     Private Function EliminarFilas() As Integer
            Using cnn As New SqlConnection("MiCadenaConexion")
                cnn.Open()
    
                Dim query = "DELETE FROM PedProv WHERE Id_PedPro = @id"
                Dim cmd As New SqlCommand(query, cnn)
    
                Dim n As Integer = 0
    
                For Each row As DataGridViewRow In DataGridView1.SelectedRows
                    cmd.Parameters.Clear()
                    cmd.Parameters.AddWithValue("@id", CInt(row.Cells(0).Value))
    
                    n += cmd.ExecuteNonQuery()
                Next
    
                MsgBox("Pedidos eliminados")
                Return n
            End Using
        End Function

    Es importante visualizar el mensaje de error para detectar el problema y/o parte del código que la está produciendo, si implementas un mensaje personalizado te mostrará "Ocurrió un problema" pero nunca sabrás el porqué ?

       Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
            Try
                EliminarFilas()
                'Cargas nuevamente los datos al DGV para actualizar la grilla
                cargarDatos()
            Catch ex As Exception
                MessageBox.Show(ex.Message)  'Muestra el error que se produce
            End Try
        End Sub

    No obstante, ya que estás elaborando una eliminación masiva podrías crear una columna de tipo DataGridViewCheckBoxColumn para que el usuario seleccione las filas a eliminar (solo es una sugerencia).

    También podrías hacer uso de Transacciones usando SQLTransaction tal y como muestro aquí. Imagínate que tengas que eliminar 10 registros y se te produce error en el registro 5, sería bueno controlar eso.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Federico32113 lunes, 7 de noviembre de 2016 21:53
    lunes, 7 de noviembre de 2016 19:27