El Set
La palabra clave se utiliza para establecer una variable en una referencia de objeto. Tu .Value
no es un objeto, es Nulo. De ahí el Objeto requerido error.
El código que ha encontrado se usa para Acceder a los campos adjuntos. Varbinary(Max)
, sin embargo, no es un campo adjunto, sino que se asigna a un objeto OLE en Access/DAO. Eso significa que debe establecer el valor en un bytearray que contenga los datos del archivo, en lugar de usar un conjunto de registros anidado para administrar los archivos adjuntos.
Hay muchas formas de cargar un archivo en un bytearray. Prefiero el siguiente código, que usa un ADODB.Stream
objeto.
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
Para volver a almacenarlo en un archivo:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Si realmente no te gusta ADODB
, e incluso la idea de un ADODB.Stream
te disgusta, también puedes usar VBA para leer un archivo en un 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
Este último código limitará el tamaño máximo de archivo de 2,147,483,647 bytes (el tamaño máximo de un Long). Sin embargo, este también es el tamaño máximo de una base de datos de Access, por lo que es probable que tenga problemas antes de eso. Este código tampoco usa fragmentación, por lo que podría usar más memoria de la requerida.