Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Hochladen einer Datei von Access auf SQL Server mit DAO-Code – Fehler „Objekt erforderlich“.

Das Set Das Schlüsselwort wird verwendet, um eine Variable auf eine Objektreferenz zu setzen. Ihr .Value ist kein Objekt, es ist Null. Daher das Objekt erforderlich Fehler.

Der gefundene Code wird für Access-Anlagenfelder verwendet. Varbinary(Max) , ist jedoch kein Anhangsfeld, sondern wird einem OLE-Objekt in Access/DAO zugeordnet. Das bedeutet, dass Sie den Wert auf ein Bytearray setzen müssen, das die Dateidaten enthält, anstatt ein verschachteltes Recordset zu verwenden, um Anhänge zu verwalten.

Es gibt viele Möglichkeiten, eine Datei in ein Bytearray zu laden. Ich bevorzuge den folgenden Code, der einen ADODB.Stream verwendet Objekt.

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

Um es wieder in einer Datei zu speichern:

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

Wenn Sie ADODB wirklich nicht mögen , und sogar der Gedanke an einen ADODB.Stream ekelt Sie, Sie können auch VBA selbst verwenden, um eine Datei in ein Bytearray einzulesen:

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

Dieser letzte Code begrenzt die maximale Dateigröße von 2.147.483.647 Bytes (die maximale Größe eines Long). Dies ist jedoch auch die maximale Größe einer Access-Datenbank, sodass Sie wahrscheinlich vorher auf Probleme stoßen werden. Dieser Code verwendet auch kein Chunking, sodass möglicherweise mehr Speicher als erforderlich verwendet wird.