![]() |
Datenbank: dbf • Version: ? • Zugriff über: TDBFUniprovider
Fehlermeldung: Zugriff auf DBF gesperrt
Hallo in die Runde,
ich lese Daten per SQL SELECT Abfrage aus einer dbf-Datei mit den Komponenten TUniConnection, TDBFUniprovider und TUniQuery aus. Die Datei hat ca.250 Datensätze, ich lese in einer Zeile ein Feld aus.
Code:
SELECT USERID FROM TSTAMP WHERE TAGID = :p1
Delphi-Quellcode:
Das Programm, das die Datenbank mitgeliefert hat, wird wohl mit FoxPro entwickelt worden sein.
DbModul.qryTsUserId.Params[0].Value := UserName;
DbModul.qryTsUserId.Open; UserNbr := DbModul.qryTsUserId.Fields[0].AsString; DbModul.qryTsUserId.Close; Es kommt vor, das eine Fehlermeldung aufplopt:
Code:
Ich bin leider nicht so Fit mit diesem ja schon relativ alten Datenbankformat. Wie kann ich in Delphi prüfen, ob die dbf-Datei gerade gesperrt ist.
Datei TsUserId.dbf kann nicht geöffnet werden. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
In der Komponente TUniConnection und TUniQuery gibt auch viele für mich nicht ganz verständliche Optionen, um den Zugriff auf die dbf zu steuern. Gibt es dort eventuell Möglichkeiten, die Sperre der Datei abzuwarten? Wo wird in dem dbf-System eventuell die Datensperre verwaltet?? Gibt es eine bessere Möglichkeit, auf die dbf-Datei lesend zuzugreifen? Ich bin für jeden Hinweis dankbar Mit besten Grüßen Gerd |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Es kann bei 'ner DBF für gewöhnlich nur ein einzelner User auf die Datenbankdatei zugreifen. Mehrplatzbterieb oder Zugriff über mehrere Instanzen eines Programmes von einem Rechner scheitern für gewöhnlich mit einer derartigen Fehlermeldung. Selbst zwei Selects über zwei Querykomponenten, aus einem Programm heraus, können zu dieser Fehlermeldung führen.
Wenn Du z. B. in der IDE die Query geöffnet hast und dann das Programm aus der IDE (z. B. im Debugger / aber auch ohne Debugger) startes, wird das Öffnen der Query im Programm (höchstwahrscheinlich) mit dieser Fehlermeldung enden. Stelle sicher, dass in der IDE keine Verbindung, keine Query geöffnet ist, sondern erforderliche Verbindungen zur DB erst zur Laufzeit geöffnet werden und Abfragen per Query erst unmittelbar vor deren Verwendung und nur solange wie zwingend erforderlich offen gehalten werden. Ob TUniConnection, TDBFUniprovider und TUniQuery über Attribute verfügen, mit deren Hilfe man das Problem ggfls. reduzieren oder vermeiden kann, weiß ich nicht. Mit der BDE ging das früher in geringem Umfang, aber die ist inzwischen sowas von Schnee von gestern, dass sie als alternative Zugriffsschicht wohl eher ausscheidet. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Falls ein Virenscanner läuft mal eine Ausnahme auf den Ordner der DB definieren.
|
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Unter Delphi 12.1 habe ich gute Erfahrungen mit Adoconnection, Adoquery und dem ODBC-Driver(32bit) vfpodbc.dll 6.01.8629.01 vom 07.12.1999 gemacht.
Leider weiss ich nicht mehr wie der auf den Entwicklungsrecher gekommen ist und wo man den heute herbekommt. Gruß Alfred |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Die sind bei Windows in der ODBC-Verwaltung immer mit dabei, die scheint Microsoft da immer mit zuliefern, genauso wie die für Access, Paradox, Excel, Text und SQL-Server.
|
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Ich habe jetzt Verschiedenes probiert, aber so richtig funktioniert es nicht: es sind 2 DBF Dateien, die ich abfragen möchte, bei der einen läuft es eigentlich immer ohne Fehler durch, die zweite sperrt sich aber immer gegen meine Leseversuche. Eventuell passt auch die Fehlermeldung nicht zur Ursache. Ich werde weiter suchen...
Ich hab auch noch nicht herausbekommen, wie ich den Prozess, der die DB sperrt, finden kann. Ich helfe mir jetzt damit, das ich mir die Datei außerhalb der Arbeitszeiten in ein eigenes Verzeichnis kopiere. Auch wenn das mich nicht wirklich zufrieden stellt, es funktioniert erstmal. Die kopierten Daten sind für 24 Stunden ausreichend aktuell. Trotz allem, Danke für die Hilfe!! Beste Grüße Gerd |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Den "Übeltäter" finden könntest Du eventuell so:
Code:
Kann funktionieren, muss aber nicht.
Microsoft Sysinternals Process Explorer
Process Explorer öffnen: Starten Sie den Process Explorer als Administrator. Handle oder DLL suchen: Klicken Sie auf das Fernglas-Symbol (Find Handle or DLL) oder drücken Sie STRG + SHIFT + F. Dateinamen eingeben: Geben Sie den Dateinamen oder den Pfad der gesperrten Datei ein und klicken Sie auf „Search“. Prozess identifizieren: Der Prozess, der die Datei verwendet, wird in der Liste hervorgehoben. Sie können den Prozess beenden, indem Sie den Eintrag markieren und die Entfernen-Taste drücken. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Ich würde mal mit einem Hexeditor prüfen was im ersten Byte der beiden dbf-Dateien
steht. Man könnte aber auch die dbf mit LibreOffice Calc öffnen um zu sehen ob die Datei ok ist. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Wäre denn eine Umstellung auf das direkte Lesen der DBF-Dateien denkbar.
Das könnte dann z.B. über TDBF ![]() |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Die *.dbf könnte auch Teil einer *.dbc sein.
Gibt es denn eine *.cdx? |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Letzteres geht aber eher nicht mehr, da eigentlich niemand eine solche Lizenz vergeben kann, selbst der originale Entwickler nicht, da inzwischen jede Menge andere zum Projekt beigetragen haben. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Da habe ich die Antword vom Gemini wohl falsch verstanden. ![]() |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Zitat:
Nochmal laut Gemini: Zitat:
|
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Ich hab mich nicht weiter mit den Dateien beschäftigt und war davon ausgegangen, das der TDBFUniProvider von devart das hinbekommt, da alle Dateien im Verzeichniss vorhanden sind. Ich mache jetzt (hatte ich das schon geschrieben?) eine Kopie über Nacht in ein eigenes Verzeichniss, das ist für mich ausreichend aktuell und ich komme nicht mit anderen ins gehege. Es könnte ja auch mal sein, deis mein Programm die Verbindung nicht beendet. Das Kopieren funktionert (bisher) ohne Fehler, 7zip weigert sich regelmäßig, weil andere auf die Dateien zugreifen. Seis drum, ich hab eine Lösung. Und die weiteren Hinweise hier im Tread - herzlichen Dank dafür - ich komme zurecht, und ich schätze mal, das devart da nicht viel anders, ist als die genannte Komponente TDBF. Beste Grüße Gerd |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Hier die Erklärung warum die 2. Datei zickt.
![]() Ich habe leider keine Erfahrung wie man auf Dateien mit Memofeldern zugreift. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
![]() M.E. braucht die 2. Datei andere Zugriffsinformationen wie die einfache dbf. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal das mit dem Memofeld getestet.
Die FPT entsteht wenn man in VFP 9.0 ein Feld mit "memo" anlegt Die CDX entsteht wenn man in VFP 9.0 ein Feld mit Index versieht. In Delphi mit ODBC kann ich mir die testm4.dbf anzeigen lassen. Das Feld Anschrift kann ich mir in TDBMemo anzeigen lassen. Beim Erfassen und ändern der Daten gibt es jedoch derzeit Probleme. Es liegt also hier eine einfache *.dbf mit Index und einem Memofeld vor. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Es gibt übrigens nicht nur VFP9. Die gab es in 4 Versionen: VFP9 VFP9 mit SP1 VFP9 mit SP2 VFP9 als Komplettdownload aus 2008. Sollte zwar identisch mit SP2 sein, war aber noch etwas aktueller. Die englische Version hatte dann nochmal einen anderen Versionsstand. Interessant ist diese information nur, weil sich das Dateihandling und das Verhalten der Runtime je nach Version unterscheidet. Wäre als hilfreich zu prüfen, ob die Runtime mit der Vollversion von VFP9, mit der die Anwendung erstellt wurde, auch übereinstimmt. Bei einigen Anwendungen gab es den Effekt, dass zwar die dbf geschlossen wurde, aber der Dateihandler für die cdx Datei noch offen blieb. Auch bei Programmende der VPF Anwendung. Es gibt im Hintergrund noch eine VFP Runtime, die unabhängig von der Anwendung laufen kann, wenn die sich nicht selbst bei Programmende mit beendet. D.h. die kann eine Datei noch blockieren, auch wenn die Anwendung diese eigentlich schon geschlossen hat. Das ODBC hat ein kleines bischen anderes Dateiformat als VFP9 ohne SP2. Es hab hierfür einen eigenen ODBC Update Treiber. Datei war die vfpoledb.exe aus 2006. Damit konnten dann alle Eigenheiten der dfb Struktur verwendet werden. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Kenne das aus früheren Zeiten mit der BDE. Dort konnte es auch passieren, dass Dateien gesperrt waren und blieben, bis man alle Programme, die irgendwie die BDE nutzten, beendet hatte. Beim "Killen" per Taskmanager konnten noch Handles offen bleiben, dann half nur ein Rechnerneustart. Solange es sich beim Programm nicht um eine Mehrplatzsystem handelt, könnte es einen Versuch wert sein, den Rechner neu zu starten und dann sofort aus Delphi heraus auf die Dateien zuzugreifen, ohne dass das FoxPro-Programm gestartet wurde. Ist der Fehler dann weg, liegt es am oben beschriebenen Fehler. Andernfalls müssen alle Rechner mal neu gestartet werden ohne das FoxPro-Programm zu starten. Kann etwas mühselig werden, ist aber eventuell ein Ansatz zur Fehlereingrenzung. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
|
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Zitat:
Mein Denkfehler war im Grid das Memofeld anzuzeigen. Wenn der Cursor auf das Feld sprang und wieder heraus ging, bekam ich einen ODBC-Fehler wegen einem Nullwert des Memofeldes. Lösung: Keine Anzeige des Memofeldes im Grid. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Per se sollte es aber eigentlich keinen Fehler geben, wenn ein Memo-Feld sich mit NULL im Grid befindet.
|
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Oder muss ich den Fehler anders interpretieren. |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
Wie gesagt, "eigentlich". :stupid:
Von Seite des Grids, sollte es dennoch mit NULL umgehen können. Wenn datenbankseitig ein Feld als NOT-NULL deklariert sein sollte und das clientseitig auch beachtet wird (also das Required im TField von der DB-Query-Komponente gesetzt wird), dann wäre das eine andere Sache ... hat dann aber nichts mit dem Grid zu tun, bzw. Delphi/Grid sind dann nicht Schuld. Aber normal prüfen die meisten DB-Query-Komponenten das Required erst im BeforePost, aber nicht beim Laden/Open/Refresh. :gruebel: |
AW: Fehlermeldung: Zugriff auf DBF gesperrt
:roll:
Jetzt arbeite ich 30 Jahre mit Foxpro/VFP und dann beherrsche ich die Grundlagen nicht. Man muss in der *.dbf beim Feld Anschrift bei NULL einen Haken setzen und dann schnurrt alles. Ich dachte immer beim Haken darf das Feld nicht NULL sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz