ArcObjects ExcelWorkspaceFactory不会发布Excel文件

时间:2015-06-11 14:28:47

标签: c# com arcobjects

我正在使用ArcObjects设置从xls和csv文件到地理数据库的批量导入。该部分工作正常,但导入后,我想删除该文件。但是,这不起作用,因为文件仍处于打开状态。没有使用的接口来自IDisposable或公开Close方法。我也尝试使用ComReleaser来强制关闭我打开的所有C​​OM对象,但这也不起作用。我看到的与关闭连接有关的唯一事情是我需要删除对这些类型的所有引用并强制进行垃圾收集,这违反标准(有充分理由)。

这是我用于excel导入的方法:

private ServiceResult<IEnumerable<int>> InsertControlsFromXls(FileInfo xlsFile) {
  ServiceResult<IEnumerable<int>> result = new ServiceResult<IEnumerable<int>>();


  using(ComReleaser comReleaser = new ComReleaser()) {

    //read in the spreadsheet as a workspace
    Type factoryType = Type.GetTypeFromProgID("esriDataSourcesOleDB.ExcelWorkspaceFactory");
    IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);

    IWorkspace workspace = workspaceFactory.OpenFromFile(xlsFile.FullName, 0);
    IFeatureWorkspace remoteWorkspace = (IFeatureWorkspace)OpenWorkspace();
    IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
    IWorkspaceEdit2 session = (IWorkspaceEdit2)remoteWorkspace;
    IMultiuserWorkspaceEdit multiuserWorkspace = (IMultiuserWorkspaceEdit)remoteWorkspace;

    comReleaser.ManageLifetime(workspaceFactory);
    comReleaser.ManageLifetime(workspace);
    comReleaser.ManageLifetime(remoteWorkspace);
    comReleaser.ManageLifetime(featureWorkspace);
    comReleaser.ManageLifetime(session);
    comReleaser.ManageLifetime(multiuserWorkspace);

    try {
      //session.StartEditing(false);
      multiuserWorkspace.StartMultiuserEditing(esriMultiuserEditSessionMode.esriMESMVersioned);
      session.StartEditOperation();

      Match tableMatch = _tableRecReg.Match(xlsFile.Name);
      string tableName = tableMatch.Success ? tableMatch.Groups[1].Value + "$" : "Sheet1$";

      ITable table = featureWorkspace.OpenTable(tableName);

      result.Value = CopyAllFeatures(table, remoteWorkspace.OpenFeatureClass(AppSettings.DefaultSchema + "." + ControlMap.TableName));

      session.StopEditOperation();
      session.StopEditing(true);

    } catch {
      session.AbortEditOperation();
      session.StopEditing(false);
      throw;
    }
  }

  return result;
}

2 个答案:

答案 0 :(得分:0)

好的,我通过使用ComReleaser对象进行hog-wild来实现它。基本上,我扫描了我的代码,每当我发现任何来自ArcObjects的内容时,我附加了一个ComReleaser来管理它。基本上,我只是做手动内存管理。无论如何,只要 EVERYTHING 被释放(即使它似乎不相关),它似乎确实会释放文件。如上面的注释中所述,ComReleaser类应该使用ReleaseComObject,因此该路径也可以正常工作。

答案 1 :(得分:0)

我猜你的样本中是ITable导致的。表对象将锁定表单。至少,它在其他地理数据库中执行此操作。

不确定CopyAllFeatures的功能,但也要留意ICursor。