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:\Users\Li>sdemon -o kill
  2. ESRI ArcSDE System Monitor Utility  Fri Aug 29 14:50:02 2014
  3. -------------------------------------------------------------------------
  4. sdemon -o kill       -t {all | <pid>} [-u <DB_User_name>] [-p <DB_Admin_password
  5. >]
  6. {[-i <service>] [-s <server_name>] | [-H <sde_directory>]}
  7. [-D <database>] [-N]
  8. sdemon -h
  9. 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. pSessionID = pUser.SessionID;
  18. sUserName = pUser.Name;
  19. sClientName = pUser.ClientName;
  20. sConnetionTime = pUser.ConnectionTime.ToString();
  21. //通过用户的sessionID断开用户连接
  22. pDCInfo.DisconnectUser(pSessionID);
  23. }
  24. pUser = pEnumUsers.Next();
  25. }
  26. }
  27. catch (Exception e)
  28. { }
  29. }
  30. public static IWorkspace GetSDEWorkspace(string sServerName, string sInstancePort, string sUserName, string sPassword, string sVersionName)
  31. {
  32. IPropertySet2 set = new PropertySetClass();
  33. set.SetProperty("Server", "");
  34. set.SetProperty("DBCLIENT", "Oracle");
  35. set.SetProperty("Instance", "sde:oracle11g:" + sInstancePort);
  36. set.SetProperty("User", sUserName);
  37. set.SetProperty("password", sPassword);
  38. set.SetProperty("version", sVersionName);
  39. IWorkspaceFactory2 class2 = new SdeWorkspaceFactoryClass();
  40. try
  41. {
  42. return class2.Open(set, 0);
  43. }
  44. catch (Exception ex)
  45. {
  46. return null;
  47. }
  48. }

注意:虽然这是一个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. SDE_ID   SERVER_ID   SID    SERIAL# PROGRAM         USERNAME    TERMINAL
  5. ------ --------------------------------------- ---------- ---------- ------------------------------
  6. 22          5692            140        386    sde.vshost.exe    SDE               WIN-HV4HFT8KPSS
  7. 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用户的连接。

时间: 2024-10-12 10:25:56

ArcGIS Engine断开其他ArcSDE用户连接的解决方案的相关文章

ArcGIS 9.3下载,包含ArcGIS Desktop、ArcGIS Engine、ArcGIS Server、ArcSDE、workstation

KeyWord:ESRI ArcGIS 9.3 Desktop Server Engine ArcEngine ArcIMS ArcSDE Workstation ECP Lisence Crack 破解 许可 下载 新增ArcGIS 9.3的电驴下载地址(都是windows版本的),具体的使用与设置或者版本问题请自行Google.感谢三脚猫群友提供地址. ArcGIS_Server_Java_Editioned2k://|file|ArcGIS_Server_Java_Edition.rar|

用户连接和断开的消息处理

TServerEventHandler类提供了用户连接和断开的时候,针对套接字的处理方式. 其中提供了两个函数 createContext 当一个新的用户连接的时候会被调用 deleteContext 当用户结束请求处理的时候会被调用 详细的流程可以查看TThreadPoolServer::Task,Task作为TThreadPoolServer的内部类, 在Task::run函数内部,当有连接进来的时候,会获取TServerEventHandler类的对象,判断是否 有实例化,对连接进行处理,

ArcGIS Engine开发前基础知识(1)

ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现的功能主要有地图的基本操作.信息查询.专题地图制作.数据编辑.网络分析.空间统计分析.三维分析等. 1.地图的基本操作 地图的基本操作主要包括加载矢量.栅格数据,浏览缩放地图,保存地图,在地图上显示文本注记,绘制点线面几何体等. 2.信息查询 信息查询主要通过矩形圆形或多边形来选中地图上的要素,或者

ArcGIS Engine中的8种数据访问 (转)

数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文主要介绍一下以下八种数据格式在ArcGIS Engine中如何访问.对ArcGIS桌面应用有一定了解的读者更适合阅读本文.本文的示例代码是用C#编写. 1.Shapefile 2.Coverage 3.Personal Geodatabase 4.Enterprise Geodatabase 5.Tin 6.Raster 7.CAD 8.

ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

原文 ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System类库中定义了大量开发者可以实现的接口.AoInitializer对象就是在System类库中定义的,所有的开发者必须使用这个对象来初始化ArcGISEngine和解除ArcGIS Engine的初始化.开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展A

ArcGIS Engine开发之旅04---ARCGIS接口详细说明

原文 ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.IField接口(esriGeoDatabase)... 2 2.IFieldEdit接口(esriGeoDatabase)... 2 3.IFields接口(esriGeoDatabase)... 2 4. IRow接口(esriGeoDatabase)... 3 5. ITable接口(esriGeoDatabase)... 3 6. IArea接口(esriGeometry)

ArcGIS Engine中的重点类库介绍

转自原文ArcGIS Engine中的重点类库介绍 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System类库中定义了大量开发者可以实现的接口.AoInitializer对象就是在System类库中定义的,所有的开发者必须使用这个对象来初始化ArcGISEngine和解除ArcGIS Engine的初始化.开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展ArcGIS系统. SystemU

ArcGIS Engine开发之地图基本操作(4)

ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据的存储和管理,它将不同的数据统一纳入Access文件中,便于数据的管理与迁移,容量限制为2GB.个人地理数据库支持单用户编辑,不支持版本管理.在进行ArcGIS软件操作和开发的学习过程中,一般建议采用个人地理数据库进行数据的 组织和存储,同时也便于直接导到ArcSDE空间数据库中.加载个人地理数据库

利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

原文:利用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法和步骤. 你可以在下面的目录下找到相应的样例程序: <安装目录>\DeveloperKit\Samples\Developer_Guide_Scenarios\ ArcGIS_Engine\Building_an_ArcGIS_Control_Application\Map_Viewer 注:ArcGIS样