ArcGIS Pro SDK (八)地理数据库 1 地理数据库和数据存储

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);
        });
}
相关推荐
灯澜忆梦4 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
C++ 老炮儿的技术栈6 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客6 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
北域码匠6 小时前
PID 控制算法完整详解(C# 原生实现,无第三方库)
c#·pid控制·工控开发·闭环控制·自动控制算法·数字pid·增量式pid
离陌在学C#6 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
zt1985q8 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
IvorySQL8 小时前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
油丶酸萝卜别吃9 小时前
MySQL B+ 树查询全过程详解
数据库·mysql
leisoo80979 小时前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json
Exclusive_Cat9 小时前
MySQL回表机制解析与优化策略
数据库·sql