【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
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

  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的接口真的是很豐富,我們需要好好深入研究其幫助文檔,很可能,就有不少收穫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章