Egenskapen data åtkomst objekt (DAO) LastUpdated returnerar felaktiga datum/tider i Microsoft Access-databas


Avancerat: kräver expert kodning, interoperabilitet och fleranvändarkunskaper.Den här artikeln gäller endast en Microsoft Access-databas (. mdb).

Symptom


Egenskapen data åtkomst objekt (DAO) Lastupdated returnerar felaktiga datum/tider för Microsoft Access-formulär, rapporter, makron och moduler.

Orsak


Microsoft Access meddelar inte Microsoft Jet-databasmotorn om ändring av Åtkomstspecifika objekt (formulär, rapporter, makron och moduler). därför uppdateras kolumnen Dateupdate i tabellen MSysObjects aldrig till rätt datum och tid. Samma beteende gäller för Microsoft Access 2007, som använder Microsoft Access-databasmotorn.

Status


Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i början av den här artikeln.

Mer information


Egenskapen Lastupdated som tillhandahålls av DAO returnerar rätt datum/tid för databasmotor objekt (tabeller, frågor och relationer), men det returnerar bara datum för skapandet, inte det senaste ändringsdatumet för Microsoft Access-specifika objekt (formulär, rapporter, makron och moduler). Före Microsoft Access 2000 använde Microsoft Access en Jet-databasfil (. mdb) för att lagra både databasobjekt (tabeller, frågor och relationer) samt Microsoft Access-specifika objekt (formulär, rapporter, makron och moduler). Microsoft Access lagrade dess specifika objekt i Jet system-tabeller, särskilt tabellerna MSysObjects och MSysModules (eller MSysModules2). Kolumnen Dateupdate i tabellen MSysObjects är ansvarig för att lagra ett objekts senaste ändringsdatum och är den kolumn som egenskapen Dao lastupdated använder för att returnera ett objekts senaste ändringsdatum. När en användare ändrade och sparade ett objekt i tidigare versioner, meddelade Microsoft Access Jet-databasmotorn att objektet hade ändrats och Jet uppdaterade kolumnen Dateupdate till aktuellt datum och aktuell tid. Microsoft Access 2000 introducerade Access-projektfiler (. adp), som har möjlighet att ansluta direkt till Microsoft SQL Server-databaser utan att använda Jet-databasmotorn. Eftersom ADP-filer inte använder Jet-databasmotorn (eller Access-databasmotorn), kunde Access inte använda samma lagringsformat som tidigare användes i Jet-databaser för åtkomstspecifika objekt. Det var tvungen att lagra dem i ett nytt OLE doc-lagringsformat som är tillgängligt i både Jet-databaser och Access-projekt. När användaren först skapar ett nytt Microsoft Access-specifikt objekt, till exempel ett formulär), anger databasmotorn fortfarande aktuellt datum och aktuell tid i kolumnerna Datecreate och dateupdate i tabellen MSysObjects. Men när användaren ändrar och sparar objektet, meddelar Microsoft Access inte databasmotorn. Därför förblir kolumnen Dateupdate alltid densamma. Dessutom kanske du har märkt att databasfönstret (i versioner innan Access 2007) och navigeringsfönstret i Access 2007 eller Access 2010 visar rätt datum och tid för ett objekts senaste ändring. Detta beror på att Microsoft Access använder sin egen interna mekanism för att lagra det skapade datumet och ändringsdatumet, oberoende av databasmotorn. Microsoft Access exponerar tyvärr inte denna information i sin objektmodell. Därför finns det inget programmatiska sätt att komma åt den här informationen i Microsoft Access.

Steg för att återskapa beteendet

  1. Starta Microsoft Access och skapa en ny, tom databas.
  2. Skapa ett nytt, tomt formulär i designvyn.
  3. Lägg till en textruta i formuläret.
  4. Spara formuläret som Frmlastupdatedoch Stäng den.
  5. I Access 2003 och tidigare versioner av Access väljer du Visa -menyn och klickar på information. I Access 2007 eller Access 2010 högerklickar du på kategori huvudet i navigerings fönstret till vänster och klickar på Visa efter Detaljer. Detta visar de ändrade och skapade datumen för varje objekt. Observera att både de ändrade och skapade kolumnerna för formuläret frmlastupdated är inställda på samma datum och tid.
  6. Tryck på CTRL + G för att öppna direktfönstret i Visual Basic Editor. (I Access 2007 eller Access 2010 måste du först aktivera innehållet eller databasen måste vara på en betrodd plats.)
  7. Skriv följande rad i direktfönstret och tryck sedan på RETUR:
    ?CurrentDb.Containers("Forms").Documents("frmLastUpdated").LastUpdated
    Observera att datum och tid som returneras motsvarar de ändrade och skapade kolumnerna i databasfönstret.
  8. Tryck på ALT + F11 för att växla tillbaka till Microsoft Access.
  9. Öppna formuläret frmLastUpdated i designvyn.
  10. Lägg till en andra textruta i formuläret och spara och Stäng den. Observera att den ändrade kolumnen i databasfönstret innehåller ett uppdaterat datum och tid för formuläret.
  11. Upprepa steg 7 och 8.
Notera Egenskapen Lastupdated returnerar fortfarande det ursprungliga datumet och tiden i stället för det nya datum och den tid som visas i kolumnen ändrad i databasfönstret.