强制断开SDE连接的绝妙方法

时间:2015-3-19    作者:悬浮的青春    分类: gis二次开发


做arcgis开发时间长了。常常遇到一些莫名其妙的问题。


sde连接莫名不退出就是一个问题。非得重启sde服务。不能每次都重启服务啊。


后来发现 sde连接信息都是存在sde的一个系统表里的。删除连接信息之后。该连接就没了。


当然,这样可以迅速剔除sde连接。但是不知道有没有什么后果。目前我是没发现什么后果。


下面贴程序中调用的方式。直接连接数据库。执行sql即可。


  string delSDEsession = "delete from (select t.*, t.rowid from SDE.PROCESS_INFORMATION t where t.owner='你的用户名' )";
                                string strconn = “连接字符串”;
                                OracleConnection oraConn = new OracleConnection(strconn);
                                OracleCommand oraCommand = new OracleCommand(delSDEsession, oraConn);
                                oraConn.Open();
                                oraCommand.ExecuteNonQuery();
                                OracleCommand oraCommand1 = new OracleCommand("commit", oraConn);
                                oraCommand1.ExecuteNonQuery();
                                oraConn.Close();


如果程序开着的时候直接这样断开又想重新连接。可以用下面的方法。


      // 重新连接SDE
       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;
                    }
                }

                // 检测连接是否断开 
                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失败,请检查网络!", "提示");
                    }
                } 
      }


完毕!



标签: arcgis二次开发 Geodatabase

WRITTEN BY

avatar