Access DB
Helmut
- datenbank
0 Vinzenz Mai
Tag zusammen,
hab mal eine Access DB spezifische frage. Was eigentlich weniger mit Web zu tun hat.
Ich habe ein Intranet mit ASP erstellt das auf eine Access DB aufbaut.
Jetzt möchte ich aber das diese DB sowie vom Intranet aus funktioniert aber auch aus Windows.
Das problem ist dabei das ich die DB wenn ich sie so offen habe sprich über Win geöffnet habe nicht mehr im Intranet funktioniert.
Wie kann man das problem beheben das ich sie problemlos über beide wege zugänglich machen kann.
Gruß Helmut
Hallo Helmut
Das problem ist dabei das ich die DB wenn ich sie so offen habe sprich über Win geöffnet habe nicht mehr im Intranet funktioniert.
Was heisst: sie funktioniert nicht mehr?
Welche Fehlermeldung erhältst Du?
Kann es sein, dass Du die DB-Datei exklusiv öffnest, das ist (bzw. war zumindest) die Standardmethode beim Doppelklick im Explorer? Wenn eine Datei exklusiv geöffnet ist, kann keine andere Anwendung darauf zugreifen. In Access 2003 kannst Du dies über Optionen->Weitere einstellen.
Mehr Informationen bitte.
Freundliche Grüße
Vinzenz
@Helmut
Hallo,
Schau mal nach, ob im verzeichnis deiner *.mdb eine *.ldb-Datei liegt. Das würde darauf schließen lassen, dass die Datenbank zum exklusiven Zugriff geöffnet ist. D.h. Die Daten sind gelockt und können nur von dem Nutzer mit dem exklusiven Zugriff geändert werden bis dieser den exklusiven Zugriff wieder aufhebt.
Gruß,
LeKuchen
Hallo
Schau mal nach, ob im verzeichnis deiner *.mdb eine *.ldb-Datei liegt. Das würde darauf schließen lassen, dass die Datenbank zum exklusiven Zugriff geöffnet ist.
Diese Datei wird auch bei nicht exklusivem Zugriff angelegt :-) Die Jet-Database-Engine kann relativ fein sperren.
Eine einfache Möglichkeit, nicht exklusiv zuzugreifen, ist die Trennung in eine Backend-DB-Datei, die nur Tabellen enthält und eine oder mehrere Frontend-DB-Dateien, die nur veknüpfte Tabellen enthalten.
Freundliche Grüße
Vinzenz
Hallo
Eine einfache Möglichkeit, nicht exklusiv zuzugreifen, ist die Trennung in eine Backend-DB-Datei, die nur Tabellen enthält und eine oder mehrere Frontend-DB-Dateien, die nur veknüpfte Tabellen enthalten.
Das ist schön und gut aber das kann ich leider nicht machen da ich per VB-script manche tabbelen selber anlege. Wenn ich aber jetzt die Benutzer mit den verknüpften tabellen arbeiten lasse kann ich das leider nicht mehr machen.
Auch wen ich das Intranet mit den verknüpften tabellen arbeite bringt mir das auch nichts wenn die Benutzer eine neue Tabelle erstellen ist die verknüpfung für das Intranet nicht da.
Gruß
Hello,
Diese Datei wird auch bei nicht exklusivem Zugriff angelegt :-) Die Jet-Database-Engine kann relativ fein sperren.
Es sperrt nicht die JET-Engine, dondern das OS!
Die JET-Engine fordert die Locks nur an und wertet sie aus.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom
Es sperrt nicht die JET-Engine, dondern das OS!
Nö.
Die JET-Engine fordert die Locks nur an und wertet sie aus.
Die Jet-Engine macht das schon selbst :-)
Das OS kann nicht dateiintern Sperren anlegen. Jet sehr wohl.
Freundliche Grüße
Vinzenz
Hello lieber Vinzenz,
Die JET-Engine fordert die Locks nur an und wertet sie aus.
Die Jet-Engine macht das schon selbst :-)
Das OS kann nicht dateiintern Sperren anlegen. Jet sehr wohl.
Da irrst Du.
Die dateiinternen Sperren bei der JET-Engine werden sehr wohl vom Betriebssystem angelegt, so wie sich das für eine anständige Applikation gehört. Hierzu dient der passende Interrupt des OS. Die JET-Engine fordert für die Datei gleich ein Handle mit einer allgemeinen Lockanforderung an und fordert dann eine Spere von "Byte bis Byte" an. Die Zuordnung der Sperrbereiche zu den Datensätzen ist allerdings Sache der JET-Engine. Die Sperrung als solche, ist Saache des OS.
Die JET-Engine ist nicht von Microsoft programmiert, sondern nur dazugeklauft. Wahrscheinlich verfolgt sie daher auch keinen proprietären Standard, sondern setzt auf den klassischen Erkenntnissen für DOS-System auf. Theoretisch würde sie daher auch auf einem LINUX-System funktionieren, das ja auch die Grundsätze eines DOS[1] einhält.
[1] Solltest Du es vergessen haben: DOS heißt 'Disk Operating System'. Das hat grundsätzlich erstmal nichts mit Microsoft zu tun, sondern mit der Art der Speicheraufteilung in HDD und RAM und die Art der Nutzung des HDD. Ein OS400 verfolgt da z.B. ein anderes Konzept, nämlich des Einspeichersystems.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Danke für die inforeiche aufklärung der Jet Engine.
Ich habe das problem jetzt anderweitig gelösst.
Ich greife über ASP über DSN auf die Access DB zu. Hier wird keine LDB datei angelegt.
Ich kann die DB jetzt wie vorher mit mehreren Benutzern öffnen lassen und zugleich über das Intranet werte abrufen.
Gruß
Helmut
Hello,
Ich greife über ASP über DSN auf die Access DB zu. Hier wird keine LDB datei angelegt.
Ich kann die DB jetzt wie vorher mit mehreren Benutzern öffnen lassen und zugleich über das Intranet werte abrufen.
Dann hat die DSN einen Fehler, bzw. es fehlt ein Parameter.
Wahrscheinlich werden über den DSN-Zugriff die Zugriffe (so wie sie jetzt eingestellt ist) auch serialisiert. das bedeutet, dass Du keinen wirklichen Mehrutzerbetrieb hast, sondern einen serialisierten. Es muss vom Websewrver (IIS ?) pro Zugriff immer die gesamte Datenbank eingelesen, der Zugriff ausgewertet und die DB wieder geschlossen werden. Das kostet extrem viel.
Es gibt aber für ACCESS-DBs eine spezielle Internet-Schnittstelle. Dafür muss ein spezieller Access-Server-Prozess auf dem Datenbank-Host installiert werden. Der hält dann die DB dauerhaft offen als ein virtueller User, der sich auch wieder an der *.mdw-Arbeitsgruppe angemeldet hat...
Wenn nun andere User ganz normal über das Netzwerk zugreifen wollen, müssen sie nur ebenfalls an der Arbeitsgruppe angemeldet sein und können konkurrierend zugreifen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom
Da irrst Du.
Deine Argumentation unterstützt meine Aussage :-)
[1] Solltest Du es vergessen haben: DOS heißt 'Disk Operating System'. Das hat grundsätzlich erstmal nichts mit Microsoft zu tun, sondern mit der Art der Speicheraufteilung in HDD
Da erinnere ich mich besser als Du. Mit "Disk" war die Floppy Disk gemeint und nicht die unerschwingliche Festplatte.
und RAM und die Art der Nutzung des HDD. Ein OS400 verfolgt da z.B. ein anderes Konzept, nämlich des Einspeichersystems.
Freundliche Grüße
Vinzenz
Hello,
Und was wolltest Du mir damit nun sagen?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo LeKuchen,
Ja diese Datei exestiert.
Die datei erstellt er aber jedesmal auch wenn ich über die ASP seite darauf zugreiffe.
Zugrif über die ASP seite findest du einen Beitrag drüber.
Hello,
Schau mal nach, ob im verzeichnis deiner *.mdb eine *.ldb-Datei liegt.
Das ist der richtige Hinweis
Das würde darauf schließen lassen, dass die Datenbank zum exklusiven Zugriff geöffnet ist.
Das stimmt nicht. Eine *.ldb lässt darauf schließen, dass die Access-DB für gemeinsame Netzwerkzugriffe vorbeereitet ist. Wie sie geöffnet wird, entscheidet trotzdem immer noch der Client beim Öffnen. Die JET-Engine ist eine zentrale Datenhaltung mit verteilter Engine, bzw. mit Multiengine.
D.h. Die Daten sind gelockt und können nur von dem Nutzer mit dem exklusiven Zugriff geändert werden bis dieser den exklusiven Zugriff wieder aufhebt.
Um die Datenbank im Netz gemeinsam nutzen zu können, müssen die Clients mittels Access-Arbeitsgruppenadministrator an eine gemeinsame *.mdw (Arbeitsgruppendatei) angeschlossen werden. Diese regelt dann später das automatische Öffnungsverhalten und die allgemeinen Zugriffsrechte.
Der Zugriff auf Tabellen, Datensätze der Tabellen, Abfragen, Berichte, Makros etc. wird dann über die *.ldb geregelt. Ggf. muss man (z.B. auf einem Novellserver) serverseits die MAX_LOCKS_PER_CLIENT (o.ä.) hochsetzen, damit sich Access nicht einfach aufhängt.
Die *.ldb ist nämlich Bestandteil des Betriebssystems und nicht der JET-Engine. Diese ruft nur den Interrupt für Mandatory Record Locking auf, welcher dann für die Erzeugung der *.ldb sorgt. Wenn das letzte Handle auf die *.ldb wieder zurückgegeben wurde (muss _nicht_ von dem Prozess sein, der das erste angefordert hat) verschwindet die *.ldb wieder.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom,
Das stimmt nicht. Eine *.ldb lässt darauf schließen, dass die Access-DB für gemeinsame Netzwerkzugriffe vorbeereitet ist. Wie sie geöffnet wird, entscheidet trotzdem immer noch der Client beim Öffnen. Die JET-Engine ist eine zentrale Datenhaltung mit verteilter Engine, bzw. mit Multiengine.
Danke, man lernt nie aus! ;o)
Gruß,
LeKuchen
Hallo Vinzenz
Was heisst: sie funktioniert nicht mehr?
Welche Fehlermeldung erhältst Du?
Auf der ASP seite kommt folgender fehler:
-----------------------------------------
Microsoft OLE DB Provider for ODBC Drivers Fehler "80004005'
[Microsoft][ODBC Microsoft Access Driver]Allgemeiner Fehler Registrierungsschlüssel 'Temporary (volatile) Jet DSN for process 0x5ac Thread 0x878 DBC 0x1501f94 Jet' kann nicht geöffnet werden.
Kann es sein, dass Du die DB-Datei exklusiv öffnest, das ist (bzw. war zumindest) die Standardmethode beim Doppelklick im Explorer? Wenn eine Datei exklusiv geöffnet ist, kann keine andere Anwendung darauf zugreifen. In Access 2003 kannst Du dies über Optionen->Weitere einstellen.
Ne die datei wird nicht Exlusiv geöffnet. Ja ich habe den standartöffnungsmodus auf Freigeben gestellt.
Verbindung von ASP auf die DB
-----------------------------
im strConn, Conn, strPfadDB, SQL
strPfadDB = Server.MapPath("/~db/edv.mdb")
strConn = "DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;PWD=;"
strConn = strConn & "DBQ=" & strPfadDB
set Conn = Server.CreateObject("ADODB.Connection")
set rs = Server.CreateObject("ADODB.Recordset")
SQL = "Select * From t_info"
Conn.Open (strConn)
rs.Open SQL, strConn, 0, 1
-------> ASP DB Anweisungen
rs.Close
Conn.Close
set rs = nothing
set Conn = nothing
Hallo,
Auf der ASP seite kommt folgender fehler:
Microsoft OLE DB Provider for ODBC Drivers Fehler "80004005'
[Microsoft][ODBC Microsoft Access Driver]Allgemeiner Fehler Registrierungsschlüssel 'Temporary (volatile) Jet DSN for process 0x5ac Thread 0x878 DBC 0x1501f94 Jet' kann nicht geöffnet werden.
Und das funktioniert sonst mit ADODB ohne Fehler, wenn die Access-DB nicht im Windows-System geöffnet ist? Die Fehlermeldung sagt nämlich, dass ein Registrierungsschlüssel nicht geöffnet werden konnte. Das kann daran liegen, dass es ihn gar nicht gibt[1] oder, dass ASP die Berechtigung hierzu nicht hat.
[1]könnte an Versionskonflikten (alte und neue parallel) liegen. Welches Access läuft, welche MDAC-Version, welche JetEngine?
Verbindung von ASP auf die DB
strConn = "DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;PWD=;"
Aha, zumindes MDAC scheint anno tobac zu sein. Der Treiber heißt, meines Wissens, jetzt immer englisch ;-)).
Update mal:
MDAC 2.8
http://www.microsoft.com/downloads/results.aspx?sortCriteria=date&OSID=&productID=B7ADDC23-DEC1-4C5F-8479-EAD9245A8D61&CategoryID=&freetext=&DisplayLang=de&DisplayEnglishAlso=
Microsoft Jet 4.0 Service Pack 8
für Dein Windows-System
http://www.microsoft.com/downloads/results.aspx?sortCriteria=date&OSID=&productID=3D99F106-AA6D-4113-AE45-30B61394B1E0&CategoryID=&freetext=&DisplayLang=de&DisplayEnglishAlso=
jeweils auf dem System, auf dem ASP und ODBC und auch auf dem Access als Anwendung läuft.
Hilfe zur Selbsthilfe:
Die fehlermeldung als Suchbegriff in Google eingeben, so genau wie möglich, damit noch Ergebnisse kommen.
http://www.google.de/search?hl=de&c2coff=1&q=Microsoft+OLE+DB+Provider+for+ODBC+Drivers+Fehler+80004005+[Microsoft][ODBC+Microsoft+Access+Driver]Allgemeiner+Fehler+Registrierungsschlüssel+'Temporary+&btnG=Suche&meta=
viele Grüße
Axel