sql >> Database >  >> RDS >> Sqlserver

Bestand uploaden van Access naar SQL Server met DAO-code - Object vereist fout

De Set trefwoord wordt gebruikt voor het instellen van een variabele naar een objectreferentie. Uw .Value is geen object, het is Null. Vandaar het Object vereist fout.

De code die je hebt gevonden, wordt gebruikt voor Access-bijlagevelden. Varbinary(Max) , is echter geen bijlageveld, maar is toegewezen aan een OLE-object in Access/DAO. Dat betekent dat u de waarde moet instellen op een bytearray die de bestandsgegevens bevat, in plaats van een geneste recordset te gebruiken om bijlagen te beheren.

Er zijn veel manieren om een ​​bestand in een bytearray te laden. Ik geef de voorkeur aan de volgende code, die gebruik maakt van een ADODB.Stream voorwerp.

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

Om het weer in een bestand op te slaan:

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

Als je ADODB echt niet leuk vindt , en zelfs de gedachte aan een ADODB.Stream walgt van je, je kunt VBA zelf ook gebruiken om een ​​bestand in een bytearray in te lezen:

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

Deze laatste code beperkt de maximale bestandsgrootte van 2.147.483.647 bytes (de maximale grootte van een Long). Dit is echter ook de maximale grootte van een Access-database, dus u zult waarschijnlijk eerder in de problemen komen. Deze code maakt ook geen gebruik van chunking, dus het kan meer geheugen gebruiken dan nodig is.




  1. SQL-syntaxisfout bij het laden van het databasebestand (mogelijke versiefout?)

  2. Datums vergelijken in SQL Server

  3. SQL-query werkt in console, maar niet in python

  4. Invoegen in één tabelbasis op samenvoegresultaat van 2 andere tabellen