sql >> Databasteknik >  >> RDS >> Sqlserver

Laddar upp fil från Access till SQL Server med DAO-kod - Objekt krävs fel

Set nyckelord används för att ställa in en variabel till en objektreferens. Ditt .Value är inte ett objekt, det är Null. Därav Objekt krävs fel.

Koden du har hittat används för Access bifogade fält. Varbinary(Max) , är dock inte ett bifogat fält, utan mappar till ett OLE-objekt i Access/DAO. Det betyder att du måste ställa in värdet på en bytearray som innehåller fildata, istället för att använda en kapslad postuppsättning för att hantera bilagor.

Det finns många sätt att ladda en fil i en bytearray. Jag föredrar följande kod, som använder en ADODB.Stream objekt.

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

Så här sparar du tillbaka den till en fil:

With CreateObject("ADODB.Stream")
    .Type = 1 'adTypeBinary
    .Open
    .Write rstWater_Files.Fields("Binary_File").Value
    .SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
    .Close
End With

Om du verkligen inte gillar ADODB , och till och med tanken på en ADODB.Stream äcklar dig, du kan också använda själva VBA för att läsa en fil till en 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

Den sista koden kommer att begränsa den maximala filstorleken på 2 147 483 647 byte (maxstorleken för en Long). Detta är dock också maxstorleken på en Access-databas, så du kommer troligen att stöta på problem innan dess. Den här koden använder inte heller chunking, så den kan använda mer minne än vad som krävs.




  1. Avrundning nedåt DECIMAL(14,3) till tredje decimalsiffran i SQL 2008

  2. skapa array från mysql-fråga php

  3. Datatyp krävs i en mysql för ett datum som innehåller dag-månad-år

  4. Finns det en funktion i Oracle som beräknar skillnaden mellan två datum?