Set
kata kunci digunakan untuk mengatur variabel ke referensi objek. .Value
. Anda bukan objek, itu Null. Oleh karena itu Objek Diperlukan kesalahan.
Kode yang Anda temukan digunakan untuk bidang lampiran Access. Varbinary(Max)
, bagaimanapun, bukan bidang lampiran, tetapi memetakan ke objek OLE di Access/DAO. Itu berarti Anda perlu menyetel nilai ke bytearray yang berisi data file, alih-alih menggunakan kumpulan record bersarang untuk mengelola lampiran.
Ada banyak cara untuk memuat file ke dalam bytearray. Saya lebih suka kode berikut, yang menggunakan ADODB.Stream
objek.
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
Untuk menyimpannya kembali ke file:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Jika Anda benar-benar tidak menyukai ADODB
, dan bahkan memikirkan ADODB.Stream
membuat Anda jijik, Anda juga dapat menggunakan VBA sendiri untuk membaca file menjadi 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
Kode terakhir ini akan membatasi ukuran file maksimal 2.147.483.647 byte (ukuran maksimal dari Long). Namun, ini juga merupakan ukuran maksimal database Access, jadi Anda mungkin akan mengalami masalah sebelumnya. Kode ini juga tidak menggunakan chunking, sehingga mungkin menggunakan lebih banyak memori daripada yang dibutuhkan.