• ArcGIS Engine断开其他ArcSDE用户连接的解决方案


    来自:http://blog.csdn.net/linghe301/article/details/38925481

    最近有很多用户咨询在ArcGIS Engine中希望能够实现断开其他客户端连接ArcSDE的用户,其实个人认为ArcGIS Engine实现的是业务功能,断开其他客户端用户连接是一个管理型功能,这些操作不应该在一块,但是用户的需求可能就是有一定的合理性。特别是ArcGIS10.1也的确将ArcSDE管理的功能集成到ArcGIS for Desktop,说明这种功能实现可能是可行的。

    ArcGIS 10.1之前的版本是不能使用ArcGIS Engine实现该功能,因为ArcGIS Engine根本就没有提供相关的接口。

    ArcGIS10.1包括之后的版本是可以使用ArcGIS Engine实现该功能,这样同步了ArcGIS 10.1 for Desktop同步该功能一样。

    测试环境:

    用户1:aaa,包括connect和resouces的角色

    用户2:bbb,包括dba权限

    用户3:sde,包括sde的权限

    这三个用户都是一个实例下,有时候也统称为sde的用户。

    如果使用过ArcSDE命令用户应该可以了解提供了sdemon -o kill命令来断开相关的sde用户连接,主要是获得连接用户的sessionID,然后调用命令kill即可

    1. C:UsersLi>sdemon -o kill  
    2.   
    3. ESRI ArcSDE System Monitor Utility  Fri Aug 29 14:50:02 2014  
    4. -------------------------------------------------------------------------  
    5. sdemon -o kill       -t {all | <pid>} [-u <DB_User_name>] [-p <DB_Admin_password  
    6. >]  
    7.                    {[-i <service>] [-s <server_name>] | [-H <sde_directory>]}  
    8.                    [-D <database>] [-N]  
    9. sdemon -h  
    10. sdemon -?  

    那么ArcGIS Engine也是使用该命令,该Kill功能集成在了IDatabaseConnectionInfo4的DisconnectUser,传入相关参数的sessionID即可。

    ------------------------------------------------------------------

    版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

    建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

    Blog:               http://blog.csdn.net/linghe301 

    ------------------------------------------------------------------

    具体代码如下:

    该代码并没有考虑对Lock的逻辑判断。

    1. public static void test()  
    2.        {  
    3.            try  
    4.            {  
    5.                IWorkspace pWS = GetSDEWorkspace("localhost", "localhost/orcl", "sde", "sde", "sde.DEFAULT");  
    6.                IDatabaseConnectionInfo4 pDCInfo = pWS as IDatabaseConnectionInfo4;  
    7.                IEnumUserInfo pEnumUsers = pDCInfo.ConnectedUsers;  
    8.                IUserInfo pUser = pEnumUsers.Next();  
    9.                int pSessionID;//获得连接用户的sessionID   
    10.                string sUserName = "";//连接用户名称  
    11.                string sClientName = "";//连接用户的机器名  
    12.                string sConnetionTime = "";//连接用户的开始连接时间  
    13.                while (pUser != null)  
    14.                {  
    15.                    if (!pUser.IsOwnConnection)  
    16.                    {  
    17.                        
    18.                        pSessionID = pUser.SessionID;  
    19.                        sUserName = pUser.Name;  
    20.                        sClientName = pUser.ClientName;  
    21.                        sConnetionTime = pUser.ConnectionTime.ToString();  
    22.                        //通过用户的sessionID断开用户连接  
    23.                        pDCInfo.DisconnectUser(pSessionID);  
    24.                    }  
    25.                    pUser = pEnumUsers.Next();  
    26.                }  
    27.                 
    28.            }  
    29.            catch (Exception e)  
    30.            { }  
    31.        }  
    32.   
    33.        public static IWorkspace GetSDEWorkspace(string sServerName, string sInstancePort, string sUserName, string sPassword, string sVersionName)  
    34.        {  
    35.   
    36.            IPropertySet2 set = new PropertySetClass();  
    37.            set.SetProperty("Server", "");  
    38.            set.SetProperty("DBCLIENT", "Oracle");  
    39.            set.SetProperty("Instance", "sde:oracle11g:" + sInstancePort);  
    40.            set.SetProperty("User", sUserName);  
    41.            set.SetProperty("password", sPassword);  
    42.            set.SetProperty("version", sVersionName);  
    43.   
    44.            IWorkspaceFactory2 class2 = new SdeWorkspaceFactoryClass();  
    45.            try  
    46.            {  
    47.                return class2.Open(set, 0);  
    48.   
    49.            }  
    50.            catch (Exception ex)  
    51.            {  
    52.                return null;  
    53.            }  
    54.        }  

    注意:虽然这是一个ArcGIS Engine的例子,我们需要了解一些ArcSDE的基础知识,也就是我们只能通过sde管理员用户才能断开其他用户的连接,即使你当前连接的用户有dba权限也不行,我个人推断Esri在代码层次上将用户名写死成sde了,所以其他用户连接根本不行,直接报错。

    那么如果ArcGIS10.1版本之前的用户该怎么实现这个操作呢?

    1:将ArcSDE命令编辑为一个bat文件,利用C#或者JAVA语言直接调用该文件。

    2:如果你熟悉Oracle数据库,当然再好不过了,因为ArcSDE作为一个数据库中间件,它核心的东西就是调用Oracle的相关功能,所以我们可以绕开ArcSDE层次,直接在Oracle上操作。

    注意:当然不建议普通用户这样操作了,比较有一定的风险。

    我们可以将sde用户下的process_information与v$session进行关联查询,根据sde命令获得的sde_id,应用程序名称,终端名称、用户名等信息获得最终断开的连接信息。

    1. SQL> select a.sde_id,a.server_id,b.sid,b.SERIAL#,b.PROGRAM,b.USERNAME,b.TERMINAL   
    2. from sde.process_information a ,v$session b   
    3. where a.start_time=b.LOGON_TIME;  
    4.   
    5. SDE_ID   SERVER_ID   SID    SERIAL# PROGRAM         USERNAME    TERMINAL  
    6. ------ --------------------------------------- ---------- ---------- ------------------------------  
    7. 22          5692            140        386    sde.vshost.exe    SDE               WIN-HV4HFT8KPSS  
    8. 20          4756            137       4713   ArcMap.exe         BBB               WIN-HV4HFT8KPSS  

    通过SID和SERIAL#断开用户连接,例子:alter system kill session 'sid,serial';如通过如下SQL语句alter system kill session '137,4713';断开ArcMap应用程序的bbb用户的连接。

  • 相关阅读:
    原型模式
    创造者模式
    抽象工厂模式
    工厂方法模式
    简单工厂模式
    HiveQl 基本查询
    使用VMware安装linux虚拟机以及相关配置
    大数据测试
    使用Pycharm创建一个Django项目
    LoadRunner监控window系统各项指标详解
  • 原文地址:https://www.cnblogs.com/gisoracle/p/3999922.html
Copyright © 2020-2023  润新知