private void DisconnectActiveSDEConnections(IGxApplication gxApp, bool useSelectedFolder = false, string folderName = "Database Connections") { IGxCatalog gxCatalog = gxApp.Catalog; object connectionsFolder = null; IGxSelection gxSel = null; IGxObject gxObj = null; int numFound; try { if (useSelectedFolder) { gxSel = gxApp.Selection; gxObj = gxSel.Location; } else { connectionsFolder = gxCatalog.GetObjectFromFullName(folderName, out numFound); if (numFound != 1 || connectionsFolder == null) { MessageBox.Show("Folder not found!"); return; } gxObj = connectionsFolder as IGxObject; } if (gxObj is IGxObjectContainer) { IGxObjectContainer gxObjCont = null; IEnumGxObject gxEnum = null; IGxObject gxObject = null; IGxDatabase2 gxDatabase = null; gxObjCont = gxObj as IGxObjectContainer; gxEnum = gxObjCont.Children; //enumerate folder contents gxObject = gxEnum.Next(); while (gxObject != null) { gxDatabase = gxObject as IGxDatabase2; Debug.Print(gxObject.Category); if (gxDatabase != null && gxDatabase.IsConnected) { gxDatabase.Disconnect(); Debug.Print(gxObject.FullName + " Disconnected"); } gxObject = gxEnum.Next(); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
Ahmed,
I tried that solution and it worked perfectly. It did exactly what I wanted. Thank you for sharing with me.
Dave
Anyone figured out a way to do this in python instead?
What if you try it in Python in a 'with' environment? Files and alike are usually closed when leaving the environment. Close is basically invoked.
Don't know if it works with an SDE connection the same way...
DisconnectUser (arcpy):
Thanks - yes, I had found this solution for the actual disconnect,, but I have 30 databases. I would like to be able to cycle through a list of connection files in a folder and disconnect all users in each connection file prior to upgrading and restarting servers, etc. I had an ArcSDE command line to do this on Unix, but since that is going away I'd like to replace it with something I can mange with Python that can do both SQL Server and Oracle instances.. Otherwise I may have to use Poewershell to manage this portion of the script...just wondering if anyone else had worked this out yet...
By following the steps in this post I can run my ArcObjects code inside a python script from Arcmap,
I just rewrite part of the disconnect snippet as a POC and tested it from Arcmap python window and from toolbox and it woks fine.
def ArcCatalog_DisconnectSDEConnections(): GetDesktopModules() pApp = GetCurrentApp() import comtypes.gen.esriFramework as esriFramework import comtypes.gen.esriCatalogUI as esriCatalogUI import comtypes.gen.esriCatalog as esriCatalog pGxApp = CType(pApp, esriCatalogUI.IGxApplication) print pGxApp pGxObj = pGxApp.SelectedObject if not pGxObj: print "Nothing selected." return pGxContainer = CType(pGxObj, esriCatalog.IGxObjectContainer) if not pGxContainer: print "No folder selected." return pgxEnum =CType(pGxContainer.Children,esriCatalog.IEnumGxObject) gxObject =CType(pgxEnum.Next(),esriCatalog.IGxObject) while gxObject: gxDatabase = CType(gxObject,esriCatalog.IGxDatabase) #print gxDatabase.IsConnected if gxDatabase and gxDatabase.IsConnected: gxDatabase.Disconnect() print gxObject.FullName + " Disconnected" gxObject =CType(pgxEnum.Next(),esriCatalog.IGxObject)
I'm using Arcmap 10.2.1, I added the code to the 10.2 snippets file and called it directly after importing the file.
import arcpy import sys sys.path.append(r'FOLDER_CONTAINS_SNIPPET_FILE') from Snippets import ArcCatalog_DisconnectSDEConnections try: ArcCatalog_DisconnectSDEConnections() except: arcpy.AddMessage(sys.exc_info())
You should check "Run Python script in process" checkbox in script properties to get it works.
Hope this approach helps.
That’s great, thank you!!!
Tracie
Tracie Streltzer
GIS Application Administrator - Lead
South Florida Water Management District
561.682.6134 | tstrelt@sfwmd.gov<mailto:tstrelt@sfwmd.gov>