Set
nyckelord används för att ställa in en variabel till en objektreferens. Ditt .Value
är inte ett objekt, det är Null. Därav Objekt krävs fel.
Koden du har hittat används för Access bifogade fält. Varbinary(Max)
, är dock inte ett bifogat fält, utan mappar till ett OLE-objekt i Access/DAO. Det betyder att du måste ställa in värdet på en bytearray som innehåller fildata, istället för att använda en kapslad postuppsättning för att hantera bilagor.
Det finns många sätt att ladda en fil i en bytearray. Jag föredrar följande kod, som använder 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å här sparar du tillbaka den till 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
Om du verkligen inte gillar ADODB
, och till och med tanken på en ADODB.Stream
äcklar dig, du kan också använda själva VBA för att läsa en fil till en 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
Den sista koden kommer att begränsa den maximala filstorleken på 2 147 483 647 byte (maxstorleken för en Long). Detta är dock också maxstorleken på en Access-databas, så du kommer troligen att stöta på problem innan dess. Den här koden använder inte heller chunking, så den kan använda mer minne än vad som krävs.