none
Valor DBNULL al eliminar datos de datagridView RRS feed

  • Pregunta

  • Hola!
    Tengo un problema al eliminar filas de la Base de Datos.
    El código funciona bien menos cuando en alguna de las columnas tengo el valor "" es decir, vacio. (DBNull)

    Como podría controlar esto? para que lo borrara?

    Este es el código que utilizo:

        Sub eliminarLector()
            Dim CMD As New OleDb.OleDbCommand("DELETE FROM Loquesea WHERE Nombre='" & DataGridView1.CurrentRow.Cells("Nombre").Value & "'and Apellido='" & DataGridView1.CurrentRow.Cells("Apellido").Value & "' and Apellido2='" & DataGridView1.CurrentRow.Cells("Apellido2").Value & "'", MyConexion)
            Dim CERRAR As String
            CERRAR = MsgBox("¿ELIMINAR LECTOR?", MsgBoxStyle.YesNo)
            If CERRAR = MsgBoxResult.Yes Then
                MyConexion.Open()
                CMD.ExecuteNonQuery()
                MyConexion.Close()
                MsgBox("LECTOR ELIMINADO")
            End If
    
    
        End Sub

    • Cambiado Enrique M. Montejo domingo, 18 de diciembre de 2016 10:27 Pregunta relacionada con el acceso a datos.
    miércoles, 14 de diciembre de 2016 11:35

Todas las respuestas

  • Spagetini,

    Lo primero a validar es que la fila actual contenga una referencia válida a un objeto de tipo DataGridViewRow, para convertir un valor DBNull a String.Empty puedes usar el método Convert.ToString(), además, es recomendable parametrizar la consulta sql:

    Sub eliminarLector()
    
    	'Obtener una referencia a la fila actual
    	Dim Fila As DataGridViewRow = DataGridView1.CurrentRow
    
    	If Fila IsNot Nothing Then '¿Es una referencia válida?
    		If MessageBox.Show("¿Desea eliminar el lector?", "Title", MessageBoxButtons.YesNo) =
    			DialogResult.Yes Then
    
    			MyConexion.Open() 'Abrir conexión
    
    			Dim ConsultaSQL As String = "DELETE FROM NombreTabla 
                                    WHERE Nombre = ? AND Apellido = ? AND Apellido2 = ?"
    			Dim cmd As New OleDbCommand(ConsultaSQL, MyConexion)
    
    			'Agregar parámetros a la colección
    			cmd.Parameters.AddWithValue("@p1", Convert.ToString(Fila.Cells("Nombre").Value))
    			cmd.Parameters.AddWithValue("@p2", Convert.ToString(Fila.Cells("Apellido").Value))
    			cmd.Parameters.AddWithValue("@p3", Convert.ToString(Fila.Cells("Apellido2").Value))
    
    			'Ejecutar consulta
    			cmd.ExecuteNonQuery()
    
    			MyConexion.Close()
    			MsgBox("LECTOR ELIMINADO")
    		End If
    	End If
    
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_AC miércoles, 14 de diciembre de 2016 15:34
    • Votado como útil Joyce_AC viernes, 16 de diciembre de 2016 16:45
    miércoles, 14 de diciembre de 2016 15:12
  • Hola, 

    "El código funciona bien menos cuando en alguna de las columnas tengo el valor "" es decir, vacio. (DBNull)"

    Primero comentarte que un valor string vacío "" no es igual aun null de la base de datos.

    la manera para igualar un valor null en la base de datos es usar is null tanto en access como sql,acá te adjunto algo de código aunque falta mas lógica para el caso en que el primer apellido sea nulo o el nombre sea nulo u otras combinaciones en este caso solo se está validando que el sdo apellido sea nulo

    Por otro lado y como seguro alguien más te va a comentar es conveniente que las tablas tengan un identificador como una llave primaria y eso facilitaría que borres por esa clave.

      Dim query As String = String.Empty
    
            Using conn As New OleDbConnection(ConfigurationManager.ConnectionStrings("default").ToString())
                conn.Open()
               
                If DataGridView1.CurrentRow.Cells("NOMBRE").Value IsNot DBNull.Value And
                    DataGridView1.CurrentRow.Cells("APELLIDO1").Value IsNot DBNull.Value And
                    DataGridView1.CurrentRow.Cells("APELLIDO2").Value IsNot DBNull.Value Then
                    query = "DELETE FROM Tb_Personas WHERE Nombre='" & DataGridView1.CurrentRow.Cells("NOMBRE").Value & "'" &
                        "and Apellido1=" & "'" & DataGridView1.CurrentRow.Cells("Apellido1").Value & "'" &
                        "and Apellido2=" & "'" & DataGridView1.CurrentRow.Cells("Apellido2").Value & "'"
    
                ElseIf DataGridView1.CurrentRow.Cells("NOMBRE").Value IsNot DBNull.Value And
                    DataGridView1.CurrentRow.Cells("APELLIDO1").Value IsNot DBNull.Value And
                    DataGridView1.CurrentRow.Cells("APELLIDO2").Value Is DBNull.Value Then
                    query = "DELETE FROM Tb_Personas WHERE Nombre='" & DataGridView1.CurrentRow.Cells("NOMBRE").Value & "'" &
                      "and Apellido1=" & "'" & DataGridView1.CurrentRow.Cells("Apellido1").Value & "'" &
                      "and Apellido2 is null"
                End If
                Dim CMD As New OleDb.OleDbCommand(query, conn)
                CMD.ExecuteNonQuery()
                conn.Close()
            End Using


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.





    • Editado Augusto1982 miércoles, 14 de diciembre de 2016 16:26
    miércoles, 14 de diciembre de 2016 16:11
  • Hola Spagetini,

    No recomendaría la eliminación de esa manera, y peor aún si los campos aceptan valores 'Null' en la BD. La eliminación tendría que ser por el ID o Código (la primary key de la tabla). Si no quieres mostrar el ID del lector en el DataGridView podrías ocultar la columna :

    Me.DataGridView1.Columns("ID").Visible = False

    Así, al momento de hacer la eliminación tomas el ID a eliminar y listo.

    Algo como :

    Dim row As DataGridViewRow = DataGridView1.CurrentRow


    Validas que la fila actual no sea nula.

    Dim query As String = "DELETE FROM NombreTabla WHERE ID = ?"
    
    Dim cmd As New OleDbCommand(query, con)
    cmd.Parameters.AddWithValue("@id", row.Cells("ID").Value.ToString())
    
    cmd.ExecuteNonQuery()
    
    MsgBox("LECTOR ELIMINADO")

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    miércoles, 14 de diciembre de 2016 17:29
  • Gracias por tu respuesta pero la cosa es que no son lectores, con lo cual en esa tabla no hay una primary key.
    Gracias de todas maneras!
    jueves, 15 de diciembre de 2016 10:43