SuperMap iObjects .NET 11i二次开发(四)——小白进阶之有关数据源操作

前言

上一篇博文简单介绍了有关于文件型工作空间的操作,这个部分主要认识下有关数据源操作。


数据源集合(Datasources):对数据源进行管理,包括创建、打开、关闭数据源等功能。可以同时管理多种类型的数据源(UDB/UDBX、Oracle、SQL Server、PostgreSQL 等数据源),即在一个数据源集合对象中可以同时包括各种类型的数据源。实现了对数据源的无缝管理。在当前版本中,数据源集合支持多线程访问。一个工作空间中的数据源均由数据源集合管理。在创建数据源时,需要注意数据源的类型以及对应的数据引擎。

数据源(Datasource):是存储空间数据的场所,所有的空间数据都是存储于数据源而不是工作空间,任何对空间数据的操作都需要打开或获取数据源,数据源可以管理数据源与文件或数据库的连接、数据源的投影等信息。一个数据源对应着一种数据引擎。SuperMap 产品中提供了多种数据源类型,分为文件型数据源、数据库型数据源和 Web 数据源。如UDB/UDBX 数据源属于文件型数据源,Oracle、SQL Server、PostgreSQL等 数据源属于数据库型数据源;OGC、GoogleMaps、超图云服务、REST 地图服务和天地图地图服务数据源属于 Web 数据源。数据源只是定义了一致的数据访问接口和规范,并没有定义数据源的存储细节。数据源的物理存储既可以是文件方式的,也可以是数据库方式的,区别不同的存储方式主要在于采用的数据引擎类型,采用 UDB/UDBX 引擎时,数据源就以文件方式存储,而采用空间数据库引擎时,数据源被存储到指定的数据库中。数据源对象通常是作为工作空间中数据源集合中的一个元素,可以对数据源进行保存操作、对数据集进行复制操作。


一、有关数据源常用类说明

Datasources类

数据源的集合类,提供数据源进行管理,包括创建、打开、关闭数据源等功能。

Datasource类

数据源类,该类管理投影信息、数据源与数据库的连接信息和对其中的数据集的相关操作,如通过已有数据集复制生成新的数据集等。

DatasourceConnectionInfo类

数据源连接信息类,包括了进行数据源连接的所有信息,如所要连接的服务器名称,数据库名称、用户名、密码等。当保存工作空间时,工作空间中的数据源的连接信息都将存储到工作空间文件中。

二、有关数据源常用方法说明

Datasources.Open()

根据指定的连接信息打开已经存在的数据源,指定数据源不存在时返回 Null。

Datasources.Create()

根据指定的连接信息创建数据源,如果待创建的数据源已经存在则返回 null。

Datasource.Close()

关闭当前数据源。

三、界面设计

(1)创建菜单

在上一篇博客的界面设计基础上,在MenuStrip控件中创建有关于数据源操作的菜单,如下图所示:

(2)创建右键菜单

和上篇博文关于工作空间操作右键菜单设置过程一致,此处不再过多赘述。(跳转至上一篇博文

四、菜单栏功能实现

(1)新建文件型数据源

private void CreateDatasource_Click(object sender, EventArgs e)
{
    SaveFileDialog saveFileDialog1 = new SaveFileDialog();
    saveFileDialog1.Title = "新建文件型数据源";
    saveFileDialog1.CheckPathExists = true;
    saveFileDialog1.AddExtension = true;
    saveFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";

    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        //获取文件名并且去掉文件扩展名
        String name = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName);
        for (int i = 0; i < D_workspace.Datasources.Count; i++)
        {
            //比较字符串"name"和数据源的别名是否相等
            bool test = (String.Compare(name, D_workspace.Datasources[i].Alias) == 0);
            if (test)
            {
                MessageBox.Show("指定数据源名称已存在!");
                return;
            }
        }
        //DatasourceConnectionInfo 构造函数(String, String, String)
        DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo(name, name, "");
        //设置UDB文件的绝对路径,当绝对路径的长度超过 UTF-8 编码格式的260字节长度,该数据源无法打开
        dsconInfo.Server = saveFileDialog1.FileName;
        // 根据文件的扩展名来确定使用的引擎类型
        if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
        {
            dsconInfo.EngineType = EngineType.UDB;
        }
        else
        {
            dsconInfo.EngineType = EngineType.UDBX;
        }
        //根据指定的数据源连接信息创建数据源
        D_workspace.Datasources.Create(dsconInfo);
    }
}

(2)打开文件型数据源

private void OpenFileDatasource_Click(object sender, EventArgs e)
{
    if (D_workspace != null)
    {
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
            dsconInfo.Server = openFileDialog1.FileName;
            dsconInfo.Alias = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
            bool test = D_workspace.Datasources.Contains(dsconInfo.Alias);
            if (test)
            {
                MessageBox.Show("该数据源已打开!");
                return;
            }
            dsconInfo.Password = "";
            // 根据文件的扩展名来确定使用的引擎类型
            if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
            {
                dsconInfo.EngineType = EngineType.UDB;
            }
            else
            {
                dsconInfo.EngineType = EngineType.UDBX;
            }
            D_workspace.Datasources.Open(dsconInfo);
            //刷新工作空间树
            this.D_workspaceControl.WorkspaceTree.Refresh();
        }
    }
}

(3)打开数据库型数据源

此处以打开PostgreSQL数据库为例,设置服务器名称、数据库名称、用户名和密码等连接信息,使用这些连接信息打开PostgreSQL数据库型数据源,其他数据引擎类型可自行编写。

private void OpenDatabaseDatasource_Click(object sender, EventArgs e)
{
    if (D_workspace != null)
    {
        DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
        dsconInfo.EngineType = EngineType.PostgreSQL;
        //自行设置服务器名称、数据库名称、用户名和密码等连接信息
        dsconInfo.Server = "";
        dsconInfo.Database = "";
        dsconInfo.User = "";
        dsconInfo.Password = "";
        D_workspace.Datasources.Open(dsconInfo);
        //刷新工作空间树
        this.D_workspaceControl.WorkspaceTree.Refresh();
    }
}

(4)关闭数据源

private void CloseDatasource_Click(object sender, EventArgs e)
{
    //判断工作空间树中选择的节点是否是数据源节点的子节点
    if (this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent == this.D_workspaceControl.WorkspaceTree.DatasourcesNode)
    {
        D_workspace.Datasources[this.D_workspaceControl.WorkspaceTree.SelectedNode.Text].Close();
        this.D_workspaceControl.WorkspaceTree.Refresh();
    }
    else
    {
        MessageBox.Show("请先选中要关闭的数据源!");
    }
}

 五、右键菜单功能实现

在上一篇博文的基础上,添加有关于单击数据源集合节点代码,数据源集合右键菜单内按钮的功能代码和上方菜单栏功能代码一致。

//为 D_workspaceControl控件的WorkspaceTree控件的NodeMouseClick事件添加了一个名为tree_NodeMouseClick的事件处理程序
//当单击WorkspaceTree控件的节点时,将触发 tree_NodeMouseClick 事件处理程序,从而执行相关的操作或代码逻辑
this.D_workspaceControl.WorkspaceTree.NodeMouseClick += new TreeNodeMouseClickEventHandler(tree_NodeMouseClick);
 
 
private void tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    //单击Workspace节点时,弹出一个名为 contextMenuStrip_workspace的右键菜单,选择相应的操作。
    WorkspaceTreeNodeBase treenode = e.Node as WorkspaceTreeNodeBase;
    if (treenode.NodeType == WorkspaceTreeNodeDataType.Workspace)
    {
        treenode.ContextMenuStrip = contextMenuStrip_workspace;
    }
    else if(treenode.NodeType == WorkspaceTreeNodeDataType.Datasources)
    {
        treenode.ContextMenuStrip = contextMenuStrip_datasource;
    }

}

六、完整实现代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SuperMap.Data;
using SuperMap.Mapping;
using SuperMap.UI;
using SuperMap.Realspace;
using System.IO;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private Workspace D_workspace;
        private WorkspaceControl D_workspaceControl;
        private MapControl D_mapControl;
        private SceneControl D_sceneControl;
        private LayersControl D_layersControl;
        private WorkspaceConnectionInfo D_connectionInfo;

        public Form1()
        {
            String mail = "";  // 需要替换为自己的SuperMap账号
            String password = "";
            bool login = SuperMap.Data.CloudLicense.Login(mail, password);

            InitializeComponent();

            D_workspace = new Workspace();
            D_workspaceControl = new WorkspaceControl();
            //控件始终填充整个父容器
            D_workspaceControl.Dock = DockStyle.Fill;
            //将指定的控件添加到panel1控件中
            splitContainer1.Panel1.Controls.Add(D_workspaceControl);

            D_layersControl = new LayersControl();
            D_layersControl.Dock = DockStyle.Fill;
            splitContainer1.Panel2.Controls.Add(D_layersControl);


            D_mapControl = new MapControl();
            D_mapControl.Dock = DockStyle.Fill;
            //将指定的控件添加到panel1控件中
            panel3.Controls.Add(D_mapControl);

            D_sceneControl = new SceneControl();
            D_sceneControl.Dock = DockStyle.Fill;
            panel4.Controls.Add(D_sceneControl);

            //为 D_workspaceControl控件的WorkspaceTree控件的NodeMouseClick事件添加了一个名为tree_NodeMouseClick的事件处理程序。
            //当单击WorkspaceTree控件的节点时,将触发 tree_NodeMouseClick 事件处理程序,从而执行相关的操作或代码逻辑。
            this.D_workspaceControl.WorkspaceTree.NodeMouseClick += new TreeNodeMouseClickEventHandler(tree_NodeMouseClick);



        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //工作空间和控件联动
            D_workspaceControl.WorkspaceTree.Workspace = D_workspace;
            D_mapControl.Map.Workspace = D_workspace;
            D_sceneControl.Scene.Workspace = D_workspace;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            D_mapControl.Dispose();
            D_layersControl.Dispose();
            D_sceneControl.Dispose();
            D_workspaceControl.Dispose();
            D_workspace.Close();
            D_workspace.Dispose();
        }


        private void OpenWorkspace_Click(object sender, EventArgs e)
        {
            //获取对话框
            this.openFileDialog1.Title = "打开工作空间";
            this.openFileDialog1.FileName = "";
            //对打开文件进行格式过滤
            this.openFileDialog1.Filter = "工作空间文件 (*.smwu)|*.smwu|工作空间文件 (*.sxwu)|*.sxwu";
            //返回文件结果
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //关闭存在的工作空间
                D_workspace.Close();
                //将文件名作为工作空间名称
                string fileName = openFileDialog1.FileName;
                //传递工作空间连接信息
                WorkspaceConnectionInfo file = new WorkspaceConnectionInfo(fileName);
                //打开工作空间
                D_workspace.Open(file);
                //刷新工作空间树
                this.D_workspaceControl.WorkspaceTree.Refresh();

            }
        }

        private void SaveWorkspace_Click(object sender, EventArgs e)
        {
            if (D_workspace.Save())
            {
                MessageBox.Show("工作空间保存成功!", "提示");
            }
            else
            {
                MessageBox.Show("工作空间保存失败!", "提示");
                return;
            }
        }

        private void SaveAsWorkspace_Click(object sender, EventArgs e)
        {
            //获取对话框
            this.saveFileDialog1.Title = "保存工作空间";
            //对另存文件进行格式过滤
            this.saveFileDialog1.Filter = "SuperMap工作空间文件(*.smwu)|*.smwu|SuperMap工作空间文件(*.sxwu)|*.sxwu";
            if (this.saveFileDialog1.FileName != null && this.saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //从 SaveFileDialog控件中获取用户选择的文件名,并去除文件扩展名后赋值给变量name
                //这个操作通常用于获取用户选择的文件的纯文件名,而不包括文件的扩展名部分
                String name = System.IO.Path.GetFileNameWithoutExtension(this.saveFileDialog1.FileName);
                //传递工作空间连接信息
                WorkspaceConnectionInfo file = new WorkspaceConnectionInfo();
                file.Server = this.saveFileDialog1.FileName;
                file.Password = "";
                //根据 SaveFileDialog 控件的 FilterIndex属性的值来判断文件的类型
                if (this.saveFileDialog1.FilterIndex == 1)
                {
                    file.Type = WorkspaceType.SMWU;
                }
                else
                {
                    file.Type = WorkspaceType.SXWU;
                }
                D_workspace.Caption = name;
                //另存于指定路径
                if (D_workspace.SaveAs(file))
                {
                    MessageBox.Show("工作空间另存成功!");
                }
                else
                {
                    MessageBox.Show("另存工作空间失败!", "提示");
                    return;
                }
            }
        }

        private void CloseWorkspace_Click(object sender, EventArgs e)
        {
            this.D_workspace.Close();
        }

        private void tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            //单击Workspace节点时,弹出一个名为 contextMenuStrip_workspace的右键菜单,选择相应的操作。
            WorkspaceTreeNodeBase treenode = e.Node as WorkspaceTreeNodeBase;
            if (treenode.NodeType == WorkspaceTreeNodeDataType.Workspace)
            {
                treenode.ContextMenuStrip = contextMenuStrip_workspace;
            }
            else if(treenode.NodeType == WorkspaceTreeNodeDataType.Datasources)
            {
                treenode.ContextMenuStrip = contextMenuStrip_datasource;
            }

        }


     

        private void CreateDatasource_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Title = "新建文件型数据源";
            saveFileDialog1.CheckPathExists = true;
            saveFileDialog1.AddExtension = true;
            saveFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //获取文件名并且去掉文件扩展名
                String name = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName);
                for (int i = 0; i < D_workspace.Datasources.Count; i++)
                {
                    //比较字符串"name"和数据源的别名是否相等
                    bool test = (String.Compare(name, D_workspace.Datasources[i].Alias) == 0);
                    if (test)
                    {
                        MessageBox.Show("指定数据源名称已存在!");
                        return;
                    }
                }
                //DatasourceConnectionInfo 构造函数(String, String, String)
                DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo(name, name, "");
                //设置UDB文件的绝对路径,当绝对路径的长度超过 UTF-8 编码格式的260字节长度,该数据源无法打开
                dsconInfo.Server = saveFileDialog1.FileName;
                // 根据文件的扩展名来确定使用的引擎类型
                if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
                {
                    dsconInfo.EngineType = EngineType.UDB;
                }
                else
                {
                    dsconInfo.EngineType = EngineType.UDBX;
                }
                //根据指定的数据源连接信息创建数据源
                D_workspace.Datasources.Create(dsconInfo);
            }
        }

        private void OpenFileDatasource_Click(object sender, EventArgs e)
        {
            if (D_workspace != null)
            {
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
                openFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";

                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
                    dsconInfo.Server = openFileDialog1.FileName;
                    dsconInfo.Alias = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
                    bool test = D_workspace.Datasources.Contains(dsconInfo.Alias);
                    if (test)
                    {
                        MessageBox.Show("该数据源已打开!");
                        return;
                    }
                    dsconInfo.Password = "";
                    // 根据文件的扩展名来确定使用的引擎类型
                    if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
                    {
                        dsconInfo.EngineType = EngineType.UDB;
                    }
                    else
                    {
                        dsconInfo.EngineType = EngineType.UDBX;
                    }
                    D_workspace.Datasources.Open(dsconInfo);
                    //刷新工作空间树
                    this.D_workspaceControl.WorkspaceTree.Refresh();
                }
            }
        }

        private void OpenDatabaseDatasource_Click(object sender, EventArgs e)
        {
            if (D_workspace != null)
            {
                DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
                dsconInfo.EngineType = EngineType.PostgreSQL;
                //自行设置服务器名称、数据库名称、用户名和密码等连接信息
                dsconInfo.Server = "";
                dsconInfo.Database = "";
                dsconInfo.User = "";
                dsconInfo.Password = "";
                D_workspace.Datasources.Open(dsconInfo);
                //刷新工作空间树
                this.D_workspaceControl.WorkspaceTree.Refresh();
            }
        }

        private void CloseDatasource_Click(object sender, EventArgs e)
        {
            //判断工作空间树中选择的节点是否是数据源节点的子节点
            if (this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent == this.D_workspaceControl.WorkspaceTree.DatasourcesNode)
            {
                D_workspace.Datasources[this.D_workspaceControl.WorkspaceTree.SelectedNode.Text].Close();
                this.D_workspaceControl.WorkspaceTree.Refresh();
            }
            else
            {
                MessageBox.Show("请先选中要关闭的数据源!");
            }
        }
    }
}

七、运行结果


总结

以上就是有关于SuperMap iObjects 11i .NET关于数据源操作的一些过程记录,我们下篇博文再见!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值