none
Guardar valor Nulo en campo image en base de datos

    Pregunta

  • Hola, estoy guardando datos de empleados como nombre, dni, y entre ellos también incluyo la foto del empleado.

    Cuando se selecciona la foto por medio de un openfiledialog, muestro la imagen a través de un Picturebox.

    Puedo guardar la foto perfectamente, el problema es que en ocaciones me gustaria poder dar de alta al empleado sin una imagen, pero no se como hacer para guardar un valor nulo en el campo foto en mi base de datos (el cual esta definido como Image y tengo habilitado la opcion de NULL).

    Este fragmento de codigo es lo que utilizo para guardar la imagen.

    Private Sub Button_Guardar_Click(sender As Object, e As EventArgs) Handles Button_Guardar.Click Dim Empleado As New Empleados

    Empleado._Apellido = Trim(TB_Apellido.Text.ToUpper) Empleado._Nombre = Trim(TB_Nombre.Text.ToUpper) Empleado._Dni = TB_Dni.Text Dim MS As New MemoryStream Me.PictureBox_Foto.Image.Save(MS, Me.PictureBox_Foto.Image.RawFormat) Empleado._Foto = MS.GetBuffer Empleado.AgregarEmpleado() End Sub

     Public Sub AgregarEmpleado()
            Dim cn As New SqlConnection
            Dim cmd As New SqlCommand
            cn.ConnectionString = Clases.CadenaConexion
    
            cmd.CommandType = CommandType.Text
            cmd.Parameters.AddWithValue("@Apellido", Apellido)
            cmd.Parameters.AddWithValue("@Nombre", Nombre)
            cmd.Parameters.AddWithValue("@Dni", Dni)
            cmd.Parameters.AddWithValue("@Foto", Foto)
            cmd.CommandText = "INSERT INTO Empleados (Apellido, Nombre, Dni, Foto) VALUES(@Apellido, @Nombre, @Dni,@Foto)"
            cmd.Connection = cn
    
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
        End Sub
    Foto en VB.NET esta definido como byte().


    Espero que alguien me pueda orientar.

    Gracias.

    sábado, 19 de noviembre de 2016 17:19

Respuestas

  • Hola MariaRobles,

    Solo tendrías que hacer una validación a la propiedad si es Nothing o no, y dependiendo del resultado asignar el valor DBNull.Value

    Algo como :

    If Foto Is Nothing Then
       cmd.Parameters.Add("@Foto", SqlDbType.Binary).Value = DBNull.Value
    Else
       cmd.Parameters.Add("@Foto", SqlDbType.Binary).Value = Foto
    End If

    O usando IF(...).

    cmd.Parameters.AddWithValue("@Foto", If(Foto Is Nothing, SqlTypes.SqlBinary.Null, Foto))

    Dónde : Si foto es nulo agregará como valor  SQLBinary.Null , y si no lo es agregará el valor que tiene Foto.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta MariaRobles sábado, 19 de noviembre de 2016 17:56
    sábado, 19 de noviembre de 2016 17:42

Todas las respuestas

  • Hola MariaRobles,

    Solo tendrías que hacer una validación a la propiedad si es Nothing o no, y dependiendo del resultado asignar el valor DBNull.Value

    Algo como :

    If Foto Is Nothing Then
       cmd.Parameters.Add("@Foto", SqlDbType.Binary).Value = DBNull.Value
    Else
       cmd.Parameters.Add("@Foto", SqlDbType.Binary).Value = Foto
    End If

    O usando IF(...).

    cmd.Parameters.AddWithValue("@Foto", If(Foto Is Nothing, SqlTypes.SqlBinary.Null, Foto))

    Dónde : Si foto es nulo agregará como valor  SQLBinary.Null , y si no lo es agregará el valor que tiene Foto.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta MariaRobles sábado, 19 de noviembre de 2016 17:56
    sábado, 19 de noviembre de 2016 17:42
  • Muchas gracias Joel C. Naupa Crispín!!!! pude solucionar mi problema, estoy muy contenta y agradecida.
    sábado, 19 de noviembre de 2016 17:56
  • Hola Joel C. Naupa Crispín, te hago una consulta he estado intentando hacer lo mismo que me indicaste pero para una variable de valor bit en la BD (boolean en VB.NET). Utilizando el siguiente código:

    cmd.Parameters.AddWithValue("@Estado", If(Estado = Nothing, SqlTypes.SqlBoolean.Null, Estado))

    El problema es que cuando la variable toma valor 0 me guarda NULL en la BD en vez del número 0. Supongo que es porque cuando vale 0 se supone que es  igual a nothing?. Yo necesito guardar el 1 o 0 esto depende de si se tilda un checkbox, donde luego se selecciona unos de los dos estados posibles (1, 0), si no se tilda el checkbox recién ahi guardar NULL en la BD.

    ¿cómo podria arreglar esto?

    Muchas gracias de antemano.
    lunes, 21 de noviembre de 2016 3:01
  • Hola MariaRobles,

    Lo que pasa es que estás queriendo tomar 3 tipo de resultado, 0, 1 y null, pero el checkBox solo tiene dos estador Chekeado y No Checkeado.

    Ya que necesitas usar tres estados, podrías activar el atributo ThreeState = True, el cual te permitirá usar un estado 'extra' conocido mayormente como un valor indeterminado (Indeterminate).

    Para obtener el resultado de la selección tendrías que usar el CheckState para obtener el estado de la selección.

    Select Case CheckBox1.CheckState
        Case CheckState.Checked
            MessageBox.Show("Está checkeado")
        Case CheckState.Indeterminate
            MessageBox.Show("Es indeterminado")
        Case Else 'CheckState.Unchecked 
            MessageBox.Show("No está checkeado")
    End Select

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 21 de noviembre de 2016 5:25