【AE】SDE图层断开后重新连接的解决方法

问题描述
      大家在程序中使用SDE图层时,是不是经常碰到这种情况:因网络连接中断而导致SDE图层不见了。即使之后网络连接上了,SDE图层并不会自动重新显示。

解决方法
    在网上没找到相关资料。好吧,咱自力更生,好好研究研究AE的帮助文档,想来应该与SdeWorkspace有关,看了相关的接口,没发现什么。转念一想,SdeWorkspace 不都是由SdeWorkspaceFactory创建的嘛,查看SdeWorkspaceFactoryClass,果然发现了秘密,其实现了一个名为IWorkspaceFactoryStatus的接口。该接口的详细说明如下

IWorkspaceFactoryStatus Interface


Provides access to members that manage workspace status information. Product Availability

Available with ArcGIS Engine, ArcGIS Desktop, and ArcGIS Server.


Members
OpenAvailableWorkspaceMakes an attempt to open a new instance of a workspace that is esriWCSDown but has since become esriWCSAvailable.
PingWorkspaceStatusChecks if the status of an esriWCSDown workspace has changed.
WorkspaceStatusRetrieve the workspace status information for all currently opened workspaces

  1. // 重新连接SDE图层  【dxcgis】 
  2. private void ReconnectSDELayer(IFeatureLayer featureLayer) 
  3.           IDataset dataset = featureLayer as IDataset; 
  4.           IWorkspaceFactory workspaceFactory = dataset.Workspace.WorkspaceFactory; 
  5.  
  6.           IWorkspaceFactoryStatus workspaceFactoryStatus = workspaceFactory as IWorkspaceFactoryStatus; 
  7.           IEnumWorkspaceStatus enumWorkspaceStatus = workspaceFactoryStatus.WorkspaceStatus; 
  8.           IWorkspaceStatus workspaceStatus = null
  9.           while ((workspaceStatus = enumWorkspaceStatus.Next()) != null
  10.           { 
  11.               if (dataset.Workspace.Equals(workspaceStatus.Workspace)) 
  12.               { 
  13.                   break
  14.               } 
  15.           } 
  16.  
  17.           // 检测SDE连接是否断开  
  18.           if (workspaceStatus != null && 
  19.                workspaceStatus.ConnectionStatus == esriWorkspaceConnectionStatus.esriWCSDown) 
  20.           { 
  21.               IWorkspaceStatus pingedStatus = workspaceFactoryStatus.PingWorkspaceStatus(dataset.Workspace); 
  22.               if (pingedStatus.ConnectionStatus == esriWorkspaceConnectionStatus.esriWCSAvailable) 
  23.               { 
  24.                   IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactoryStatus.OpenAvailableWorkspace(pingedStatus); 
  25.                   featureLayer.FeatureClass = featureWorkspace.OpenFeatureClass(featureLayer.FeatureClass.AliasName);                      
  26.               } 
  27.               else if (pingedStatus.ConnectionStatus == esriWorkspaceConnectionStatus.esriWCSDown) 
  28.               { 
  29.                   MessageBox.Show("未能连接SDE数据库,请检查网络及数据库!", "SDE连接提示"); 
  30.               } 
  31.           }  
      // 重新连接SDE图层  【dxcgis】
       private void ReconnectSDELayer(IFeatureLayer featureLayer)
      {
                IDataset dataset = featureLayer as IDataset;
                IWorkspaceFactory workspaceFactory = dataset.Workspace.WorkspaceFactory;

                IWorkspaceFactoryStatus workspaceFactoryStatus = workspaceFactory as IWorkspaceFactoryStatus;
                IEnumWorkspaceStatus enumWorkspaceStatus = workspaceFactoryStatus.WorkspaceStatus;
                IWorkspaceStatus workspaceStatus = null;
                while ((workspaceStatus = enumWorkspaceStatus.Next()) != null)
                {
                    if (dataset.Workspace.Equals(workspaceStatus.Workspace))
                    {
                        break;
                    }
                }

                // 检测SDE连接是否断开 
                if (workspaceStatus != null &&
                     workspaceStatus.ConnectionStatus == esriWorkspaceConnectionStatus.esriWCSDown)
                {
                    IWorkspaceStatus pingedStatus = workspaceFactoryStatus.PingWorkspaceStatus(dataset.Workspace);
                    if (pingedStatus.ConnectionStatus == esriWorkspaceConnectionStatus.esriWCSAvailable)
                    {
                        IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactoryStatus.OpenAvailableWorkspace(pingedStatus);
                        featureLayer.FeatureClass = featureWorkspace.OpenFeatureClass(featureLayer.FeatureClass.AliasName);                     
                    }
                    else if (pingedStatus.ConnectionStatus == esriWorkspaceConnectionStatus.esriWCSDown)
                    {
                        MessageBox.Show("未能连接SDE数据库,请检查网络及数据库!", "SDE连接提示");
                    }
                } 
      }


后记: AE的接口真的是很丰富,我们需要好好深入研究其帮助文档,很可能,就有不少收获。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值