ลบล็อคในระดับคุณลักษณะ


11

เมื่อฉันพยายามลบคลาสฟีเจอร์หลังจากหรือระหว่างการใช้งานแอป Arcgis engine ซึ่งใช้คลาสฟีเจอร์เดียวกันฉันพบข้อผิดพลาดเกี่ยวกับการล็อคดังนั้นฉันจึงไม่สามารถล็อคได้จนกว่าจะรีสตาร์ทคอมพิวเตอร์

ฉันต้องการทราบวิธีลบการล็อกโดยใช้ arcpy หรือ arcobjects 10.1 มันจะสมบูรณ์แบบถ้าฉันสามารถขี่ล็อกในแอพ arcengine ซึ่งยังล็อคฐานข้อมูลทางภูมิศาสตร์ฉันได้เห็นโพสต์ที่แตกต่างกันใน SE เกี่ยวกับล็อค แต่ไม่มีใคร ของพวกเขาให้โซลูชั่นเพื่อล็อคฟรีโดยใช้ ArcObjects


1
ฉันมีคำถามที่คล้ายกันซักพัก ( gis.stackexchange.com/q/28977/8104 ) ฉันไม่สามารถหาคำตอบเกี่ยวกับการล็อกได้แม้ว่าจะมีข้อมูลที่ดีเกี่ยวกับการลบในวัตถุหน่วยความจำ
แอรอน

คำตอบ:


12

หากคุณกำลังใช้ Arcpy สคริปต์ประเด็นล็อคข้อมูลที่ได้กลายเป็นมากยิ่งขึ้นมีปัญหากับ 10.1

หากรหัสของคุณถูกล็อคคุณจะไม่ต้องล้างข้อมูลด้วยตัวเอง ปล่อยการอ้างอิงทั้งหมดไปที่คลาสคุณลักษณะพื้นที่ทำงานเคอร์เซอร์ ฯลฯ การล็อกจะถูกลบออกเมื่อคุณไม่มีการอ้างอิงไปยังวัตถุที่ถูกล็อคอีกต่อไป

นั่นเป็นวิธีที่มันควรจะทำงาน แต่ก็ไม่ค่อยได้ผล โดยปกติรหัสจะทำงานเป็นครั้งคราว แต่มักจะขัดข้องอย่างลึกลับในสถานที่ต่างกัน

ปัญหาดูเหมือนจะเป็นที่ล็อคเพิ่งนั่งอยู่ที่นั่น `ในขณะที่ 'แต่รหัสทำงานเร็วกว่าความเร็วที่ล็อคจะถูกลบออก อย่างไรก็ตามเครื่องมือ Arc inbuilt บางส่วนดูเหมือนจะบังคับให้ล็อคการล้างตามความต้องการ (เนื่องจากการล็อกจะใช้กับ GDB ทั้งหมดในครั้งเดียวการล็อคจะป้องกันไม่ให้คุณทำงานกับคลาสคุณลักษณะใด ๆ ที่มีอยู่) เครื่องมือเหล่านี้คือ arcpy.Compact_management () และ arcpy.Exists ()

นี่คือฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่ฉันใช้ภายในรหัสของฉันที่เพิ่มความน่าเชื่อถือได้อย่างมาก (สำหรับสคริปต์ที่สร้างและแก้ไข GDB และคลาสคุณลักษณะภายในหลายรายการ):

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

มันถูกใช้โดยเพียงแค่ผ่านเส้นทางพื้นที่ทำงาน (GDB) ไปยังฟังก์ชั่นและควรจะทำหลังจากการดำเนินการทุกครั้งในพื้นที่ทำงาน (เช่นการสร้าง GDB) หรือ Class Classes ภายในพื้นที่ทำงาน (เช่นเคอร์เซอร์เพิ่มเขตข้อมูลการคำนวณ ฯลฯ ) . ตัวอย่างเช่น (แสดงที่นี่เป็นสคริปต์แบบสแตนด์อโลนที่มีฟังก์ชันอยู่ด้านบนเพื่อใช้ฟังก์ชันคัดลอกและวางระหว่างการนำเข้าและโปรแกรมจริงดังแสดงที่นี่):

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
ขนาดกะทัดรัดไม่ทำงานหากมีการล็อค มันจะเพิ่มประสิทธิภาพอย่างแน่นอนเมื่อคุณรัน FGDB จำนวนมาก แต่ต้องเสียค่าใช้จ่ายในการใช้งานจริง
Michalis Avraam

เพียงแค่สงสัยว่าทำไมมีสองครั้งอยู่ฉันหมายถึงคำสั่งที่สามถ้าหากทั้งหมด () ใน clearWSLocks?
makak

ฉันเห็นด้วยฉันไม่พบสิ่งนี้เพื่อล้างล็อค :( และฉันได้ลองทำสิ่งต่าง ๆ มากมายแล้ว
Vidar

8

ไฟล์ฐานข้อมูลภูมิศาสตร์มีการล็อค 3 ประเภท

  1. SR - ล็อคคี
  2. RD - ล็อคการอ่าน
  3. ED - แก้ไขล็อค

โซลูชั่นที่นำเสนอโดย @StacyRจะทำงานในทุกสถานการณ์ยกเว้นพิเศษแก้ไขล็อค (ED) ตามเอกสารความช่วยเหลือ ArcGIS

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//003n0000007t000000


7

หากรหัสของคุณถูกล็อคคุณจะไม่ต้องล้างข้อมูลด้วยตัวเอง ปล่อยการอ้างอิงทั้งหมดไปที่คลาสคุณลักษณะพื้นที่ทำงานเคอร์เซอร์ ฯลฯ การล็อกจะถูกลบออกเมื่อคุณไม่มีการอ้างอิงไปยังวัตถุที่ถูกล็อคอีกต่อไป


1
ฉันรู้ว่ากระทู้นี้ค่อนข้างเก่า แต่ฉันมีปัญหากับความสามารถในการลบ FGDB ภายใน arcpy คุณหมายถึงอะไรอย่างแท้จริงโดย "ปล่อยการอ้างอิงทั้งหมดไปที่คลาสคุณลักษณะพื้นที่ทำงานเคอร์เซอร์ ฯลฯ " ฉันจะปล่อยการอ้างอิงดังกล่าวอย่างไร
GeoJohn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.