問題描述:
大家在程序中使用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的接口真的是很豐富,我們需要好好深入研究其幫助文檔,很可能,就有不少收穫。