2010-12-28 4 views
1

ArcGIS Desktop/Server 용 사용자 지정 지오 프로세싱 도구를 만들고 있습니다. 도구를 실행하는 동안 dbf 파일을 만들고 커서를 사용하여 내용에 액세스합니다. 이 파일의 잠금은 도구 실행이 끝난 후에도 유지되며 ArcMap/ArcCatalog를 다시 시작해야만 제거 할 수 있습니다. 스키마 잠금을 제거하는 프로그래밍 방식이 있습니까?ArcObjects를 사용하여 액세스 한 dbf 파일에서 스키마 잠금을 어떻게 제거합니까?

아래 코드를 한 줄씩 살펴 보았습니다. ITable ArcObject를 생성하면 ".sr.lock"로 끝나는 잠금 파일이 생성되고 ICursor 객체를 생성하면 dbf 파일과 동일한 디렉토리에 ".rd.lock"으로 끝나는 잠금 파일이 생성됩니다. 맨 아래에있는 ReleaseComObject 메서드를 사용하지 않으면 두 파일이 모두 유지됩니다. 두 번째 잠금 파일을 커서 제거 된 있지만 테이블과 관련된 하나 가져올 수 없습니다. dbf 파일을 삭제하더라도 잠금 파일은 유지되고 ArcMap/ArcCatalog가 닫힐 때까지 상위 디렉토리를 삭제할 수 없습니다.

해결책을 암시하는 코드 here이 있지만 해당 코드의 요소가 누락되었습니다.

public Dictionary<Int32, Dictionary<Int32,Double>> GetTabulatedAreaDict() 
    { 
     IGPUtilities3 gpUtil = new GPUtilitiesClass(); 
     Geoprocessor gp = new Geoprocessor(); 

     //Tabulate Area 
     string tableName = "lcAreaByRru.dbf"; 
     string tablePath = this.tempDirPath + "\\" + tableName; 
     TabulateArea tabulateArea = new TabulateArea(); 
     tabulateArea.in_zone_data = this.rruPath; 
     tabulateArea.zone_field = "VALUE"; 
     tabulateArea.in_class_data = this.rasterValue.GetAsText(); 
     tabulateArea.class_field = "VALUE"; 
     tabulateArea.out_table = tablePath; 
     gp.Execute(tabulateArea, null); 

     // Extract information from table 
     IWorkspaceFactory wsf = new ShapefileWorkspaceFactoryClass(); 
     IWorkspace ws = wsf.OpenFromFile(this.tempDirPath, 0); 
     IFeatureWorkspace fws = (IFeatureWorkspace)ws; 
     ITable taTable = fws.OpenTable(tableName);// Creates .sr.lock file 
     //ITable taTable = gpUtil.OpenTableFromString(tablePath); // Creates .sr.lock file 
     ICursor tableRows = taTable.Search(null, false); // Creates .rd.lock file 
     IRow tableRow = tableRows.NextRow(); 
     this.tabulatedAreaDict = new Dictionary<Int32, Dictionary<Int32, Double>>(); 
     while (tableRow != null) 
     { 
      Int32 id = (Int32)tableRow.get_Value(1); // Feature ID 
      Dictionary<Int32, Double> valueAreaDict = new Dictionary<Int32, Double>(); 
      for (int i = 2; i < tableRow.Fields.FieldCount; i++) 
      { 
       int key = int.Parse(tableRow.Fields.get_Field(i).Name.Split('_')[1]); 
       double value = (double)tableRow.get_Value(i); 
       valueAreaDict.Add(key, value); 
      } 
      this.tabulatedAreaDict.Add(id, valueAreaDict); 
      tableRow = tableRows.NextRow(); 
     } 

     System.Runtime.InteropServices.Marshal.ReleaseComObject(tableRows); //Removes .rd.lock file 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(taTable); // Does not remove .sr.lock file 

     return this.tabulatedAreaDict; 
    } 

는 업데이트 :

은 내가 DBF가 고정되지 않았 음을 발견하지만, DBF와 관련된 길잃은 잠금 파일이 있었다. ArcCatalog가 실행 중일 때 테이블을 삭제할 수 있었지만 dbf가 포함 된 폴더를 삭제할 수 없었습니다. ArcCatalog GUI 또는 Windows 탐색기를 사용할 때 상위 디렉토리를 삭제하지 못했습니다. Delete_management geoprocessing 도구를 사용하여 폴더를 삭제할 수있었습니다.

비 ArcObjects 메서드를 사용하여 dbf에 액세스하는 방법을 고려해 보았지만 나중에 피쳐 클래스와 지오 데이터베이스에서이 문제가 발생한다는 것을 알았으므로 ArcObjects를 계속 사용하는 것이 가장 좋습니다.

이 문제를 더 잘 관리하기 위해 스크래치 작업 영역 (시스템 temp가 지정되지 않은 경우)에 테이블을 만든 다음 액세스가 끝나면 파일을 올바른 대상으로 이동하려고합니다.

답변

1

게시 한 코드가 평소와 다른 점이 없지만 작업 공간 팩토리와 지오 프로세서를 모든 메서드 호출에서 인스턴스화하는 대신 글로벌 수준으로 끌어 올 수 있습니다. 지오 프로세서를 사용하는 일부 잠금 문제가 발생했다는 것을 기억합니다. 따라서 사용하지 않으려 고 가능한 한 직접 arcobjects로 작업하십시오.

gis.stackexchange.com에서이 질문을하는 것이 좋습니다. 적어도 그 장소를 자주 찾는 ArcObjects 전문가를 알고 있습니다.

+0

감사합니다. gis.stackexchange.com을 사용해 보겠습니다. 클래스 레벨에서 지오 프로세서를 사용했지만 도움이되기를 바라는 방식으로 지오 프로세서를 옮겨 보았습니다. ArcObject ITable 사용시 잠금이 발생하고 지오 프로세서의 dbf 출력이 잠기지 않습니다. 잠금을 생성 한 ArcObjects만이 close() 메소드를 가지고 있다면! –

+0

기존 질문 : http://gis.stackexchange.com/questions/3580/problems-closing-dbf-table-edited-with-arcobjects/4731#4731 –

관련 문제