Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Carregando arquivo do Access para o SQL Server com código DAO - erro de objeto obrigatório


O Set palavra-chave é usada para definir uma variável para uma referência de objeto. Seu .Value não é um objeto, é Null. Daí o Objeto Requerido erro.

O código que você encontrou é usado para campos de anexo do Access. Varbinary(Max) , no entanto, não é um campo de anexo, mas mapeia para um objeto OLE no Access/DAO. Isso significa que você precisa definir o valor como um bytearray contendo os dados do arquivo, em vez de usar um conjunto de registros aninhado para gerenciar anexos.

Há muitas maneiras de carregar um arquivo em um bytearray. Eu prefiro o seguinte código, que usa um 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 armazená-lo de volta em um arquivo:
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 você realmente não gosta de ADODB , e até mesmo a ideia de um ADODB.Stream te enoja, você também pode usar o próprio VBA para ler um arquivo em um 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á o tamanho máximo do arquivo de 2.147.483.647 bytes (o tamanho máximo de um Long). No entanto, esse também é o tamanho máximo de um banco de dados do Access, portanto, você provavelmente terá problemas antes disso. Esse código também não usa fragmentação, portanto, pode usar mais memória do que o necessário.