Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Téléchargement de fichier depuis Access vers SQL Server avec le code DAO - Erreur d'objet requis

L'Set mot clé est utilisé pour définir une variable sur une référence d'objet. Votre .Value n'est pas un objet, c'est Null. D'où l'Objet Requis erreur.

Le code que vous avez trouvé est utilisé pour accéder aux champs des pièces jointes. Varbinary(Max) , cependant, n'est pas un champ de pièce jointe, mais correspond à un objet OLE dans Access/DAO. Cela signifie que vous devez définir la valeur sur un tableau d'octets contenant les données du fichier, au lieu d'utiliser un jeu d'enregistrements imbriqué pour gérer les pièces jointes.

Il existe de nombreuses façons de charger un fichier dans un bytearray. Je préfère le code suivant, qui utilise un ADODB.Stream objet.

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

Pour le stocker dans un fichier :

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 vous n'aimez vraiment pas ADODB , et même la pensée d'un ADODB.Stream vous dégoûte, vous pouvez aussi utiliser VBA lui-même pour lire un fichier dans 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

Ce dernier code plafonnera la taille maximale du fichier à 2 147 483 647 octets (la taille maximale d'un Long). Cependant, il s'agit également de la taille maximale d'une base de données Access, vous rencontrerez donc probablement des problèmes avant cela. Ce code n'utilise pas non plus de segmentation, il peut donc utiliser plus de mémoire que nécessaire.