SJSPADO013: Ver la imagen contenida en un campo Por Enrique Martínez Montejo «SoftJaén» [MS MVP - VB] Última revisión: 25/04/2004 Puede ser que nos resulte necesario mostrar en un control las imágenes contenidas en una tabla de nuestra base de datos. Es fácil mostrar la imagen cuando el control se encuentra enlazado a un control de datos o a un objeto del tipo Recordset, por lo que el siguiente ejemplo implementa un procedimiento para ver en un control Image, no enlazado, cualquier imagen con un formato válido que tengamos disponible en un conjunto de registros abierto. Inserte un control Image en el formulario, y copie y pegue el siguiente código en la sección Declaraciones del formulario de inicio del proyecto. Option Explicit ' ' El procedimiento leerá la información de la imagen contenida ' en el valor del campo pasado, y la mostrará en un control Image ' Private Sub GetBinaryFile(fld As ADODB.Field, imgPicture As Image) Dim lChunks As Long, iFile As Integer, x As Long Dim Chunk() As Byte Const Buffer As Long = 16384& On Error GoTo ErrGetBinaryFile ' Creamos un archivo temporal para guardar la imagen en disco iFile = FreeFile Open App.Path & "\imagetemp" For Binary Access Write As iFile ' Calculamos los trozos que componen el archivo Chunk() = fld.GetChunk(fld.ActualSize Mod Buffer) lChunks = Int(fld.ActualSize / Buffer) ' Escribimos el archivo binario Put iFile, , Chunk() For x = 1 To lChunks Chunk() = fld.GetChunk(Buffer) Put iFile, , Chunk() Next ' Liberamos el espacio de almacenamiento de la matriz Erase Chunk ' Cargamos la imagen en el control indicado imgPicture.Picture = LoadPicture(App.Path & "\imagetemp") ErrGetBinaryFile: ' Si se ha producido algún error, mostramos ' la descripción del mismo If Err.Number Then MsgBox Err.Description, vbInformation, "Leer archivo binario" End If ' Cerramos el archivo temporal ... Close iFile ' ... y lo eliminamos If Len(Dir$(App.Path & "\imagetemp")) Then Kill App.Path & "\imagetemp" End If End Sub El procedimiento solo requiere que le sea pasado un objeto ADODB.Field y el nombre de un control Image, por lo tanto, podríamos llamar al procedimiento de la siguiente manera: Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset ' Creamos un nuevo objeto Connection Set cnn = New ADODB.Connection ' Configuramos y abrimos la conexión With cnn .Provider="SQLOLEDB" .ConnectionString = "Data Source=Nombre_Servidor;" & _ "Initial Catalog=Pubs;" & _ "User Id=sa;Password=;" .Open End With ' Creamos un nuevo objeto Recordset Set rst = New ADODB.Recordset ' Configuramos y abrimos el objeto Recordset With rst .CursorType = adOpenKeyset .LockType = adLockOptimistic .Open "pub_info", cnn, , , adCmdTable End With ' Llamamos al procedimiento para ver la primera imagen ' contenida en el primer registro ' If Len(rst.Fields!Logo) <> 0 Then GetBinaryFile rst.Fields!Logo, Image1 End If En este ejemplo se ha utilizado una conexión con la base de datos Pubs de SQL Server, para ver el campo Logo de la tabla Pub_Info. Si lo desea, puede establecer también la conexión con una base de datos Microsoft Access, pero procure que el tipo de imagen no sea un mapa de bits, porque dicho formato de imagen no es válido para el código fuente expuesto en el ejemplo.