Set
từ khóa được sử dụng để thiết lập một biến thành một tham chiếu đối tượng. .Value
của bạn không phải là một đối tượng, nó là Null. Do đó, Đối tượng bắt buộc lỗi.
Mã bạn tìm thấy được sử dụng cho các trường tệp đính kèm Access. Varbinary(Max)
, tuy nhiên, không phải là trường phần đính kèm, nhưng ánh xạ tới một đối tượng OLE trong Access / DAO. Điều đó có nghĩa là bạn cần đặt giá trị thành một dải byte chứa dữ liệu tệp, thay vì sử dụng một tập bản ghi lồng nhau để quản lý tệp đính kèm.
Có nhiều cách để tải một tệp vào một bytearray. Tôi thích mã sau, sử dụng ADODB.Stream
đối tượng.
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
Để lưu trữ nó trở lại một tệp:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Nếu bạn thực sự không thích ADODB
và thậm chí là ý nghĩ về ADODB.Stream
làm bạn khó chịu, bạn cũng có thể sử dụng chính VBA để đọc tệp thành 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
Đoạn mã cuối cùng này sẽ giới hạn kích thước tệp tối đa là 2,147,483,647 byte (kích thước tối đa của một Long). Tuy nhiên, đây cũng là kích thước tối đa của cơ sở dữ liệu Access, vì vậy bạn có thể sẽ gặp rắc rối trước đó. Mã này cũng không sử dụng phân đoạn, vì vậy nó có thể sử dụng nhiều bộ nhớ hơn yêu cầu.