Martha se puede hacer volcando a disco la imagen del campo BYTEA tratándolo como tipo binario.
Estructura de la tabla para el ejemplo
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
Observe que el campo fingerprintimg es de tipo bytea.
INSERTAR LA IMAGEN
Anoto en el campo "Descripción" la información sobre el contenido de la imagen, en el campo "Archivo" hago clic sobre el botón de la carpeta y selecciono una imagen, esta aparece como muestra la imagen. Para seleccionar la imagen utlizo msoFileDialogFilePicker, no lo explico porque asumo que ya sabe cómo se utiliza.
CÓDIGO DEL BOTON 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
Observe que llamo la función para manipular el campo OLE.
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
Lo anterior adiciona el registro en la tabla de PostgreSQL.
EXTRAER CONTENIDO CAMPO BYTEA DE POSTGRESQL
CÓDIGO DEL 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
'NOTA EPF:
' Tambien se puede extraer con
' call DescargarArchivo("https://i.postimg.cc/Cx7C5r1n/form-maestra.jpg",currentproject.Path & "\maestra.jpg")
' Si es de una ubicación, siempre y cuando el final sea el nombre del archivo con la extensión
On Error GoTo ManipularError
sql = "SELECT * FROM FingerprintDB WHERE Id = " & Me.Lista & " "
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
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
MsgBox "Error al descargar la imagen" & vbCrLf & vbCrLf & Err.Description, vbCritical, "Atención"
Resume Salir
End Sub
Private Sub Form_Open(Cancel As Integer)
' Me.Caption = "ENTIDAD EN USO : " & strEntidad
End Sub
NOTA: El ejemplo lo elaboré con una tabla vinculada a PostgreSQL con base en el DSN.
Por simplicidad el archivo lo descargo en la carpeta de la aplicación, pero la idea es que se pueda seleccionar el destino. Martha, como tengo su correo le estoy enviando el ejemplo, debe cambiar los nombres de la tabla y campos de acuerdo con sus necesidades.