操作方法

使用 ArcObjects 从 ArcGIS Enterprise 数据库连接 (SDE) 文件获取所有属性

Last Published: February 5, 2024

描述

在 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

接收通知并查找新问题或常见问题的解决方案

从我们全新的 AI 聊天机器人中获得简明答案和视频解决方案。

下载 Esri 支持应用程序

相关信息

发现关于本主题的更多内容

获取来自 ArcGIS 专家的帮助

联系技术支持部门

下载 Esri 支持应用程序

转至下载选项