Om een Jet-MDB file te comprimeren, kunnen we ADO niet gebruiken. Toch zijn er situaties, bijvoorbeeld als er geen Access is geinstalleerd, dat we een dergelijke functionaliteit nodig hebben. JRO benaderen via automation biedt een oplossing. Code is Visual Objects, maar biedt voor bijv. Delphi ontwikkelaars voldoende aanknopingspunten.
Overigens is dit voorbeeld een leuke illustratie van hoe je een routine schrijft die niet kan crashen.
Met dank aan Robert vd Hulst.
FUNCTION Start()
IF ! CompactDatabase("D:\Vo2ado\Northwind.mdb", "D:\Vo2ado\NewNorthwind.mdb")
? "Error compacting database"
ELSE
? "Compact succesful"
ENDIF
WAIT
FUNCTION CompactDatabase(cOldfile AS STRING, cTmpFile AS STRING)
LOCAL oJetEngine AS OBJECT
LOCAL cbErr AS CODEBLOCK
LOCAL lRet AS LOGIC
LOCAL oError
cbErr := ErrorBlock({"oErr"_Break(oError)})
BEGIN SEQUENCE
oJetengine := OleAutoObject{"JRO.JetEngine"}
IF ! oJetEngine:Finit
BREAK "Could not start JRO.JetEngine"
ENDIF
IF File(cTmpFile)
IF ! FErase(cTmpFile)
BREAK "Could not erase "+cTmpFile
ENDIF
ENDIF
oJetEngine:CompactDatabase("Data Source="+cOldFile+";",;
"Data Source="+cTmpFile+";")
IF ! FErase(cOldFile)
BREAK "Could not erase "+cOldFIle
ENDIF
IF ! FRename(cTmpFile, cOldFile)
BREAK "Could not Rename"
BREAK
ENDIF
lRet := TRUE
RECOVER USING oError
ErrorBlock(cbErr)
lRet := FALSE
IF IsInstanceOfUsual(oError,#Error)
? oError:Description
ELSE
? AsString(oError)
ENDIF
END
ErrorBlock(cbErr)
RETURN lRet