Set
słowo kluczowe służy do ustawienia zmiennej na odwołanie do obiektu. Twoja .Value
nie jest przedmiotem, jest zerem. Stąd Obiekt wymagany błąd.
Znaleziony kod jest używany w polach załączników programu Access. Varbinary(Max)
, jednak nie jest polem załącznika, ale mapuje do obiektu OLE w programie Access/DAO. Oznacza to, że musisz ustawić wartość na tablicę bajtów zawierającą dane pliku, zamiast używać zagnieżdżonego zestawu rekordów do zarządzania załącznikami.
Istnieje wiele sposobów na załadowanie pliku do tablicy bajtów. Wolę następujący kod, który używa ADODB.Stream
obiekt.
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
Aby zapisać go z powrotem w pliku:
With CreateObject("ADODB.Stream")
.Type = 1 'adTypeBinary
.Open
.Write rstWater_Files.Fields("Binary_File").Value
.SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
.Close
End With
Jeśli naprawdę nie lubisz ADODB
, a nawet myśl o ADODB.Stream
brzydzi cię, możesz również użyć samego VBA do wczytania pliku do tablicy bajtów:
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
Ten ostatni kod ogranicza maksymalny rozmiar pliku do 2 147 483 647 bajtów (maksymalny rozmiar Long). Jest to jednak również maksymalny rozmiar bazy danych programu Access, więc prawdopodobnie wcześniej będziesz mieć kłopoty. Ten kod również nie używa chunkingu, więc może zużywać więcej pamięci niż jest to wymagane.