ThorstenBehrens
Ensign
- 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:
In obiger Routine ist das Objekt InDatabase gemeint und es kann nicht auf InDatabase.TableDefs.Count zugegriffen werden.
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
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)