sql >> Databáze >  >> RDS >> Sqlserver

Nahrávání souboru z Accessu na SQL Server s DAO kódem - Chyba Objekt je vyžadován

Set klíčové slovo se používá pro nastavení proměnné na odkaz na objekt. Vaše .Value není objekt, je to Null. Proto Vyžadován objekt chyba.

Kód, který jste našli, se používá pro pole přílohy Access. Varbinary(Max) , však není pole přílohy, ale mapuje se na objekt OLE v Access/DAO. To znamená, že místo použití vnořené sady záznamů ke správě příloh musíte nastavit hodnotu na bajtray obsahující data souboru.

Existuje mnoho způsobů, jak načíst soubor do byearray. Preferuji následující kód, který používá ADODB.Stream 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

Chcete-li jej uložit zpět do souboru:

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

Pokud se vám opravdu nelíbí ADODB a dokonce i myšlenka na ADODB.Stream znechucuje vás, můžete také použít samotný VBA ke čtení souboru do byearray:

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

Tento poslední kód omezí maximální velikost souboru na 2 147 483 647 bajtů (maximální velikost Long). To je však také maximální velikost databáze Accessu, takže se před tím pravděpodobně dostanete do problémů. Tento kód také nepoužívá chunking, takže může používat více paměti, než je potřeba.




  1. Kde je stůl, který má speciální cenu v Magentu?

  2. MySQL JDBC Driver 5.1.33 – Problém s časovým pásmem

  3. Vypočítejte průběžný součet / průběžný zůstatek

  4. SQL AVG() pro začátečníky