ACC: Lectura, almacenar y escribir objetos binarios grandes (BLOB)

Seleccione idioma Seleccione idioma
Id. de artículo: 103257 - Ver los productos a los que se aplica este artículo
Avanzado: Requiere codificación experto, interoperabilidad, conocimientos y multiusuario.

Expandir todo | Contraer todo

Resumen

Puede almacenar objetos de datos de gran tamaño (tales como datos de sonido, vídeo o gráficos) en un campo con el tipo de datos objeto OLE en una tabla de Microsoft Access. No puede representarse algunos objetos de datos binario grande, sin embargo, si no tiene un servidor OLE que entiende los datos están almacenados. También puede almacenar copias de archivos de programa ejecutable u otros datos de OLE no en una tabla de Microsoft Access. Este tipo de datos se denomina un mapa de bits objeto binario grande (BLOB).

Este artículo se supone que está familiarizado con Visual Basic para aplicaciones y con la creación de aplicaciones de Microsoft Access mediante las herramientas de programación suministradas con Microsoft Access. Para obtener más información acerca de Visual Basic para Aplicaciones, consulte su versión del manual "Creación de aplicaciones con Microsoft Access".

Nota: el Visual Basic para aplicaciones se denomina Access Basic de Microsoft Access versiones 1.x y 2.0. Para obtener más información acerca de Access Basic, consulte el manual "Introduction to Programming" de la versión 1.x de Microsoft Access o el manual "Creación de aplicaciones" de la versión 2.0.

Más información

En el siguiente ejemplo contiene dos ejemplo definida por el usuario funciones que puede utilizar para administrar grandes cantidades de datos binarios en un campo con el tipo de datos objeto OLE. Las funciones definidas por el usuario son ReadBLOB() y WriteBLOB().

  • La función de ReadBLOB() lee un archivo binario de disco y almacena en un campo objeto OLE.
  • Campo de las escrituras de función WriteBLOB() datos binarios almacenados en un objeto OLE a un archivo de disco.
En este ejemplo se muestra cómo copiar un archivo binario en un campo objeto OLE y cómo escribir nuevo en el un nuevo archivo de disco:

  1. Cree un módulo nuevo denominado BLOB y escriba las líneas siguientes en la sección de declaraciones del módulo:
    Option Explicit
    BlockSize const = 32768
    Nota: Si está trabajando con Microsoft Access 2.0, deberá incluir las siguientes definiciones después dos los anteriores:
          Const dbOpenTable = DB_OPEN_TABLE
          Const acSysCmdInitMeter = SYSCMD_INITMETER
          Const acSysCmdUpdateMeter = SYSCMD_UPDATEMETER
          Const acSysCmdRemoveMeter = SYSCMD_REMOVEMETER
  2. Escriba el código siguiente en el módulo.

    Nota: En el siguiente ejemplo de código, un subrayado (_) al final de una línea se utiliza como un carácter de continuación de línea. Quite el carácter de subrayado del final de la línea cuando escriba este código en Access Basic.

    Nota: La siguiente técnica no funcionará para Microsoft Access 1.x. Para Microsoft Access 1.x, necesitará modificar el código para que utilice variables de tabla en lugar de variables Recordset y el AbrirTabla función en lugar de OpenRecordset.
          '**************************************************************
          ' FUNCTION: ReadBLOB()
          '
          ' PURPOSE:
          '   Reads a BLOB from a disk file and stores the contents in the
          '   specified table and field.
          '
          ' PREREQUISITES:
          '   The specified table with the OLE object field to contain the
          '   binary data must be opened in Visual Basic code (Access Basic
          '   code in Microsoft Access 2.0 and earlier) and the correct record
          '   navigated to prior to calling the ReadBLOB() function.
          '
          ' ARGUMENTS:
          '   Source - The path and filename of the binary information
          '            to be read and stored.
          '   T      - The table object to store the data in.
          '   Field  - The OLE object field in table T to store the data in.
          '
          ' RETURN:
          '   The number of bytes read from the Source file.
          '**************************************************************
          Function ReadBLOB(Source As String, T As Recordset, _
          sField As String)
              Dim NumBlocks As Integer, SourceFile As Integer, i As Integer
              Dim FileLength As Long, LeftOver As Long
              Dim FileData As String
              Dim RetVal As Variant
    
              On Error GoTo Err_ReadBLOB
    
              ' Open the source file.
              SourceFile = FreeFile
              Open Source For Binary Access Read As SourceFile
    
              ' Get the length of the file.
              FileLength = LOF(SourceFile)
              If FileLength = 0 Then
                  ReadBLOB = 0
                  Exit Function
              End If
    
              ' Calculate the number of blocks to read and leftover bytes.
              NumBlocks = FileLength \ BlockSize
              LeftOver = FileLength Mod BlockSize
    
              ' SysCmd is used to manipulate status bar meter.
              RetVal = SysCmd(acSysCmdInitMeter, "Reading BLOB", _
                       FileLength \ 1000)
    
              ' Put the record in edit mode.
              T.Edit
    
              ' Read the leftover data, writing it to the table.
              FileData = String$(LeftOver, 32)
              Get SourceFile, , FileData
              T(sField).AppendChunk (FileData)
    
              RetVal = SysCmd(acSysCmdUpdateMeter, LeftOver / 1000)
    
              ' Read the remaining blocks of data, writing them to the table.
              FileData = String$(BlockSize, 32)
              For i = 1 To NumBlocks
                  Get SourceFile, , FileData
                  T(sField).AppendChunk (FileData)
    
                  RetVal = SysCmd(acSysCmdUpdateMeter, BlockSize * i / 1000)
              Next i
    
              ' Update the record and terminate function.
              T.Update
              RetVal = SysCmd(acSysCmdRemoveMeter)
              Close SourceFile
              ReadBLOB = FileLength
              Exit Function
    
          Err_ReadBLOB:
              ReadBLOB = -Err
              Exit Function
    
          End Function
    
          '**************************************************************
          ' FUNCTION: WriteBLOB()
          '
          ' PURPOSE:
          '   Writes BLOB information stored in the specified table and field
          '   to the specified disk file.
          '
          ' PREREQUISITES:
          '   The specified table with the OLE object field containing the
          '   binary data must be opened in Visual Basic code (Access Basic
          '   code in Microsoft Access 2.0 or earlier) and the correct
          '   record navigated to prior to calling the WriteBLOB() function.
          '
          ' ARGUMENTS:
          '   T           - The table object containing the binary information.
          '   sField      - The OLE object field in table T containing the
          '                 binary information to write.
          '   Destination - The path and filename to write the binary
          '                 information to.
          '
          ' RETURN:
          '   The number of bytes written to the destination file.
          '**************************************************************
          Function WriteBLOB(T As Recordset, sField As String, _
          Destination As String)
              Dim NumBlocks As Integer, DestFile As Integer, i As Integer
              Dim FileLength As Long, LeftOver As Long
              Dim FileData As String
              Dim RetVal As Variant
    
              On Error GoTo Err_WriteBLOB
    
              ' Get the size of the field.
              FileLength = T(sField).FieldSize()
              If FileLength = 0 Then
                  WriteBLOB = 0
                  Exit Function
              End If
    
              ' Calculate number of blocks to write and leftover bytes.
              NumBlocks = FileLength \ BlockSize
              LeftOver = FileLength Mod BlockSize
    
              ' Remove any existing destination file.
              DestFile = FreeFile
              Open Destination For Output As DestFile
              Close DestFile
    
              ' Open the destination file.
              Open Destination For Binary As DestFile
    
              ' SysCmd is used to manipulate the status bar meter.
              RetVal = SysCmd(acSysCmdInitMeter, _
              "Writing BLOB", FileLength / 1000)
    
              ' Write the leftover data to the output file.
              FileData = T(sField).GetChunk(0, LeftOver)
              Put DestFile, , FileData
    
              ' Update the status bar meter.
              RetVal = SysCmd(acSysCmdUpdateMeter, LeftOver / 1000)
    
              ' Write the remaining blocks of data to the output file.
              For i = 1 To NumBlocks
                  ' Reads a chunk and writes it to output file.
                  FileData = T(sField).GetChunk((i - 1) * BlockSize _
                     + LeftOver, BlockSize)
                  Put DestFile, , FileData
    
                  RetVal = SysCmd(acSysCmdUpdateMeter, _
                  ((i - 1) * BlockSize + LeftOver) / 1000)
              Next i
    
              ' Terminates function
              RetVal = SysCmd(acSysCmdRemoveMeter)
              Close DestFile
              WriteBLOB = FileLength
              Exit Function
    
          Err_WriteBLOB:
              WriteBLOB = -Err
              Exit Function
    
          End Function
    
          '**************************************************************
          ' SUB: CopyFile
          '
          ' PURPOSE:
          '   Demonstrates how to use ReadBLOB() and WriteBLOB().
          '
          ' PREREQUISITES:
          '   A table called BLOB that contains an OLE Object field called
          '   Blob.
          '
          ' ARGUMENTS:
          '   Source - The path and filename of the information to copy.
          '   Destination - The path and filename of the file to write
          '                 the binary information to.
          '
          ' EXAMPLE:
          '   CopyFile "c:\windows\winfile.hlp", "c:\windows\winfil_1.hlp"
          '**************************************************************
          Sub CopyFile(Source As String, Destination As String)
              Dim BytesRead As Variant, BytesWritten As Variant
              Dim Msg As String
              Dim db As Database
              Dim T As Recordset
    
              ' Open the BLOB table.
              Set db = CurrentDb()
              Set T = db.OpenRecordset("BLOB", dbOpenTable)
    
              ' Create a new record and move to it.
              T.AddNew
              T.Update
              T.MoveLast
    
              BytesRead = ReadBLOB(Source, T, "Blob")
    
              Msg = "Finished reading """ & Source & """"
              Msg = Msg & Chr$(13) & ".. " & BytesRead & " bytes read."
              MsgBox Msg, 64, "Copy File"
    
              BytesWritten = WriteBLOB(T, "Blob", Destination)
    
              Msg = "Finished writing """ & Destination & """"
              Msg = Msg & Chr$(13) & ".. " & BytesWritten & " bytes written."
              MsgBox Msg, 64, "Copy File"
          End Sub
    						
  3. Cree la siguiente tabla nueva y, a continuación, guárdelo como BLOB:
          Table: BLOB
          ------------------------
          Field Name: Blob
             Data Type: OLE Object
  4. Con el módulo BLOB abierto en la vista Diseño, haga clic en ventana depuración (o ventana Inmediato en Microsoft Access 2.0 o anterior) en el menú Ver.
  5. Escriba la línea siguiente en la ventana depuración y, a continuación, presione ENTRAR:
          CopyFile "c:\windows\winfile.hlp", "c:\windows\winfil_1.hlp"
Las funciones ReadBLOB() y WriteBLOB() copiar el archivo de Ayuda de Microsoft Windows al campo BLOB en la tabla BLOB y, a continuación, desde allí a un archivo de disco denominado Winfil_1.hlp

Propiedades

Id. de artículo: 103257 - Última revisión: jueves, 18 de enero de 2007 - Versión: 2.3
La información de este artículo se refiere a:
  • Microsoft Access 1.0 Standard Edition
  • Microsoft Access 1.1 Standard Edition
  • Microsoft Access 2.0 Standard Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
Palabras clave: 
kbmt kbinfo kbprogramming KB103257 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 103257
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios