Entfernen Sie die Sperre für die Feature-Class


11

Wenn ich versuche, eine Feature-Class zu löschen, habe ich nach oder während der Verwendung einer Arcgis Engine-App, die dieselbe Feature-Class verwendet, einen Fehler bezüglich der Sperre erhalten, sodass ich diese Sperre erst nach einem Neustart des Computers nutzen kann.

Ich würde gerne wissen, wie man Sperren mit arcpy oder arcobjects 10.1 entfernen kann. Es wäre perfekt, wenn ich die Sperre in der Arcengine-App nutzen könnte, die auch die Geodatabase sperrt. Ich habe in SE verschiedene Posts über Sperren gesehen, aber niemand von ihnen bietet die Lösung für freie Sperren mit ArcObjects.


1
Ich hatte vor einiger Zeit eine ähnliche Frage ( gis.stackexchange.com/q/28977/8104 ). Ich konnte keine Antwort zu den Sperren finden, obwohl es gute Informationen zum Löschen in Speicherobjekten gab.
Aaron

Antworten:


12

Wenn Sie Arcpy-Skripte verwenden, sind Probleme mit der Datensperre mit 10.1 noch problematischer geworden.

Wenn die Sperren von Ihrem Code erstellt werden, bereinigen Sie nicht nach sich selbst. Geben Sie alle Verweise auf Feature-Classes, Arbeitsbereiche, Cursor usw. frei. Die Sperren werden entfernt, wenn Sie keine Verweise mehr auf die gesperrten Objekte haben.

Nun, so sollte es funktionieren, aber das tut es selten. Normalerweise funktioniert ein Code gelegentlich, stürzt jedoch häufig unerklärlich an verschiedenen Stellen ab.

Das Problem scheint zu sein, dass Sperren nur "für eine Weile" dort sitzen bleiben, aber der Code läuft viel schneller als die Geschwindigkeit, mit der die Sperren entfernt werden. Einige der integrierten Arc-Tools scheinen jedoch das Löschen von Sperren bei Bedarf zu erzwingen (da Sperren für alle GDBs gleichzeitig gelten, verhindert eine Sperre, dass Sie mit einer der enthaltenen Feature-Classes arbeiten können). Diese Tools sind arcpy.Compact_management () und arcpy.Exists ().

Hier ist eine kleine Funktion, die ich in meinem Code verwende und die Zuverlässigkeit erheblich erhöht hat (für ein Skript, das mehrere GDBs und Feature-Classes in ihnen erstellt und bearbeitet):

def clearWSLocks(inputWS):
  '''Attempts to clear locks on a workspace, returns stupid message.'''
  if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
    return 'Workspace (%s) clear to continue...' % inputWS
  else:
    return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS

Es wird verwendet, indem einfach der Pfad des Arbeitsbereichs (GDB) an die Funktion übergeben wird, und sollte nach jeder Operation entweder im Arbeitsbereich (dh GDB-Erstellung) oder in Feature-Classes im Arbeitsbereich (dh Cursor, Hinzufügen von Feldern, Berechnungen usw.) ausgeführt werden. . Zum Beispiel (hier als eigenständiges Skript mit der Funktion oben angezeigt; um die Funktion zu verwenden, kopieren Sie sie und fügen Sie sie zwischen den Importen und dem eigentlichen Programm ein, wie hier gezeigt):

import arcpy

def clearWSLocks(inputWS):
  '''Attempts to clear locks on a workspace, returns stupid message.'''
  if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
    return 'Workspace (%s) clear to continue...' % inputWS
  else:
    return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS

GDBpath = 'C:/Temp/'
GDBname = 'Test.gdb'
tableName = 'SweetFC'
arcpy.CreateFileGDB_management(GDBpath, GDBname)
print(clearWSLocks(GDBpath+GDBname))
arcpy.CreateTable_management(GDBpath+GDBname, tableName)
print(clearWSLocks(GDBpath+GDBname))
# etc....

3
Compact funktioniert nicht, wenn ein Schloss vorhanden ist. Dies erhöht zwar die Leistung, wenn Sie viele Operationen einer FGDB ausführen, jedoch auf Kosten der eigenen Laufzeit.
Michalis Avraam

Ich frage mich nur, warum es zwei Exists gibt. Ich meine die dritte Aussage in if all () in clearWSLocks.
Makak

Ich kann zustimmen, ich habe dies nicht gefunden, um Schlösser zu löschen. :( und ich habe bisher viele verschiedene Dinge ausprobiert.
Vidar


7

Wenn die Sperren von Ihrem Code erstellt werden, bereinigen Sie nicht nach sich selbst. Geben Sie alle Verweise auf Feature-Classes, Arbeitsbereiche, Cursor usw. frei. Die Sperren werden entfernt, wenn Sie keine Verweise mehr auf die gesperrten Objekte haben.


1
Ich weiß, dass dieser Thread ziemlich alt ist, aber ich habe ein Problem damit, eine REA in arcpy löschen zu können. Was genau meinen Sie mit "Alle Verweise auf Feature-Classes, Arbeitsbereiche, Cursor usw. freigeben". Wie würde ich vorgehen, um die genannten Referenzen freizugeben?
GeoJohn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.