Insertar imagen en sql server 2008 con vb.net

Estimado tengo una duda... Tengo un programa del cual tomo fotos a través de una webcam, después las guardo en una carpeta temporal y necesito esa misma imagen guardarla en una base de datos con sql server 2008 ... Y eso no me resulta
probé cololando la base con id_foto que es numérico, y un campo archivo que es binary(150). Y desde vb.net intento guardarla de esta forma
conexión. Execute("insert into fotoprueba values ( '" & bmapCV & "')")
donde bmapCV es tipo system. Drawing. Image pero me aparece el error "El operador '&' no está definido para los tipos 'String' y 'System.Drawing.Image'"
También intente cambiando en la base, en vez de tipo binary a tipo image pero es lo mismo.
tambien intente con una funcion q encontre de pasar la imagen a binary y despues en un txt transformandolo a texto de esta forma " Dim imgTxt As String = System.Text.Encoding.Unicode.GetString(imgArray)"
pero me reclama el tipo string con el tipo de archivo de la base ...
Por favor si me pudieras ayudar que no se me ocurre otra forma de hacerlo
pd : no puedo guardar la ruta en la base, desgraciadamente necesito guardar la imagen.

1 respuesta

Respuesta
1
Lo primero que debes de hacer es convertir a bits los bits de la imagen en Asp.net seria
Private Function ObtenerBytes(ByVal ObjetoInput As HtmlInputFile) As Byte()
        'Este función obtiene los Bytes que contiene el fichero del Input File y retorna un Matriz de Bytes
        Dim BytesDeLaImagen(ObjetoInput.PostedFile.ContentLength) As Byte
        ObjetoInput.PostedFile.InputStream.Position = 0
        ObjetoInput. PostedFile. InputStream. Read(BytesDeLaImagen, 0, ObjetoInput. PostedFile. ContentLength - 1)
        Return BytesDeLaImagen
    End Function
    Private Function ObtenerBytes(ByVal ObjetoInput As HtmlInputFile) As Byte()        'Este función obtiene los Bytes que contiene el fichero del Input File y retorna un Matriz de Bytes        Dim BytesDeLaImagen(ObjetoInput.PostedFile.ContentLength) As Byte        ObjetoInput.PostedFile.InputStream.Position = 0        ObjetoInput.PostedFile.InputStream.Read(BytesDeLaImagen, 0, ObjetoInput.PostedFile.ContentLength - 1)        Return BytesDeLaImagen    End Function
esto atravez de un input posterormemte tendrias que hacerla insercion con un procedimiento almacenado
Estimado ya hacia esa función ... así la tengo yo
Public Function ImageToBytes(ByVal foto As Image) As Byte()
        Dim mS As MemoryStream = New MemoryStream()
        foto.Save(mS, ImageFormat.Jpeg)
        Return mS.ToArray()
    End Function
donde me devuelve un arreglo de bytes en la variable imgArray()
despues "transformo esa variable a text" Dim imgTxt As String = System.Text.Encoding.Unicode.GetString(imgArray)
Pero hay me arroja el error
Lo que quieres hacer es la inserción a la base de datos esto yo lo hago con n procedimiento que reciba una imagen por qué si lo haces como texto no te respeta lo que guardas
Public Function AgragarImagenes(ByVal IdProyecto As String, ByVal imagen As Byte(), ByVal idGarantia As String, ByVal Tabla As String) As String
            Dim Conec As Data.SqlClient.SqlConnection
            Dim coma As Data.SqlClient.SqlCommand
            ' Establecemos la cadena de Coneccion y la instanciamos
            Conec = New SqlClient.SqlConnection("Cadena de Conexion")
            coma = New Data.SqlClient.SqlCommand("ProcedimientoAlmacenadoQue inserta foto", Conec)
            coma.CommandType = CommandType.StoredProcedure
            coma.Parameters.Add("@id", SqlDbType.Int)
            coma.Parameters("@id").Value = IdProyecto
            Try
                coma.Parameters.Add("@ima", SqlDbType.Image)
                coma.Parameters("@ima").Value = imagen
                Try
                    'Abre la conexion a la base de datos 
                    Conec.Open()
                    coma.ExecuteNonQuery()
                    'El manejador de base de datos devuelve los datos pedidos en el dataset
                Catch ex As Exception
                    Dim er As String
                    er = Err.Description & " : " & Err.Number
                    er = er
                    Return er
                Finally
                    'Se cierra la coneccion de la base de batos
                    Conec.Close()
                End Try
            Catch ex As Exception
                Dim er As String
                er = ex.Message
                er = er
                Return er
            End Try
            Return "Se realizo Correctamente"
        End Function
        Public Function AgragarImagenes(ByVal IdProyecto As String, ByVal imagen As Byte(), ByVal idGarantia As String, ByVal Tabla As String) As String            Dim Conec As Data.SqlClient.SqlConnection            Dim coma As Data.SqlClient.SqlCommand            ' Establecemos la cadena de Coneccion y la instanciamos            Conec = New SqlClient.SqlConnection("Cadena de Conexion")            coma = New Data.SqlClient.SqlCommand("ProcedimientoAlmacenadoQue inserta foto", Conec)            coma.CommandType = CommandType.StoredProcedure
            coma.Parameters.Add("@id", SqlDbType.Int)            coma.Parameters("@id").Value = IdProyecto
            Try                coma.Parameters.Add("@ima", SqlDbType.Image)                coma.Parameters("@ima").Value = imagen
                Try                    'Abre la conexion a la base de datos                     Conec.Open()                    coma.ExecuteNonQuery()                    'El manejador de base de datos devuelve los datos pedidos en el dataset                Catch ex As Exception                    Dim er As String                    er = Err.Description & " : " & Err.Number                    er = er                    Return er                Finally                    'Se cierra la coneccion de la base de batos                    Conec.Close()                End Try
            Catch ex As Exception                Dim er As String                er = ex.Message                er = er                Return er            End Try            Return "Se realizo Correctamente"        End Function
Codigo SQL
/*  
Objeto: procedimiento almacenado dbo. CnCargaFotoProyecto
realizad0 por: luis Angel octavio alcaraz barajas
    EL 15-Octubre-2008
   DESCRIPCIÓN: Inserta un registro en la tabla de CnImagenesProyectos
*/  
CREATE   PROCEDURE [dbo].[CnCargaFotoProyecto]   
   @id int,  
   @idGarantia int,  
   @ima image = null,  
   @tabla char(1)  
AS  
 declare @Maximo int  
if @tabla='G'  
begin
 SELECT @Maximo= ISNULL(MAX(idImagen),0)+1 FROM CnImagenesProyectos  
 INSERT INTO CnImagenesProyectos (idImagen,idProyecto,idGarantia,Imagen)  
 VALUES (@Maximo,@id,@idGarantia,@ima)  
end  
if @tabla='S'  
begin  
 SELECT @Maximo= ISNULL(MAX(idImagen),0)+1 FROM CnImagenesSupervicion  
 INSERT INTO CnImagenesSupervicion (idImagen,idProyecto,idSupervicion,Imagen)  
 VALUES (@Maximo,@id,@idGarantia,@ima)  
end  
/*   Objeto:  procedimiento almacenado dbo.CnCargaFotoProyecto        REALIZAD0 POR: LUIS ANGEL OCTAVIO ALCARAZ BARAJAS       EL 15-Octubre-2008     DESCRIPCION: Inserta un registro en la tabla de CnImagenesProyectos  */    CREATE   PROCEDURE [dbo].[CnCargaFotoProyecto]      @id int,     @idGarantia int,     @ima image = null,     @tabla char(1)  AS     declare @Maximo int        if @tabla='G'  begin     SELECT @Maximo= ISNULL(MAX(idImagen),0)+1 FROM CnImagenesProyectos     INSERT INTO CnImagenesProyectos (idImagen,idProyecto,idGarantia,Imagen)   VALUES (@Maximo,@id,@idGarantia,@ima)  end    if @tabla='S'  begin     SELECT @Maximo= ISNULL(MAX(idImagen),0)+1 FROM CnImagenesSupervicion     INSERT INTO CnImagenesSupervicion (idImagen,idProyecto,idSupervicion,Imagen)   VALUES (@Maximo,@id,@idGarantia,@ima)  end
asi seria concodigo sql y codigo visual es mas conveniente de esta  manera tambien puedes hacerlo con una instruccion insert pero necesitas definir una valiable tipo image
estimado y no existe la posibilidad de añadir una imagen pero con este tipo de conexion = Dim conexion As ADODB.Connection ???
Ya que tengo todo mi programa de esa forma... me imagino una idea así conexión. Execute("insert into fotoprueba values ( '" & bmapCV & "')") o alguna forma, ¿Dónde bmapcv es tipo imagen?
Tal vez si lo que quieres hacerlo es declarar una función cammand para que la pases en lugar de la cadena lo que pasa es que no puedes pasar en un texto la imagen de sql se debe de pasar con parámetros sql, pondrías hacer lo siguiente, delaras la variable foto del tipo Parametrosql después a esta la signas a la conexión y con eso creo que funcionario de esta manera no tengo ningún ejemplo proramado pero la instrucción final quedaría así
conexion.Execute("insert into fotoprueba values ( @Foto)")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas