Set
ключовата дума се използва за задаване на променлива към препратка към обект. Вашият .Value
не е обект, а е Null. Оттук и Задължителен обект грешка.
Кодът, който намерихте, се използва за полета за прикачени файлове на Access. Varbinary(Max)
, обаче, не е поле за прикачен файл, а картографира към OLE обект в Access/DAO. Това означава, че трябва да зададете стойността на байтов масив, съдържащ файловите данни, вместо да използвате вложен набор от записи за управление на прикачени файлове.
Има много начини за зареждане на файл в байтов масив. Предпочитам следния код, който използва ADODB.Stream
обект.
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
За да го съхраните обратно във файл:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Ако наистина не харесвате ADODB
и дори мисълта за ADODB.Stream
ви отвращава, можете също да използвате самата VBA, за да прочетете файл в байтов масив:
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
Този последен код ще ограничи максималния размер на файла от 2 147 483 647 байта (максималния размер на Long). Това обаче е и максималният размер на база данни на Access, така че вероятно ще имате проблеми преди това. Този код също така не използва разкъсване, така че може да използва повече памет от необходимото.