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가 지정되지 않은 경우)에 테이블을 만든 다음 액세스가 끝나면 파일을 올바른 대상으로 이동하려고합니다.
감사합니다. gis.stackexchange.com을 사용해 보겠습니다. 클래스 레벨에서 지오 프로세서를 사용했지만 도움이되기를 바라는 방식으로 지오 프로세서를 옮겨 보았습니다. ArcObject ITable 사용시 잠금이 발생하고 지오 프로세서의 dbf 출력이 잠기지 않습니다. 잠금을 생성 한 ArcObjects만이 close() 메소드를 가지고 있다면! –
기존 질문 : http://gis.stackexchange.com/questions/3580/problems-closing-dbf-table-edited-with-arcobjects/4731#4731 –