none
Error al insertar datos he imagen en SQL server 2008 y visual studio 2013

    Pregunta

  • Hola, gracias por tomarse el tiempo para leer este detalle estoy tratando de insertar datos y una imagen pero me manda un erro

    este es el código:

     Public Sub ExecuteMyquery(MyCommand As SqlCommand, mymessage As String)
            conexion.Open()
            If MyCommand.ExecuteNonQuery = 1 Then
                MessageBox.Show(mymessage)
            Else
                MessageBox.Show("query no ejecutado")
            End If
            conexion.Close()
        End Sub
        Sub Guardarempleado()
            Dim conexion As New SqlConnection("Data Source=XXX-PC\SQLEXPRESS;Initial Catalog=checadorempleados;Integrated Security=True")
            conexion.Open()
            Dim ms As New MemoryStream
            PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
            Dim Foto() As Byte
            Foto = ms.ToArray()
            Dim Query As String = "INSERT INTO Empleados(Codigoempleado,Nombre,Foto,Areaempleado,Numerotelefonico,Numeroseguro,Direccion)VALUES(@Codigoempleado,@Nombre,@Foto,@areaempleado,@Numerotelefonico,@Numeroseguro,@Direccion)"
            Dim comando As New SqlCommand(Query, conexion)
            comando.Parameters.AddWithValue("@Codigoempleado", TextBox1.Text)
            comando.Parameters.AddWithValue("@Nombre", TextBox2.Text)
            comando.Parameters.AddWithValue("@Foto", PictureBox1.Image)
            comando.Parameters.AddWithValue("@Areaempleado", ComboBox1.Text)
            comando.Parameters.AddWithValue("@Numerotelefonico", TextBox3.Text)
            comando.Parameters.AddWithValue("@Numeroseguro", TextBox4.Text)
            comando.Parameters.AddWithValue("@Direccion", TextBox5.Text)

            Dim command As New SqlCommand(Query, conexion)
            command.Parameters.Add("@Foto", SqlDbType.Image).Value = Foto
            comando.ExecuteNonQuery()___ a qui es donde me manda el mensaje de error
            ExecuteMyquery(command, "Empleado Guardado")
            conexion.Close()
        End Sub

    este es el error que me manda:

    Información adicional: No hay ninguna asignación de tipo de objeto System.Drawing.Bitmap a un tipo nativo de un proveedor administrado conocido,.

    No entiendo por que me dice que no esta asignado...


    YOO

    jueves, 16 de febrero de 2017 1:23

Respuestas

  • Hola amigo he conseguido solucionar el error y dejo el código, ya corregido

    Sub Guardarempleado()
            Dim conexion As New SqlConnection("Data Source=XXX-PC\SQLEXPRESS;Initial Catalog=checadorempleados;Integrated Security=True")
            conexion.Open()
            Dim ms As New MemoryStream
            PictureBox1.Image.Save(ms, ImageFormat.Jpeg)
            Dim b As Byte() = ms.ToArray()
            Dim Query As String = "INSERT INTO Empleados(Codigoempleado,Nombre,Foto,Areaempleado,Numerotelefonico,Numeroseguro,Direccion)VALUES(@Codigoempleado,@Nombre,@Foto,@areaempleado,@Numerotelefonico,@Numeroseguro,@Direccion)"
            Dim comando As New SqlCommand(Query, conexion)
            comando.Parameters.AddWithValue("@Codigoempleado", TextBox1.Text)
            comando.Parameters.AddWithValue("@Nombre", TextBox2.Text)
            comando.Parameters.AddWithValue("@Foto", b)
            comando.Parameters.AddWithValue("@Areaempleado", ComboBox1.Text)
            comando.Parameters.AddWithValue("@Numerotelefonico", TextBox3.Text)
            comando.Parameters.AddWithValue("@Numeroseguro", TextBox4.Text)
            comando.Parameters.AddWithValue("@Direccion", TextBox5.Text)
            Dim command As New SqlCommand(Query, conexion)
            command.Parameters.Add("@Foto", SqlDbType.Image).Value = b
            comando.ExecuteNonQuery()
            conexion.Close()

     

    YOO

    • Marcado como respuesta eduardohpz jueves, 16 de febrero de 2017 20:04
    jueves, 16 de febrero de 2017 20:04

Todas las respuestas

  • Casi seguro que el error está aquí:

    comando.Parameters.AddWithValue("@Foto", PictureBox1.Image)

    Con la instrucción AddWithValue, le estás diciendo al sistema que examine el parámetro que le pasas (en este caso, PictureBoz1.Image) y a partir de él infiera cuál es el tipo de dato de SQL Server que corresponde utilizar para pasar esa información.

    Sin embargo, el dato "Image" pese a que tenga un nombre que parece indicar que podría "encajar" en un tipo de datos IMAGE en el servidor, en realidad no tiene nada que ver. Es una estructura compleja en memoria que tiene muchas propiedades, por lo que el proveedor de datos no sabe qué hacer con ella ni cómo transformarla en algo que SQL Server entienda.

    ¿Y qué es lo que SQL Server entiende? Pues en el caso de las imágenes, lo que tienes que hacer es salvar un dato del tipo "array de bytes". Así que tienes que tomar tu PictureBox.Image, y extraer de dentro los bytes que forman la imagen, y luego ese array de bytes es lo que le pasarías al AddWithValue. Para extraer los bytes, lo más normal es que uses el método Save del Image. El Save toma varios parámetros entre los cuales puedes indicar el formato (por ejemplo, jpg). Conviene que leas su documentación porque tiene varias opciones y sobrecargas:

    https://msdn.microsoft.com/en-us/library/9t4syfhh(v=vs.110).aspx

    Editado: Agrego un ejemplo de como convertir Image a byte():

    Dim ms as New MemoryStream()
    PictureBox1.Image.Save(ms, ImageFormat.Jpeg)
    Dim b as Byte() = ms.TpArray()
    command.Parameters.AddWithValue("@Foto", b)
    

    • Editado Alberto PoblacionMVP jueves, 16 de febrero de 2017 9:25 Adjuntar ejemplo
    • Propuesto como respuesta Willams Morales jueves, 16 de febrero de 2017 15:00
    • Marcado como respuesta eduardohpz jueves, 16 de febrero de 2017 20:03
    • Desmarcado como respuesta eduardohpz jueves, 16 de febrero de 2017 20:03
    • Votado como útil Joyce_ACModerator viernes, 17 de febrero de 2017 16:19
    jueves, 16 de febrero de 2017 7:43
  • Hola amigo he conseguido solucionar el error y dejo el código, ya corregido

    Sub Guardarempleado()
            Dim conexion As New SqlConnection("Data Source=XXX-PC\SQLEXPRESS;Initial Catalog=checadorempleados;Integrated Security=True")
            conexion.Open()
            Dim ms As New MemoryStream
            PictureBox1.Image.Save(ms, ImageFormat.Jpeg)
            Dim b As Byte() = ms.ToArray()
            Dim Query As String = "INSERT INTO Empleados(Codigoempleado,Nombre,Foto,Areaempleado,Numerotelefonico,Numeroseguro,Direccion)VALUES(@Codigoempleado,@Nombre,@Foto,@areaempleado,@Numerotelefonico,@Numeroseguro,@Direccion)"
            Dim comando As New SqlCommand(Query, conexion)
            comando.Parameters.AddWithValue("@Codigoempleado", TextBox1.Text)
            comando.Parameters.AddWithValue("@Nombre", TextBox2.Text)
            comando.Parameters.AddWithValue("@Foto", b)
            comando.Parameters.AddWithValue("@Areaempleado", ComboBox1.Text)
            comando.Parameters.AddWithValue("@Numerotelefonico", TextBox3.Text)
            comando.Parameters.AddWithValue("@Numeroseguro", TextBox4.Text)
            comando.Parameters.AddWithValue("@Direccion", TextBox5.Text)
            Dim command As New SqlCommand(Query, conexion)
            command.Parameters.Add("@Foto", SqlDbType.Image).Value = b
            comando.ExecuteNonQuery()
            conexion.Close()

     

    YOO

    • Marcado como respuesta eduardohpz jueves, 16 de febrero de 2017 20:04
    jueves, 16 de febrero de 2017 20:04
  • Hola:

    Tienes esta 2 lineas que no hacen nada
     Dim command As New SqlCommand(Query, conexion)
     command.Parameters.Add("@Foto", SqlDbType.Image).Value = b

    porque el comando que ejecutas es el siguiente
    comando.ExecuteNonQuery()
    puedes borrarlas

    Un saludo desde Bilbo
    Carlos
    jueves, 16 de febrero de 2017 20:40