Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Caricamento del file da Access a SQL Server con codice DAO - Errore oggetto richiesto

Il Set La parola chiave viene utilizzata per impostare una variabile su un riferimento a un oggetto. Il tuo .Value non è un oggetto, è Null. Da qui l'Oggetto richiesto errore.

Il codice che hai trovato viene utilizzato per accedere ai campi degli allegati. Varbinary(Max) , tuttavia, non è un campo allegato, ma esegue il mapping a un oggetto OLE in Access/DAO. Ciò significa che devi impostare il valore su un bytearray contenente i dati del file, invece di utilizzare un recordset nidificato per gestire gli allegati.

Esistono molti modi per caricare un file in un bytearray. Preferisco il codice seguente, che utilizza un ADODB.Stream oggetto.

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

Per salvarlo di nuovo in un 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

Se proprio non ti piace ADODB e persino il pensiero di un ADODB.Stream ti disgusta, puoi anche usare VBA stesso per leggere un file in un 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

Quest'ultimo codice limiterà la dimensione massima del file di 2.147.483.647 byte (la dimensione massima di un Long). Tuttavia, questa è anche la dimensione massima di un database di Access, quindi probabilmente incontrerai problemi prima. Anche questo codice non utilizza il chunking, quindi potrebbe utilizzare più memoria del necessario.