Set
nøgleord bruges til at indstille en variabel til en objektreference. Din .Value
er ikke et objekt, det er Null. Derfor Objekt påkrævet fejl.
Den kode, du har fundet, bruges til Access vedhæftede felter. Varbinary(Max)
, er dog ikke et vedhæftningsfelt, men tilknyttes et OLE-objekt i Access/DAO. Det betyder, at du skal indstille værdien til et bytearray, der indeholder fildataene, i stedet for at bruge et indlejret postsæt til at administrere vedhæftede filer.
Der er mange måder at indlæse en fil i et bytearray. Jeg foretrækker følgende kode, der bruger en ADODB.Stream
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
Sådan gemmer du det tilbage til en fil:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Hvis du virkelig ikke kan lide ADODB
, og endda tanken om en ADODB.Stream
afskyr dig, du kan også bruge selve VBA til at læse en fil ind i et bytearray:
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
Denne sidste kode vil begrænse den maksimale filstørrelse på 2.147.483.647 bytes (den maksimale størrelse af en Long). Dette er dog også den maksimale størrelse af en Access-database, så du vil sandsynligvis løbe ind i problemer før det. Denne kode bruger heller ikke chunking, så den bruger muligvis mere hukommelse end nødvendigt.