问题描述:
大家在程序中使用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
OpenAvailableWorkspace | Makes an attempt to open a new instance of a workspace that is esriWCSDown but has since become esriWCSAvailable. | |
PingWorkspaceStatus | Checks if the status of an esriWCSDown workspace has changed. | |
WorkspaceStatus | Retrieve the workspace status information for all currently opened workspaces |
- // 重新连接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的接口真的是很丰富,我们需要好好深入研究其帮助文档,很可能,就有不少收获。