您的位置:首页 > 其它

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

2015-01-22 16:50 591 查看
问题描述

      大家在程序中使用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
[csharp]
view plaincopyprint?

// 重新连接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连接提示"); 
              } 
          }  


// 重新连接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的接口真的是很丰富,我们需要好好深入研究其帮助文档,很可能,就有不少收获。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐