Como Insertar Imagenes Acces VB

Tengo creado un formulario independiente que inserta datos a unas tablas vinculadas de SQL SERVER

Necesito insertar o guardar o vincular imágenes en un campo

Como haría este proceso ya que las tablas que tengo son vinculadas

Se me ocurre si se puede hacer un vinculo para que la imagen quede guardada pero fuera de la base de datos solo digo

O qei ideas me pueden sugerir

Se ingresa la información

¿Cómo hago para poder insertar la imagen? ¿Yo creo ue en el evento doble click me de la opción de poder ingresarla -- o como seria?

Y después le doy en el botón guardar

1 respuesta

Respuesta
1

¿El campo imagen de SQL Server es tipo BLOB? En este caso debe convertir la imagen en datos binarios. Personalmente lo hago pero con PostgreSQL en donde el campo es de tipo BYTEA, pero el código es prácticamente el mismo. Aunque seguro que no deja de existir el despistado que le sugiera almacenar la ruta del archivo etc.

Le doy una idea como lo hago en PostgreSQL, pero es lo mismo para SQL SERVER

IMAGEN A CARGAR

Formulario para cargar la imagen

Utilizo este formulario para adicionar la imagen en la tabla (campo OLE en Access pero BLOB en SQL SERVER) hago clic en botón Insertar y se guarda la imagen, observe que también lo puedo hacer con una función de PostgreSQL y por medio de un link en la web. Ahora verifico que la imagen este registrada.

Formulario para ver la imagen

Del cuadro de lista seleccioné TodExpertos campo BLOB y efectivamente tengo la imagen el control. Observe que si hago clic en Extraer puedo descargar la imagen al PC.

Formulario para editar (reemplazar una imagen)

Se requieren las siguientes funciones

Código para leer del campo OLE (BLOB SQL SERVER) al disco y es la imagen para el control imagen de Access.

Public Function OleADisco(id As Long) As String
    Dim rst As DAO.Recordset, SQL, Ruta As String, Aux As Boolean
    Dim Matrix() As Byte
    Dim NumArchivo As Byte
    On Error GoTo ManipularError
    SQL = "SELECT * FROM FingerprintDB WHERE Id = " & id & " "
    Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
    With rst
        NumArchivo = FreeFile
        Ruta = CurrentProject.Path & !Nombre & ""
        Matrix = !fingerprintimg
    End With
    rst.Close: Set rst = Nothing
    Aux = True: Open Ruta For Binary Access Write As #NumArchivo
    Put #NumArchivo, 1, Matrix
    Close #NumArchivo: Aux = False
    OleADisco = Ruta
Salir:
    Exit Function
ManipularError:
    If Aux Then: Close #NumArchivo
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgBox "Error al descargar la imagen" & vbCrLf & vbCrLf & Err.Description, vbCritical, "Atención"
    Resume Salir
End Function

Código para insertar la imagen en el campo OLE (BLOB en SQL SERVER)

Public Function DiscoAOle()
    Dim rst As DAO.Recordset, SQL, Ruta  As String, NumArchivo As Byte, Aux As Boolean
    Dim Matrix() As Byte
     On Error GoTo ManipularError
    SQL = "SELECT * FROM FingerprintDB"
    Set rst = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
    NumArchivo = FreeFile
    Ruta = Me.txtArchivo
    Aux = True: Open Ruta For Binary Access Read As #NumArchivo
    ReDim Matrix(LOF(NumArchivo) - 1)
    Get #NumArchivo, , Matrix
    Close #NumArchivo: Aux = False
    With rst
        .AddNew
            ![first_name] = Me.txtDescripcion
            !Nombre = Dir(Ruta)
            !fingerprintimg = Matrix
        .Update
    End With
     rst.Close: Set rst = Nothing
     MsgBox "Registro agregado correctamente", vbInformation, "Aviso"
     Me.txtDescripcion = Null: Me.txtArchivo = Null
Salir:
    Exit Function
ManipularError:
    If Aux Then: Close #NumArchivo
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgBox Err.Description, vbCritical, "Atención"
    Resume Salir
End Function

En la web hay bastante código sobre esto, asumo que hay otras alternativas

Disculpe me faltó incluir el código de los botones

BOTÓN INSERTAR

Private Sub btnInsertar_Click()
 If IsNull(Me.txtDescripcion) Then
   MsgBox "Se requiere una descripción", vbInformation, "Cuidado"
   Me.txtDescripcion.SetFocus
   Exit Sub
 End If
    Call DiscoAOle
End Sub

En este caso la función DiscoAOle debe estar almacenada en el formulario

BOTÓN EXTRAER

Private Sub btnExtraer_Click()
    If Not IsNull(Me.Lista) Then
        Call OleADisco1
    Else
        MsgBox "SELECCIONE UN ARCHIVO", vbInformation, "AVISO"
    End If
End Sub
Public Sub OleADisco1()
    Dim rst As DAO.Recordset, SQL, Ruta As String, Aux As Boolean
    Dim Matrix() As Byte
    Dim NumArchivo As Byte
    On Error GoTo ManipularError
   ' SQL = "SELECT * FROM tblInformacion WHERE Id = " & Me.Lista & " "
    SQL = "SELECT * FROM FingerprintDB WHERE Id = " & Me.Lista & " "
    Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
    With rst
        NumArchivo = FreeFile
        'Ruta = "C:\Users\sistemas\Desktop\Binarios\Extraidos\" & !Nombre & ""
        Ruta = CurrentProject.Path & "\" & !Nombre & ""
        Matrix = !fingerprintimg
    End With
    rst.Close: Set rst = Nothing
    Aux = True: Open Ruta For Binary Access Write As #NumArchivo
    Put #NumArchivo, 1, Matrix
    Close #NumArchivo: Aux = False
    MsgBox "Archivo extraido correctamente", vbInformation, "AVISO"
Salir:
    Exit Sub
ManipularError:
    If Aux Then: Close #NumArchivo
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgB

La función OLEADisco() es para llamarla desde una consulta por ejemplo:

Por ejemplo para origen de datos de un formulario

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas