操作方法
在 ArcObjects 或 ArcGIS Engine 客户端应用程序中,用户可能希望使用 IPropertySet 接口连接到多用户地理数据库工作空间,例如 Oracle 或 SQL Server。 以下提供代码示例显示了此工作流:
C# string dbclient = "sqlserver"; string dbConnProp = @"myMachineName\SQLEXPRESS"; string database = "myDatabase"; string user = "myUserName"; string password = "myPassword"; string version = "sde.DEFAULT"; string authentication = "DBMS"; IPropertySet propertySet = new PropertySet(); propertySet.SetProperty("DBCLIENT", dbclient); propertySet.SetProperty("DB_CONNECTION_PROPERTIES", dbConnProp); propertySet.SetProperty("DATABASE", database); propertySet.SetProperty("USER", user); propertySet.SetProperty("PASSWORD", password); propertySet.SetProperty("VERSION", version); propertySet.SetProperty("AUTHENTICATION_MODE", authentication); Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory"); IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType); IWorkspace workspace = workspaceFactory.Open(propertySet, 0);
在运行以上代码时,可能会收到运行时异常,如下所示:
Error: System.Runtime.InteropSerives.COMException: "Underlying DBMS error[ORA-12545: Connect failed because target host or object does not exist. No extended error.]
此异常很可能是由于属性集中以上属性之一的拼写错误造成的。
解决此问题的一种方法是逆向操作,直接使用 IPropertySet.GetAllProperties 方法从 SDE 连接文件获取所有 SDE 连接属性。
可以通过从桌面客户端(例如 ArcCatalog)连接到多用户 (SDE) 地理数据库来生成此 SDE 连接文件。 在 ArcCatalog 中,可以从 SDE 连接的“数据库属性”窗口复制连接文件的路径:
右键单击目录树中的 SDE 连接,然后单击属性 > 常规选项卡:
Name: C:\Users\myUserName\AppData\Roaming\ESRI\Desktop10.8\ArcCatalog\mySDEConnectionFile.sde
当不确定属性集值的语法时,GetAllProperties 方法特别有用。 当手动编写这些内容时,很容易出现语法错误,即使出现最小的拼写错误(例如缺少冒号、反斜杠、句点或美元符号),您的 ArcObjects 代码也将无法执行。 以下代码示例演示了如何调用此方法并将值输出到 Visual Studio 调试控制台:
C# // Get the Workspace from an existing SDE file (after a successful connection to an Enterprise Geodatabase) IWorkspace workspace = IWorkspaceFactory.openFromFile(pathToSDEFile, int); // Use IPropertySet.GetAllProperties() to return all the property values from a successful Enterprise workspace connection. object oNames = null; object oValues = null; IPropertySet propertySet = IWorkspace.ConnectionProperties; propertySet.GetAllProperties(oNames, oValues); // Cast as array string[] stringArray_oNames = (string[])oNames; object[] objectArray_oValues = (object[])oValues; // Print out the property set name : value pairs for (int i = 0; i <= stringArray_oNames.Length - 1; i++) { Debug.Write("Name of Property(" + i.ToString() + "): " + stringArray_oNames(i) + ", "); Debug.WriteLine("Value(" + i.ToString() + "): " + objectArray_oValues(i).ToString()); }
以上代码的输出将是类似于以下示例输出的名称/值对:
Name of Property(0): SERVER, Value(0): myMachineName Name of Property(1): INSTANCE, Value(1): sde:sqlserver:myMachineName\SQLEXPRESS Name of Property(2): DBCLIENT, Value(2): sqlserver Name of Property(3): DB_CONNECTION_PROPERTIES, Value(3): myMachineName\SQLEXPRESS Name of Property(4): DATABASE, Value(4): myDatabase Name of Property(5): IS_GEODATABASE, Value(5): true Name of Property(6): AUTHENTICATION_MODE, Value(6): DBMS Name of Property(7): USER, Value(7): myUserName Name of Property(8): PASSWORD, Value(8): System.Byte[] Name of Property(9): CONNPROP-REV, Value(9): Rev1.0 Name of Property(10): VERSION, Value(10): sde.DEFAULT
现在,可以使用上述属性集值,通过以下代码连接到 SDE 工作空间:
IWorkspace workspace = workspaceFactory.Open(propertySet, 0);
Note about Licensing: If using ArcGIS Engine, make sure you have licensed your Engine app appropriately before making any ArcObjects API calls, or else an error will occur on the first ArcObjects API call. If using an ArcMap Add-in or custom COM component, make sure to license ArcMap appropriately.
文章 ID: 000031500
获取来自 ArcGIS 专家的帮助
下载 Esri 支持应用程序