De Set
trefwoord wordt gebruikt voor het instellen van een variabele naar een objectreferentie. Uw .Value
is geen object, het is Null. Vandaar het Object vereist fout.
De code die je hebt gevonden, wordt gebruikt voor Access-bijlagevelden. Varbinary(Max)
, is echter geen bijlageveld, maar is toegewezen aan een OLE-object in Access/DAO. Dat betekent dat u de waarde moet instellen op een bytearray die de bestandsgegevens bevat, in plaats van een geneste recordset te gebruiken om bijlagen te beheren.
Er zijn veel manieren om een bestand in een bytearray te laden. Ik geef de voorkeur aan de volgende code, die gebruik maakt van een ADODB.Stream
voorwerp.
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
Om het weer in een bestand op te slaan:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Als je ADODB
echt niet leuk vindt , en zelfs de gedachte aan een ADODB.Stream
walgt van je, je kunt VBA zelf ook gebruiken om een bestand in een bytearray in te lezen:
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
Deze laatste code beperkt de maximale bestandsgrootte van 2.147.483.647 bytes (de maximale grootte van een Long). Dit is echter ook de maximale grootte van een Access-database, dus u zult waarschijnlijk eerder in de problemen komen. Deze code maakt ook geen gebruik van chunking, dus het kan meer geheugen gebruiken dan nodig is.