Hapus kunci pada kelas fitur

11

Ketika saya mencoba untuk menghapus kelas fitur, setelah atau selama penggunaan aplikasi mesin Arcgis yang menggunakan kelas fitur yang sama, saya mendapat kesalahan terkait kunci, jadi saya tidak bisa mendapatkan kunci ini sampai saya me-restart komputer.

saya ingin tahu cara untuk menghapus kunci menggunakan arcpy atau arcobjects 10.1, itu akan menjadi sempurna jika saya bisa mendapatkan kunci di dalam aplikasi arcengine yang juga mengunci geodatabase, saya telah melihat posting berbeda di SE tentang kunci tetapi tidak ada dari mereka memberikan solusi untuk membebaskan kunci menggunakan ArcObjects.

geogeek
sumber
1
Saya punya pertanyaan serupa beberapa waktu lalu ( gis.stackexchange.com/q/28977/8104 ). Saya tidak dapat menemukan jawaban tentang kunci, meskipun ada informasi bagus tentang menghapus objek memori.
Aaron

Jawaban:

12

Jika Anda menggunakan skrip Arcpy, masalah kunci data menjadi semakin bermasalah dengan 10.1.

Jika kunci dibuat oleh kode Anda, maka Anda tidak membersihkan diri sendiri. Lepaskan semua referensi ke kelas fitur, ruang kerja, kursor, dll. Kunci dihapus ketika Anda tidak lagi memiliki referensi ke objek yang dikunci.

Ya, memang seharusnya begitu, tetapi jarang. Biasanya kode akan bekerja sesekali, tetapi sering kali crash secara tidak dapat dijelaskan di tempat yang berbeda.

Masalahnya tampaknya kunci hanya dibiarkan duduk di sana `untuk sementara waktu ', tetapi kode berjalan jauh lebih cepat daripada kecepatan di mana kunci dihapus. Namun, beberapa alat Arc inbuilt tampaknya memaksa kunci untuk dibersihkan sesuai permintaan (karena kunci berlaku untuk seluruh GDB sekaligus, kunci akan mencegah Anda bekerja dengan salah satu Kelas Fitur yang terkandung). Alat-alat ini adalah arcpy.Compact_management () dan arcpy.Exists ().

Berikut adalah sedikit fungsi yang saya gunakan dalam kode saya yang telah meningkatkan keandalan secara dramatis (untuk skrip yang membuat dan mengedit beberapa GDB dan Kelas Fitur di dalamnya):

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

Ini digunakan dengan hanya meneruskan jalur workspace (GDB) ke fungsi, dan harus dilakukan setelah setiap operasi pada workspace (mis. Penciptaan GDB) atau Kelas Fitur di dalam ruang kerja (yaitu Cursors, menambahkan bidang, perhitungan, dll.) . Misalnya (ditampilkan di sini sebagai skrip mandiri, dengan fungsi di atas; untuk menggunakan fungsi, salin dan tempel di antara impor dan program yang sebenarnya, seperti yang ditunjukkan di sini):

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....
StacyR
sumber
3
Kompak tidak berfungsi jika ada kunci. Memang akan meningkatkan kinerja ketika Anda menjalankan banyak operasi FGDB, tetapi dengan biaya runtime sendiri.
Michalis Avraam
hanya ingin tahu mengapa ada dua kali Ada, maksud saya pernyataan ketiga jika semua () di clearWSLocks?
makak
Saya bisa setuju, saya belum menemukan ini untuk menghapus kunci. :( dan saya telah mencoba banyak hal berbeda sejauh ini.
Vidar
7

Jika kunci dibuat oleh kode Anda, maka Anda tidak membersihkan diri sendiri. Lepaskan semua referensi ke kelas fitur, ruang kerja, kursor, dll. Kunci dihapus ketika Anda tidak lagi memiliki referensi ke objek yang dikunci.

blah238
sumber
1
Saya tahu utas ini cukup lama, tetapi saya mengalami masalah karena saya bisa menghapus FGDB dalam arcpy. Apa yang sebenarnya Anda maksud dengan "Lepaskan semua referensi ke kelas fitur, ruang kerja, kursor, dll." Bagaimana saya akan merilis referensi yang disebutkan?
GeoJohn