ArcGIS Pro SDK (八)地理数据库 1 地理数据库和数据存储
文章目录
- [ArcGIS Pro SDK (八)地理数据库 1 地理数据库和数据存储](#ArcGIS Pro SDK (八)地理数据库 1 地理数据库和数据存储)
-
- [1 打开给定路径的文件地理数据库](#1 打开给定路径的文件地理数据库)
- [2 使用连接属性打开企业级地理数据库](#2 使用连接属性打开企业级地理数据库)
- [3 使用 sde 文件路径打开企业级地理数据库](#3 使用 sde 文件路径打开企业级地理数据库)
- [4 从工程项获取地理数据库](#4 从工程项获取地理数据库)
- [5 从连接文件获取数据库连接属性](#5 从连接文件获取数据库连接属性)
- [6 从要素图层获取地理数据库](#6 从要素图层获取地理数据库)
- [7 执行 SQL 语句](#7 执行 SQL 语句)
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
1 打开给定路径的文件地理数据库
csharp
public async Task OpenFileGDB()
{
try
{
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
// 打开一个文件地理数据库。如果文件夹存在且包含有效的地理数据库,这将打开该地理数据库。
using ( Geodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(@"C:\Data\LocalGovernment.gdb"))))
{
// 使用地理数据库。
}
});
}
catch (GeodatabaseNotFoundOrOpenedException exception)
{
// 处理异常。
}
}
2 使用连接属性打开企业级地理数据库
csharp
public async Task OpenEnterpriseGeodatabase()
{
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
// 打开一个非版本化的 SQL Server 实例。
DatabaseConnectionProperties connectionProperties = new DatabaseConnectionProperties(EnterpriseDatabaseType.SQLServer)
{
AuthenticationMode = AuthenticationMode.DBMS,
// testMachine 是运行该实例的计算机,testInstance 是 SQL Server 实例的名称。
Instance = @"testMachine\testInstance",
// 假设在 testInstance 上已创建一个名为 LocalGovernment 的数据库,并且已在该数据库上启用地理数据库。
Database = "LocalGovernment",
// 假设已创建一个名为 gdb 的登录名,并为其创建了具有所需权限的相应架构。
User = "gdb",
Password = "password",
Version = "dbo.DEFAULT"
};
using (Geodatabase geodatabase = new Geodatabase(connectionProperties))
{
// 使用地理数据库
}
});
}
3 使用 sde 文件路径打开企业级地理数据库
csharp
public async Task OpenEnterpriseGeodatabaseUsingSDEFilePath()
{
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file\\sdefile.sde"))))
{
// 使用地理数据库。
}
});
}
4 从工程项获取地理数据库
csharp
public async Task ObtainingGeodatabaseFromProjectItem()
{
IEnumerable<GDBProjectItem> gdbProjectItems = Project.Current.GetItems<GDBProjectItem>();
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
foreach (GDBProjectItem gdbProjectItem in gdbProjectItems)
{
using (Datastore datastore = gdbProjectItem.GetDatastore())
{
// 不支持的存储类型(非文件地理数据库和非企业级地理数据库)将是 UnknownDatastore 类型
if (datastore is UnknownDatastore)
continue;
Geodatabase geodatabase = datastore as Geodatabase;
// 使用地理数据库。
}
}
});
}
5 从连接文件获取数据库连接属性
csharp
DatabaseConnectionFile connectionFile = new DatabaseConnectionFile(new Uri("path\\to\\sde\\file\\sdefile.sde"));
DatabaseConnectionProperties connectionProperties = DatabaseClient.GetDatabaseConnectionProperties(connectionFile);
// 现在你可以,例如,在使用连接属性打开地理数据库之前更改用户名和密码
6 从要素图层获取地理数据库
csharp
public async Task ObtainingGeodatabaseFromFeatureLayer()
{
IEnumerable<Layer> layers = MapView.Active.Map.Layers.Where(layer => layer is FeatureLayer);
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
foreach (FeatureLayer featureLayer in layers)
{
using (Table table = featureLayer.GetTable())
using (Datastore datastore = table.GetDatastore())
{
if (datastore is UnknownDatastore)
continue;
Geodatabase geodatabase = datastore as Geodatabase;
}
}
});
}
7 执行 SQL 语句
csharp
// 在底层数据库管理系统上执行原始 SQL 语句。
// 任何 SQL 都是允许的(DDL 或 DML),但不能返回结果
public void ExecuteSQLOnGeodatabase(Geodatabase geodatabase, string statement)
{
QueuedTask.Run(
() =>
{
DatabaseClient.ExecuteStatement(geodatabase, statement);
});
}