Exclusiv abfragen

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
STEPHAN
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 29. Mai 2008 20:46
Hat sich bedankt: 1 Mal

Exclusiv abfragen

Beitrag von STEPHAN »

Hi,

gibt es eine Möglichkeit zu prüfen, ob man eine DBF exklusiv öffnen könnte (oder nur shared), ohne sie exklusiv zu öffnen?

Wenn ich sie kurz exklusiv öffne, dann blocke ich sie unnötig für andere, das soll ich vermeiden.

Vielen Dank

Stephan
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Herbert »

IF Flock()....
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Jan »

Herbert,

damit ist ja leider nichts gewonnen. Ob ich jetzt versuche die dbf exklusiv zu offnen, oder ich sie shared öffne und dann ein Locking versuche - ich blockiere die dbf im Erfolgsfall erstmal. Was ja gerade vermieden werden soll.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Wolfgang Ciriack »

Ich denke, dass das Flock und ein im Erfolgsfall sofortiges wieder freigeben so schnell geht, dass das nicht stört.
Die Frage ist aber, was will ich mit der Erkenntnis, dass die Datenbank vor einer Zeit xx exclusiv zu öffnen ging, anfangen.
Kurze Zeit später kann das ja schon wieder anders sein ?
Viele Grüße
Wolfgang
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Rolf Ramacher »

Ich mache das so

Code: Alles auswählen

#Define CRLF Chr(13)+ Chr(10)
Function Netz_Use()
Local lJa:=.f.
PARAMETERS Datei, ex_use, cTitel, Info, Name

If Info="alias"
	If ex_use && exclusive
		Use &Datei New Exclusive Alias Name
	EndIf
Else
	If ex_use && exclusive
		Use &Datei New Exclusive
	EndIf
EndIf
If NetErr()
	lJa:=.f.
	Msgbox("Die Datenbank "+Datei+" ist in Benutzung"+CRLF+;
         "Das Programm an allen Stationen beenden und erneut starten",cTitel)
Else
	lJa:=.t.
EndIf
Return lJa
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Tom »

Es kann ja zwei "allgemeine" Gründe dafür geben, warum sich eine Tabelle nicht exklusiv öffnen ließe: a) sie ist bereits exklusiv in Benutzung und b) sie ist im "shared"-Modus geöffnet. Ergänzend gäbe es noch die Möglichkeiten, dass eine Tabelle überhaupt nicht vorhanden ist oder sie aufgrund der Rechtesituation im Netz nicht geöffnet werden kann. Ohne Risiko eines Laufzeitfehlers lässt sich all das m.E. nur so abfangen:

Code: Alles auswählen

#include 'fileio.ch'
FUNCTION CouldBeUsedExclusive(cDbfName)
LOCAL nHandle
IF !File(cDbfName) // nicht vorhanden
  RETURN .F.
ENDIF
nHandle := FOpen(cDbfName,FO_EXCLUSIVE)
IF nHandle > 0 // es gibt ein Handle
  FClose(nHandle)
  RETURN .T.
ENDIF
RETURN .F.
Auch hier hat man, obwohl die Operation nur Millisekunden beanspruchen dürfte, möglicherweise einen konkurrierenden Zugriff erzeugt, der anderswo problematisch werden könnte. Außerdem gäbe auch das nur einen Snapshot - schon Sekundenbruchteile später kann die Situation eine andere sein. Deshalb arbeitet man in solchen Fällen ja tatsächlich so:

Code: Alles auswählen

USE (cDbfName) EXCLUSIVE NEW
IF NetErr()
 * ging nicht
Gegenfrage: Wozu brauchst Du das? Warum will man zu einem Zeitpunkt, an dem die Tabelle nicht geöffnet werden soll, prüfen, ob sie geöffnet werden könnte?
Zuletzt geändert von Tom am Mo, 02. Nov 2015 16:54, insgesamt 1-mal geändert.
Herzlich,
Tom
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Exclusiv abfragen

Beitrag von ramses »

Hi

ja es gibt eine einfache Möglichkeit abzufragen welche DBF bereits auf anderen PC's geöffnet sind.

Verwende den Advantage Database Server und die ADSDBE

mit der Funktion AdsMgGetOpenTables() lassen sich die zur Zeit offenen/verwendeten DBF's abfragen.


Cu Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Herbert »

Jan hat geschrieben:damit ist ja leider nichts gewonnen. Ob ich jetzt versuche die dbf exklusiv zu offnen, oder ich sie shared öffne und dann ein Locking versuche - ich blockiere die dbf im Erfolgsfall erstmal. Was ja gerade vermieden werden soll.
Wenn ich wissen will, ob eine Tabelle geblockt werden kann, gibt's keine andere Lösung. Und die Bemerkung von Wolfgang passt. Dazu kommt, dass so ein Test ja nicht aus Vergnügen erfolgt, sondern an passender Stelle. Es gibt schliesslich Momente, wo Andere nicht in einer Tabelle hineinfummeln dürfen.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Jan »

Herbert,

leider ist mit Wolfgangs Idee nichts gewonnen. Denn wenn ich ein FLock() machen möchte, muß ich die dbf ersteinmal geöfnet haben. Damit ist die dann für das exklusive Öffnen in dem anderen Modul wiederum gesperrt.

Ich denke das Stephan gerne den Modus auslesen würde, ohne irgend ein Use auf die dbf machen zu müssen. Aber solange er nichts mehr dazu sagt ist das alles vage Vermutung.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Herbert »

Hast schon recht, Jan. Nur wie auch Tom bemerkt, was nützt eine Abfrage, wenn Millisekunden später ein anderer Zustand sein kann?
Also muss ich blockieren und sofort entscheiden, was weiter gehen soll. Die anderen User, welche zugreifen wollen, müssen entsprechende Meldungen erhalten, ist auch klar, da ja ein Grund des Exklusivzugriffs bestehen muss.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Exclusiv abfragen

Beitrag von Tom »

Theoretisch müsste es die Möglichkeit geben, auf Betriebssystemebene zu prüfen, ob eine Datei shared/exclusive geöffnet ist, allerdings bestenfalls lokal.

Auch das wäre aber nur ein Snapshot. Genau wie " AdsMgGetOpenTables()", lieber Carlo. :wink:
Herzlich,
Tom
Antworten