Das Set
Das Schlüsselwort wird verwendet, um eine Variable auf eine Objektreferenz zu setzen. Ihr .Value
ist kein Objekt, es ist Null. Daher das Objekt erforderlich Fehler.
Der gefundene Code wird für Access-Anlagenfelder verwendet. Varbinary(Max)
, ist jedoch kein Anhangsfeld, sondern wird einem OLE-Objekt in Access/DAO zugeordnet. Das bedeutet, dass Sie den Wert auf ein Bytearray setzen müssen, das die Dateidaten enthält, anstatt ein verschachteltes Recordset zu verwenden, um Anhänge zu verwalten.
Es gibt viele Möglichkeiten, eine Datei in ein Bytearray zu laden. Ich bevorzuge den folgenden Code, der einen ADODB.Stream
verwendet Objekt.
Dim dbsGMEC As DAO.Database
Dim rstWater_Files As DAO.Recordset
Set dbsGMEC = CurrentDb
Set rstWater_Files = dbsGMEC.OpenRecordset("dbo_WATER_FILES", dbOpenDynaset, dbSeeChanges)
rstWater_Files.Edit
Dim strm As Object
Set strm = CreateObject("ADODB.Stream")
strm.Type = 1 'adTypeBinary
strm.Open
strm.LoadFromFile "C:\test.jpg"
rstWater_Files.Fields("Binary_File").Value = strm.Read
strm.Close
rstWater_Files.Update
Um es wieder in einer Datei zu speichern:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Wenn Sie ADODB
wirklich nicht mögen , und sogar der Gedanke an einen ADODB.Stream
ekelt Sie, Sie können auch VBA selbst verwenden, um eine Datei in ein Bytearray einzulesen:
Dim dbsGMEC As DAO.Database
Dim rstWater_Files As DAO.Recordset
Set dbsGMEC = CurrentDb
Set rstWater_Files = dbsGMEC.OpenRecordset("dbo_WATER_FILES", dbOpenDynaset, dbSeeChanges)
rstWater_Files.Edit
Dim byteArr() As Byte
Dim fileInt As Integer: fileInt = FreeFile
Open "C:\test.jpg" For Binary Access Read As #fileInt
ReDim arr(0 To LOF(fileInt) - 1)
Get #fileInt, , byteArr
Close #fileInt
rstWater_Files.Fields("Binary_File").Value = byteArr
rstWater_Files.Update
Dieser letzte Code begrenzt die maximale Dateigröße von 2.147.483.647 Bytes (die maximale Größe eines Long). Dies ist jedoch auch die maximale Größe einer Access-Datenbank, sodass Sie wahrscheinlich vorher auf Probleme stoßen werden. Dieser Code verwendet auch kein Chunking, sodass möglicherweise mehr Speicher als erforderlich verwendet wird.