Cómo almacenar y visualizar imagenes en base de datos Access

Id. de artículo: 550588 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E10538
Expandir todo | Contraer todo

Resumen



Este articulo nos muestra cómo almacenar ficheros binarios en una base
de datos Access. En este ejemplo trabajaremos con ficheros .BMP que se
pueden visualizar en un formulario de Visual Basic.

Más información



Este ejemplo consta de 3 partes:

1. Lectura de un fichero bmp y almacenamiento en una base de datos
Access (Función Readblob)

2. Escritura del contenido de un campo Memo que posee información
binaria en un fichero (Función WriteBlob).

3. Visualización del fichero del paso 2 en un control contenedor
Ole (Asociación del fichero con un control Ole Container que
nos permita visualizar el contenido del fichero bmp).

Los pasos para realizar el ejemplo son:

1. Crearemos una base de datos Access 7.0 que contenga una tabla
denominada Empleados. Esta tabla contendrá al menos un campo de
tipo Memo, llamado foto. Esta base de datos deberá residir en el
directorio donde se vaya a almacenar el proyecto de Microsoft
Visual Basic.

2. Se creará un formulario con un control Ole Container, un botón
de comando y un control DataControl.

El control DataControl estará asociado a una base de datos
Access, creada en el punto anterior.

El botón de comando contendrá el siguiente código :

Dim camino As String
CopyFile "c:\windows\aros.bmp", App.Path & "\aros.bmp"
OLE1.SourceDoc = App.Path & "\aros.bmp"
OLE1.Action = 0 'crea un objeto embebido en el formulario

3. Para almacenar la información en la base de datos, dividiremos
el fichero en bloques, que posteriormente iremos salvando en la
base de de datos. Para ello, usaremos los metodos Getchunk y
AppendChunk.

Se creara un módulo Visual Basic en el cual se introducirá el
siguiente código.

' Establecemos el tamaño del bloque

Const BlockSize = 32768
'************************************************************
' FUNCTION: ReadBLOB
'
' PROPOSITO:
' Leer un fichero binario (BLOB) del disco y almacena el
' contenido en una base de datos Access. En una tabla con
' un campo de tipo Memo
'
'
' ARGUMENTOS:
' Source - La ruta del fichero a ser leido.
' T - La tabla que almacena la informacion
' Field - Nombre del campo memo que contendra la
' información del fichero binario.
'
' DEVUELVE:
' El número de bytes leidos del fichero fuente.
'
'************************************************************
Function ReadBLOB(ByVal Source As String, T As Recordset, _
Field As String)

Dim NumBlocks As Integer
Dim FileLength As Long, LeftOver As Long
Dim FileData As String
Dim SourceFile As Integer
Dim i As Integer, RetVal As Variant

On Error GoTo Err_ReadBLOB

' Se abre el fichero fuente para ser leido
SourceFile = FreeFile

Open Source For Binary Access Read As SourceFile

' Obtenemos la longitud del fichero y el numero de bytes
' que restan al final.

FileLength = LOF(SourceFile)

If FileLength = 0 Then

ReadBLOB = 0
GoTo Bye_ReadBLOB

End If

' Calculamos el numero de bloques a leer.
NumBlocks = FileLength \ BlockSize
LeftOver = FileLength Mod BlockSize


' Ponemos la tabla en modo edición

T.Edit

' Read the 'left over' amount of data, writing it to the
' table
FileData = String$(LeftOver, 32)
Get SourceFile, , FileData
T(Field).AppendChunk FileData

' Leemos el resto de datos , salvandolos en una tabla.

FileData = String$(BlockSize, 32)
For i = 1 To NumBlocks

Get SourceFile, , FileData
T(Field).AppendChunk (FileData)

Next i

' Actualizamos la tabla
T.Update

Close SourceFile

ReadBLOB = FileLength

Bye_ReadBLOB:
Exit Function

Err_ReadBLOB:
ReadBLOB = -1 * Err
Resume Bye_ReadBLOB

End Function

'*********************************************************
' FUNCTION: WriteBLOB
'
' PROPaSITO:
' Escribe el contenido de un fichero binario almacenado en
' un campo Memo en un fichero en disco
'
' ARGUMENTOS:
' T - La tabla que almacena la informacion.
' Field - El campo Memo que contiene la información
' binaria a escribir.
' Destination - Camino del fichero a escribir
'
' DEVUELVE:
' El número de bytes escrito
'
'************************************************************
Function WriteBLOB(T As Variant, Field As String, _
ByVal Destination As String)

Dim NumBlocks As Integer
Dim FileLength As Long, LeftOver As Long
Dim FileData As String
Dim i As Integer, RetVal
Dim DestFile As Integer

On Error GoTo Err_WriteBLOB

FileLength = 0
' Se obtiene el tamaño del campo en bytes.
FileLength = T(Field).FieldSize()

If FileLength = 0 Then

WriteBLOB = 0
GoTo Bye_WriteBLOB

End If

' Se calcual el numero de bloques ademas de los bytes del
' último de ellos.

NumBlocks = FileLength \ BlockSize
LeftOver = FileLength Mod BlockSize

' Borramos cualquier fichero existente con el mismo nombre
DestFile = FreeFile
Open Destination For Output As DestFile
Close DestFile

' Abrimos el fichero para escribir.
Open Destination For Binary As DestFile


' Escribimos los bytes del ultimo bloque
FileData = T(Field).GetChunk(0, LeftOver)
Put DestFile, , FileData

For i = 1 To NumBlocks

' Limpiar el buffer y leer un bloque
FileData = ""
FileData = T(Field).GetChunk((i - 1) * BlockSize _
+ LeftOver, BlockSize)
Put DestFile, , FileData

Next i
Close DestFile
WriteBLOB = FileLength
Bye_WriteBLOB:
Exit Function
Err_WriteBLOB:
WriteBLOB = -1 * Err
Resume Bye_WriteBLOB

End Function

Esta subrutina hace uso de las dos funciones anteriormente
descritas:

Sub CopyFile(ByVal Source As String, ByVal Destination As _
String)

Dim BytesRead, BytesWritten
Dim Msg As String
Dim db As Database, T As Recordset

Set db = Form1.data1.Database
Set T = db.OpenRecordset("empleados")

T.AddNew
T.Update
T.MoveLast

BytesRead = ReadBLOB(Source, T, "foto")

Msg = "Lectura Finalizada""" & Source & """"
Msg = Msg & Chr$(13) & ".. " & BytesRead& " bytes leidos"
MsgBox Msg, 64, "Copy File"
BytesWritten = WriteBLOB(T, "foto", Destination)
Msg = "Escritura finalizada""" & Destination & """"
Msg = Msg & Chr$(13) & ".. " & BytesWritten & " bytes _
escritos "
MsgBox Msg, 64, "Copy File"

End Sub

4. Ejecutar el formulario creado en el punto 2, al pulsar el botón
se copiará el fichero bmp a la base de datos y posteriormente se
extraerá de ella. Y, por último, se asociará ese fichero bmp al
control Ole Container.

El ejemplo mostrado es redundante, debido a que no es necesario leer y
escribir de la misma base de datos. Aún así, se muestra el código en que
lee y escribe de la base de datos debido a la utilidad de ambas rutinas
en otras situaciones similares.

Propiedades

Id. de artículo: 550588 - Última revisión: martes, 16 de marzo de 2004 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 Enterprise Edition
Palabras clave: 
bmp database access files KB550588

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com