sql >> Base de Datos >  >> RDS >> Sqlserver

Cargando archivo desde Access a SQL Server con código DAO - Error de objeto requerido

El Set La palabra clave se utiliza para establecer una variable en una referencia de objeto. Tu .Value no es un objeto, es Nulo. De ahí el Objeto requerido error.

El código que ha encontrado se usa para Acceder a los campos adjuntos. Varbinary(Max) , sin embargo, no es un campo adjunto, sino que se asigna a un objeto OLE en Access/DAO. Eso significa que debe establecer el valor en un bytearray que contenga los datos del archivo, en lugar de usar un conjunto de registros anidado para administrar los archivos adjuntos.

Hay muchas formas de cargar un archivo en un bytearray. Prefiero el siguiente código, que usa un ADODB.Stream objeto.

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

Para volver a almacenarlo en un archivo:

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

Si realmente no te gusta ADODB , e incluso la idea de un ADODB.Stream te disgusta, también puedes usar VBA para leer un archivo en 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

Este último código limitará el tamaño máximo de archivo de 2,147,483,647 bytes (el tamaño máximo de un Long). Sin embargo, este también es el tamaño máximo de una base de datos de Access, por lo que es probable que tenga problemas antes de eso. Este código tampoco usa fragmentación, por lo que podría usar más memoria de la requerida.