MS Access Laufzeitfehler 3420

Registriert
Juli 2008
Beiträge
134
Hai!

Ich habe da ein sehr seltsames Problem mit MS Access 2007 (und auch schon mit der vorher von mir eingesetzten Version MS Access 97).

Ich habe ein umfangreiches Paket an Datenbankfunktionen, das aus einer (wöchentlich neuen) Textdatei eine Datenbank befüllt. Die Textdatei ist hierarchisch aufgebaut und läßt sich recht gut parsen. Der Umfang einer solchen Datei liegt bei ca. 200.000 - 300.000 Zeilen; die Datenbank hat mittlerweile einen Umfang von ca. 100 MByte, ist also nicht wirklich groß. Der Parser als solcher arbeitet auch ohne (mir bekannte) Probleme. Jeweils (logisch) zusammengehörige Blöcke der Eingabedatei werden dann in die entsprechenden Tabellen der Datenbank gepackt. Dazu verwende ich verschiedene Routinen, die (soweit möglich) unabhängig von der jeweils verwendeten Tabelle arbeiten. So weit, so gut.

Das ganze funktioniert oftmals ohne Probleme, d.h. die komplette Textdatei läßt sich einlesen. Ab und an aber bricht der Vorgang mittendrin mit der Meldung "Laufzeitfehler 3420: Das Objekt ist ungültig, oder es ist nicht mehr festgelegt." ab. Vor dem Einlesen einer Datei lege ich immer ein Backup der aktuellen Datenbank an. Spiele ich das zurück (sprich: ich lösche die aktuell verwendete Datenbank und benenne das Backup wieder entsprechend um) und starte den Vorgang erneut, dann kann ich wieder Pech haben und es kommt zu einem Abbruch; ich kann aber auch Glück haben und der Prozess läuft fehlerfrei durch. Wenn es zu Abbrüchen kommt, dann findet das leider immer an unterschiedlichen Stellen der Textdatei statt (sonst wäre es ja auch zu einfach ;-) ), mal nach 30.000 eingelesene Zeilen, mal nach 150.000, mal nach 70.000; immer unterschiedlich. Auch die Routinen, in denen obiger Fehler auftritt sind unterschiedlich. Zwei der Routinen, in denen es häufig mal zum Abbruch kommt (sprich: dort landet man nach dem Aufruf des Debuggers), sind diese:

Code:
Public Function GetTableDefinition(ByVal ForTable As String, ByVal InDatabase As Database) As TableDef

Rem Liefert die Tabellendefinition der durch 'ForTable' bezeichneten Tabelle zurück.

Dim ATable As TableDef
Dim I As Integer

For I = 0 To InDatabase.TableDefs.Count - 1
  If InDatabase.TableDefs(I).Name = ForTable Then
    Set ATable = InDatabase.TableDefs(I)
    Exit For
  End If
Next I

Set GetTableDefinition = ATable

End Function

In obiger Routine ist das Objekt InDatabase gemeint und es kann nicht auf InDatabase.TableDefs.Count zugegriffen werden.

Code:
Public Function Lookup1(ByVal InTable As String, ByVal IDValue As Long, ByVal ReturnedColumn As String) As Variant

Rem Sucht in der Tabelle 'InTable' (Spalte des Primärschlüssels) nach 'IDValue' und gibt den zugehörigen
Rem Wert der Spalte 'ReturnedColumn' zurück.

Dim AnIndex As Index
Dim ARecordset As Recordset

Set AnIndex = GetPrimaryIndex(InTable)
Set ARecordset = EresseaDB.OpenRecordset(InTable)
ARecordset.Index = AnIndex.Name

Rem Hier kann ruhig Seek statt Find verwendet werden, da wir nach dem Primärschlüssel suchen, der eindeutig ist.
ARecordset.Seek "=", IDValue
If ARecordset.NoMatch Then
  Lookup1 = Null
Else
  Lookup1 = ARecordset(ReturnedColumn)
End If
ARecordset.Close
  
End Function

Hier kann der Recordset nicht angelegt werden, weil EresseaDB nicht mehr gültig sein soll.

Meine Datenbankvariable (EressaDB im zweiten Beispiel) ist global über alle Module vereinbart. In vielen Routinen übergebe ich diese mittlerweile, einfach weil ich dachte, dass Access evtl. Probleme mit global vereinbarten Objekten haben könnte. Dem ist aber augenscheinlich nicht so.

Was ich noch ausprobiert habe:

Das Ausschalten des Wächters meines Virenscanner scheint einen Einfluß zu haben. Ich habe den Eindruck, dass das Fehlerbild bei ausgeschaltetem Wächter nicht so häufig auftritt. Aber statistisch messbar ist das leider nicht.

Früher hatte ich nur 4GB Hauptspeicher, weil sich unter XP sowieso nicht mehr nutzen ließ. Seitdem ich auf Windows 7 64bit umgestiegen, habe ich kurz danach auch mal den Hauptspeicher aufgerüstet. Das scheint einen Einfluß zu haben, denn mit 8 GB treten die Fehler deutlich seltener auf und ich komme dazu, die Textdatei häufig schon im ersten oder zweiten Anlauf auswerten zu können. Seltsam hieran ist, daß der Ressourcenmonitor anzeigt, daß immer noch gute 5,5 GByte Speicher frei sind. Also kann es eigentlich nicht an mangelndem Hauptspeicher liegen.

Generell lasse ich während des Datenbanklaufs keine anderen Programme laufen, weil ich vermute, daß das hilfreich sein könnte. Aber das ist nur eine Vermutung.

Ihr merkt, vieles hier sind Vermutungen, denn zwar findet sich im Netz zu dieser Fehlernummer vieles, aber leider nichts (für meinen Fall) Hilfreiches. Bei den im Netz zu findenen Problemen handelt es sich meistens um tatsächliche Programmierfehler, die ich hier aber mal ausschließe (ohne mich selbst loben zu wollen).

Ich bin über jeden Hinweis, was ich vielleicht übersehen haben könnte oder mal ausprobieren sollte, dankbar.

Sollte ich hier im Office-Forum nicht richtig aufgehoben sein, so spricht nichts dagegen, wenn ein Moderator das ins Programmieren-Forum verschiebt, sollte es dort besser angesiedelt sein.

Gruß,
Thorsten
 
Zuletzt bearbeitet: (Code-Tags korrigiert)
@
lass deinen Code durch den Assistenten berichtigen.
 
steigt denn der RAM Verbrauch rapide an bzw verbraucht Access dann viel Speicher im Task Manager wenn das Ding läuft?
 
Hai!

Lawnmower schrieb:
steigt denn der RAM Verbrauch rapide an bzw verbraucht Access dann viel Speicher im Task Manager wenn das Ding läuft?

Ich habe die Auswertung gerade mal testweise gestartet: Mit allen möglichen Programmen, die so tagsüber auf meinem Laptop laufen, waren vor dem Start ca. 3300 MB Speicher in Benutzung. Durch den Start der Datenbank-Auswertung kamen dann ca. 300 MB hinzu. Die Auswertung läuft momentan auch noch ohne Fehler, immer noch bei ca. 300 MB Speicherverbrauch nur für diesen Prozess (Speicherverbrauch ermittelt mit Process Explorer).

Ergänzung:
Die Auswertung ist diesmal ohne Probleme durchgelaufen.

Gruß,
Thorsten
 
Zuletzt bearbeitet: (Ergänzung)
Hai!

Lawnmower schrieb:
dieses File das Du da reinlädtst - das wird aber nicht beim Abrufen geändert (z.B. neuer Eintrag) oder sowas?

Nein, die Eingabedatei bleibt unverändert. Weil ich da einen Zusammenhang mit den Rechten vermutete, habe ich ja auch schon mal den Wächter des Virenscanners ausgeschaltet, um zu verhindern, das der darauf zugreift, während meine Datenbankauswertung die Datei einliest.

Allerdings ist die Eingabedatei nicht schreibgeschützt - es funktioniert ja oftmals auch ohne Absturz, so daß es daran (eigentlich) nicht liegen kann.

Gruß,
Thorsten
 
Von den Tests bisher die funktioniert haben (also die aktuellen jetzt) und denen die den Fehler auslösten: War das immer genau das gleiche File oder war das bereits eine "neue Version"?
 
Hai!

Lawnmower schrieb:
Von den Tests bisher die funktioniert haben (also die aktuellen jetzt) und denen die den Fehler auslösten: War das immer genau das gleiche File oder war das bereits eine "neue Version"?

Es handelt sich bei den Textdateien um Auswertungen eines PBeM-Spiels (genauer: Eressea). Die erhalte ich wöchentlich und lese diese in die o.a. Datenbank ein. Ich habe gestern abend die aktuelle (also die von dieser Woche) Auswertung eingelesen und dies auch im sechsten oder siebten Anlauf geschafft. Vorhin habe ich dieselbe Datei nochmals eingelesen (vorher habe natürlich das Backup der Datenbank wieder hergestellt, so daß ich letztlich auf demselben Stand wie gestern abend aufgesetzt habe) und es hat problemlos im ersten Anlauf funktioniert.

Fazit: Mal geht's, mal nicht. Wenn's nicht geht, dann stoppt der Prozess an ganz unterschiedlichen Stellen. Das ist ja das Frustrierende.

Gruß,
Thorsten
 
Zurück
Oben