O
Set
palavra-chave é usada para definir uma variável para uma referência de objeto. Seu .Value
não é um objeto, é Null. Daí o Objeto Requerido erro. O código que você encontrou é usado para campos de anexo do Access.
Varbinary(Max)
, no entanto, não é um campo de anexo, mas mapeia para um objeto OLE no Access/DAO. Isso significa que você precisa definir o valor como um bytearray contendo os dados do arquivo, em vez de usar um conjunto de registros aninhado para gerenciar anexos. Há muitas maneiras de carregar um arquivo em um bytearray. Eu prefiro o seguinte código, que usa um
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 armazená-lo de volta em um arquivo:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Se você realmente não gosta de
ADODB
, e até mesmo a ideia de um ADODB.Stream
te enoja, você também pode usar o próprio VBA para ler um arquivo em um 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á o tamanho máximo do arquivo de 2.147.483.647 bytes (o tamanho máximo de um Long). No entanto, esse também é o tamanho máximo de um banco de dados do Access, portanto, você provavelmente terá problemas antes disso. Esse código também não usa fragmentação, portanto, pode usar mais memória do que o necessário.