首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArcObjects ExcelWorkspaceFactory不会发布Excel文件

ArcObjects ExcelWorkspaceFactory不会发布Excel文件
EN

Stack Overflow用户
提问于 2015-06-11 14:28:47
回答 2查看 422关注 0票数 0

我正在使用ArcObjects将xls和csv文件的批处理导入到地理数据库中。该部分工作正常,但导入之后,我想删除该文件。但是,这不起作用,因为文件仍然是打开的。所使用的任何接口都不会从IDisposable下降或公开一个Close方法。我还尝试使用ComReleaser来强制关闭我打开的所有COM对象,但这也不起作用。我看到的关于关闭连接的唯一事情是,我需要删除对这些类型的所有引用,并强制垃圾收集,这是违反标准的(这是有充分理由的)。

下面是用于excel导入的方法:

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 13:53:34

好的,我用ComReleaser对象疯狂地工作了。基本上,我扫描了我的代码,每当我从ArcObjects中找到任何东西时,我都会附加一个ComReleaser来管理它。基本上,我只是在做手动内存管理。无论如何,只要发布了EVERYTHING (即使它看起来不相关),它似乎就会释放该文件。正如上面的注释所述,ComReleaser类应该在幕后使用ReleaseComObject,因此路径也应该工作。

票数 0
EN

Stack Overflow用户

发布于 2015-10-14 05:18:38

我猜在你的样本中是由ITable引起的。表对象将锁定工作表。至少,它在其他地理数据库中做到了这一点。

不确定CopyAllFeatures做什么,但也要注意ICursor。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30783703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档