ACC: Lesen, Schreiben und Speichern von BLOBs (Binary Large Objects)

Veralteter Haftungsausschluss für KB-Inhalte

Dieser Artikel wurde für Produkte geschrieben, für die Microsoft keinen Support mehr anbietet. Deshalb wird dieser Artikel im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.

Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
103257 ACC: Reading, Storing, & Writing Binary Large Objects (BLOBs)
Fortgeschritten: Erfordert Fachkenntnisse in den Bereichen Kodierung und Interoperabilität sowie Mehrbenutzerfähigkeiten.

Zusammenfassung

Sie können große Datenobjekte (wie Sound-, Video- oder Grafikdaten) in einem Feld mit dem OLE-Objektdatentyp in einer Microsoft Access-Tabelle speichern. Einige große binäre Datenobjekte können jedoch nicht dargestellt werden, wenn sie nicht über einen OLE-Server verfügen, der die gespeicherten Daten interpretieren kann. Sie können auch Kopien von ausführbaren Programmdateien oder anderen Nicht-OLE-Daten in einer Microsoft Access-Tabelle speichern. Dieser Datentyp wird als BLOB (Binary Large Object Bitmap) bezeichnet.

Dieser Artikel setzt voraus, dass Sie mit Visual Basic für Applikationen und mit dem Erstellen von Microsoft Access-Anwendungen mit Hilfe der in Microsoft Access enthaltenen Programmiertools vertraut sind. Weitere Informationen zu Visual Basic für Applikationen finden Sie in Ihrer Version des Handbuchs "Building Applications with Microsoft Access" (Erstellen von Anwendungen mit Microsoft Access).

Hinweis: In den Microsoft Access-Versionen 1.x und 2.0 wird Visual Basic für Applikationen als Access Basic bezeichnet. Weitere Informationen zu Access Basic finden Sie im Handbuch "Introduction to Programming" (Einführung in die Programmierung) in Microsoft Access 1.x oder im Handbuch "Building Applications" (Erstellen von Anwendungen) in Microsoft Access 2.0.

Weitere Informationen

Das folgende Beispiel enthält zwei benutzerdefinierte Funktionen, mit deren Hilfe Sie große Mengen von binären Daten in einem Feld mit dem OLE-Objektdatentyp verwalten können. Diese benutzerdefinierten Funktionen heißen ReadBLOB() und WriteBLOB().

  • Mit der Funktion ReadBLOB() wird eine binäre Datenträgerdatei gelesen und in einem OLE-Objektfeld gespeichert.
  • Mit der Funktion WriteBLOB() werden in einem OLE-Objektfeld gespeicherte binäre Daten in eine Datenträgerdatei geschrieben.
Dieses Beispiel zeigt, wie Sie eine binäre Datei in ein OLE-Objektfeld kopieren und anschließend wieder herausziehen, um sie in eine neue Datenträgerdatei zu schreiben:

  1. Erstellen Sie ein neues Modul mit dem Namen BLOB und geben Sie die folgenden Zeilen in den Deklarationsbereich des Moduls ein:
    Option Explicit
    Const BlockSize = 32768
    Hinweis: Wenn Sie mit Microsoft Access 2.0 arbeiten, müssen Sie die folgenden Definitionen nach den ersten beiden Zeilen einfügen:

    Const dbOpenTable = DB_OPEN_TABLE
    Const acSysCmdInitMeter = SYSCMD_INITMETER
    Const acSysCmdUpdateMeter = SYSCMD_UPDATEMETER
    Const acSysCmdRemoveMeter = SYSCMD_REMOVEMETER
  2. Geben Sie den folgenden Code in das Modul ein.

    Hinweis: In dem folgenden Beispielcode wird ein Unterstrich (_) am Ende einer Zeile verwendet, um anzuzeigen, dass die nächste Zeile eine Fortsetzung der vorherigen Zeile darstellt. Entfernen Sie den Unterstrich vom Ende der Zeile, wenn Sie diesen Code in Access Basic neu erstellen.

    Hinweis: Das folgende Verfahren funktioniert bei Microsoft Access 1.x nicht. Bei Microsoft Access 1.x müssen Sie den Code so ändern, dass er Tabellenvariablen statt Recordsetvariablen und entsprechend die Funktion OpenTable statt OpenRecordset verwendet.
          '**************************************************************
    ' 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. Erstellen Sie die folgende neue Tabelle und speichern Sie sie anschließend als BLOB:

    Tabelle: BLOB
    ------------------------
    Feldname: Blob
    Datentyp: OLE-Objekt
  4. Klicken Sie bei geöffnetem BLOB-Modul in der Entwurfsansicht im Menü Ansicht auf Debugfenster (oder Direktfenster in Microsoft Access 2.0 oder früher).
  5. Geben Sie folgende Zeile in das Debugfenster ein und drücken Sie anschließend die Eingabetaste:

    CopyFile "c:\windows\winfile.hlp", "c:\windows\winfil_1.hlp"
Die Funktionen ReadBLOB() und WriteBLOB() kopieren die Microsoft Windows-Hilfedatei in das Feld "Blob" in der Tabelle BLOB und anschließend von dort in eine Datenträgerdatei mit dem Namen "Winfil_1.hlp".


Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 103257 – Letzte Überarbeitung: 15.08.2005 – Revision: 1

Feedback