转自原文 如何编辑SDE数据库(转载)

如何编辑SDE数据(转自ESRI中国社区) (2008-12-15 17:26:41)

很多刚入门的朋友对SDE数据并不太了解,接二连三的在社区里面发问,有时也得不到很好的解答,对此懒羊羊也深感同情。想到刚入门时的痛苦,懒羊羊决定抽写时间出来详细的讲述如何去编辑SDE数据,希望可以跟广大新手一同成长,度过入门的艰难时期。如有错误或表述含糊的地方,还请众高手指正。

SDE矢ESRI开发的一个空间数据引擎,能够利用文件数据库良好的管理优势去管理数据的图形和属性。AccessDatabase
与后来的
FileGeoDataBase同样也能够很好的管理数据,但是与SDE数据库最大差别是它们不支持多用户同时编辑,也就是SDE的版本技术。虽然大家都知道这些,但是懒羊羊还是要顺便提一下。
很多人第一次接触SDE数据的时候思想可能还停留在对shp文件或是MDB文件的操作上面。事实上它们大部分的操作时一致的,但接入的方式有所不同。由于SDE多了一个版本的控制,所以在数据的载入与打开FeatureClass的时候有很大的差别。下面开始转入正题,讲述一下如何对SDE数据进行操作。
1.打开SDE数据。
SDE数据一定要使用工作空间工厂去初始化工作空间,在工作空间打开FeatureClass,这是最常规的操作。下面通过一段C#代码连接SDE,打开并返回一个IWorkspace。

public IWorkspace FindWsByDefault()

{

IPropertySet propSet = new PropertySetClass();

propSet.SetProperty("Server", Lan);

propSet.SetProperty("Instance", yangyang);

propSet.SetProperty("Database", "");

propSet.SetProperty("User", user);

propSet.SetProperty("Password", pwd);
propSet.SetProperty("Version", version);

IWorkspaceFactory factory = new SdeWorkspaceFactoryClass();

IWorkspace workspace = factory.Open(propSet, 0);

return workspace;

}

通过上述代码打开了SDE的工作空间,接下来要做的就是获取要编辑的FeatureClass。写一个函数,通过FeatureClass的别名和所在的Dataset返回FeatureClass。做法是先遍历所有的DataSet,找到符合要求的Dataset之后遍历里面的要素,返回与参与别名一致的FeatureClass(顺便说一下,FeatureClass在没有指定别名的时候默认与FeatureClass名称相同)
//查找指定要素
public IFeatureClass FindClassByName(IWorkspace ws, string className, string dsName)
        {
            IEnumDataset enumDs;
            if (dsName != "")
            {
                enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureDataset);
                IFeatureDataset featureDs = enumDs.Next() as IFeatureDataset;
                while (featureDs != null)
                {
                    if (featureDs.Name == dsName)
                    {
                        return GetFcFromDataset(featureDs, className);
                    }
                    featureDs = enumDs.Next() as IFeatureDataset;
                }
            }
            else
            {
                enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureClass);
                return GetFcFromEnumDataset(enumDs,className);
            }
            return null;
        }

//在数据集中查找要素类
private IFeatureClass GetFcFromDataset(IFeatureDataset featDs, string className)
        {
            IFeatureClass featClass;
            IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
            for (int i = 0; i < fcContainer.ClassCount; i++)
            {
                featClass = fcContainer.get_Class(i);
                if (featClass.AliasName == className)
                {
                    return featClass;
                }
            }
            return null;
        }

//在要素类集合中查找要素类
private IFeatureClass GetFcFromEnumDataset(IEnumDataset enumDs, string className)
        {
            IFeatureClass featClass = enumDs.Next() as IFeatureClass;
            while (featClass != null)
            {
                if (featClass.AliasName == className)
                {
                    return featClass;
                }
                featClass = enumDs.Next() as IFeatureClass;
            }
            return null;
        }

//通过要素类名和数据集名在指定的工作空间中寻找要素类
public IFeatureClass FindClassByName(string className, string datasetName)
        {
            IWorkspace ws = FindWsByDefault();
            IFeatureClass featClass = FindClassByName(ws, className, datasetName);
            return featClass;
        }
特别需要留意的是最后一个函数FindClassByName(,),先是打开SDE的工作空间,在这个工作空间返回符合条件的要素集。通过这样的指向才能对SDE的FeatureClass进行写入和删除的操作。可以把上述代码写成一个静态类,这样就可以很方便的通过数据集名称和要数集别名指向要编辑的FeatureClass了。

值得一提的是,很多新手都没有养成这种良好的习惯,就是先打开工作空间再进行数据的编辑,即便是使用shp文件或是MDB数据。他们习惯性的使用MapControl去加载MXD文件,然后在MapControl通过MapControl.get_layer(index)的方法去获取图层,然后将其转为IFeatureLayer或是IFeatureClass进行操作。
事实上,MXD已经不用开发者写一句加载图层的代码就完成了对图层的加载,确实比较方便。但是它有很多看不见的操作没有表现出来,加载完数据之后就把工作空间给自动关闭了。对于shp文件和MDB数据,通过读取地图控件的图层是可以直接达到写入的目的,但一旦有用户进行操作该图层文件就会被锁死,这就是不支持版本技术的表现。而SDE数据由于存在版本(原理不多说了),因此有需要去确保数据的安全性和一致性,必须使用工作空间的形式去打开。如果用读取MapControl图层的方法去获取FeatureClass,实际上获取的是一个没有打开的编辑操作的FeatureClass,在ESRI的帮助文档里面我们不难发现它是只读的,就像在ArcMap里面没有用Editor执行startEdit一样。

 

2. 编辑SDE数据
利用上述的方法获取了FeatureClass后就可以用常规的方式对其进行编辑,如delete()和CreateFeature(),或是更改属性值。但是仍然会出现无法编辑数据的现象,这种现象通常提示没有足够的授权去编辑数据,这就涉及到AE对SDE数据编辑的授权,也就是gdbedite的授权(主要是在AE9.2里面)。
关于GDBEdite的授权,懒羊羊已经在之前发过一份比较完整的文档,但还是在这里再归纳一下。
ArcEngine9.2在用户许可上做了很大的改动,应用程序是强制初始化许可,也就是说必须使用LicenseControl或AO接口初始化许可,否则应用程序无法启动。Engine9.1未采取强制初始化许可策略,而是应用程序创建时就初始化标准Engine许可。在一般情况下,我们会用将LicenseControl拖放到主窗体上完成初始化。但当Engine程序需要使用ArcGIS
Engine Enterprise Geodatabase(以下简称GDB
Update)许可的时候,我们就往往会由于意识不到应该使用该许可,以及无法正确的初始化该许可而陷入麻烦。

对于许可这东西,首先要学会看软件产品的购货单。下表是一份关于ArcEngine9.2的购货单。

下面对GDB update许可进行讨论
(1)什么情况下需要GDB Update许可
当需要对SDE里数据进行编辑时,以及需要在SDE和Personal Geodatabase中创建复杂ArcGIS对象时,需要使用GDB Update许可。
对SDE里的数据编辑,很好理解,大致就是进行数据插入,删除,更新;对表添加、删除和修改,表结构的变化(添加、删除列)等,因为这些动作都会造成后台数据库的写操作。
对于Personal Geodatabase,进行简单数据对象和编辑,包括创建、删除和修改普通表都是不需要GDB
Update许可的,但对于复杂的Geodatabse对象的创建、删除和修改,则需要GDB
Update许可,其中复杂的Geodatabse对象包括几何网络,网络分析模型,拓扑,关系类。这也是为什么往往有写好了一个创建几何网络或拓扑的程序后,执行起来会被报“需要Geodatabase
Update许可”的错。

(2) 怎样初始化GDB Update许可
当我们意识到需要使用Engine的GDB Update许可时,怎样才能将它正确的初始化呢?Engine给我们提供了两种初始化许可的方法:
1)使用LicenseControl控件。将该控件拖放到主窗体之上,勾选适当的许可,并确保程序启动该窗体可加载,就可以完成许可初始化。如下图:

2)使用IAoInitialize.Initialize方法加入适当的参数进行初始化
下面是C#的代码
private IAoInitialize m_AoInitialize = new AoInitializeClass();
private void Form1_Load(object sender, EventArgs e)
{                    m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
}  
在窗体加载的时候初始化GDB许可。
当然,对于一个健壮的程序而言,我们还需要在初始化之前先判断将被初始化的许可是否可用,应先使用IsProductCodeAvailable方法进行判断,需要初始化扩展模块的许可,可使用CheckOutExtension方法。下面为许可的检测代码
private IAoInitialize m_AoInitialize = new AoInitializeClass();

private bool CheckLicenses()
        {
            //Create a new AoInitialize object
            if (m_AoInitialize == null)
            {
                System.Windows.Forms.MessageBox.Show("Unable to initialize. This application cannot run!");
                return false;
            }
            //Determine if the product is available
            esriLicenseStatus licenseStatus =
(esriLicenseStatus)m_AoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine);
            if (licenseStatus == esriLicenseStatus.esriLicenseAvailable)
            {
                licenseStatus =
(esriLicenseStatus)m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
                if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut)
                {
                    System.Windows.Forms.MessageBox.Show("The initialization failed. This application cannot run!");
                    return false;
                }
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("The ArcGIS Engine product is unavailable. This application cannot run!");
                return false;
            }
            return true;
        }

private void ReleaseLicenses()
        {
            //Release COM objects and shutdown
            ESRI.ArcGIS.Utility.COMSupport.AOUninitialize.Shutdown();
            m_AoInitialize.Shutdown();
        }

private void FormMain_Load(object sender, EventArgs e)
        {
            if (CheckLicenses() == false) this.Close();
        }

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            ReleaseLicenses();
    }
利用代码进行初始化适用于制作一些没有窗体的后台程序(没有窗体就不能通过LicenseControl进行许可初始化,但要调用Engine的GDB Update功能就必须通过它提供的初始化接口进行初始化,否则Engine只能实现普通标准的功能)

(3)初始化过程中容易犯的错误
初始化许可的一条重要原则就是一个程序只能初始化许可一次,已经初始化许可的程序一旦运行就无法再修改其初始化的许可,即程序运行期间无法修改其使用的许可。
1)
LicenseControl和IAoInitialize接口两种初始化方法,一个应用程序中只能使用一种方法,如果两种一起使用,哪一个“说得算”就不一定了。如果这两种方式同时使用,且两种初始化的许可级别一样时,也许我们感觉不到什么不对,但当我们需要修改初始化许可级别,而又只改了一种初始化方法却忘记了另一种,根据“重要原则”可知,这次修改初始化很可能无法生效。
2)LicenseControl中多选许可是没有意义的,第一个被勾选的许可生效。如下图:

 
这种情况下,实际上该应用程序初始化的是Engine标准许可,而不是其他。虽然LicneseControl从操作上可以让用户多选许可,但并不代表它会将您勾选的许可全部签出。另外,这些许可都是有对应和包含关系的。其中ArcGIS
Engine与ArcView是对应的,ArcGIS Engine Enterprise Geodatabase与ArcEditor是对应的;ArcGIS
Engine Enterprise Geodatabase是包含ArcGIS Engine许可的。当我们需要GDB Update许可的时候,仅仅需要勾选ArcGIS
Engine Enterprise Geodatabase即可,为了“保险起见”勾选上其他许可反而会弄巧成拙。
使用IAoInitialize接口进行初始化,Initialize方法只能调用一次,多余的调用是不会生效的,道理就像上面LicenseControl勾选了多个许可一样。

说了那么多,希望新手们有所收获吧。同时也要向船长大哥说声对不起,因为之前有点忙,所以没能如期的整理出来,恳请原谅。

 
 
 

如何编辑SDE数据库(转载)的更多相关文章

  1. ArcCatalog中连接SDE数据库

    描述 在ArcCatalog采用直接的方式连接SDE数据库时,无论怎样填写连接参数,都连接不上(数据库管理工具和代码都可以连).主要报两类错误: Error:ORA-12154:TNS:无法解析指定的 ...

  2. arcgis 10 版本连接SDE数据库报错:No ArcSDE server license found 最有效的解决方法

    这个问题可以这样解决:就在在Oracle中登入SDE数据库 进入到SDE数据库中后,找到表SERVER_CONFIG,其中有一行数据记录的就是我们需要进行修改的数据 你需要做的就是找到一个可用的,前面 ...

  3. C#打开SDE数据库的几种方式总结

    转自谢灿软件原文 C#打开SDE数据库的几种方式总结 1.通过指定连接属性参数打开数据库 /// <param name="server">数据库服务器名</pa ...

  4. ArcSDE:C#打开SDE数据库的几种方式总结

    转自原文 ArcSDE:C#打开SDE数据库的几种方式总结 1.通过指定连接属性参数打开数据库 /// <param name="server">数据库服务器名< ...

  5. SQL Server中创建sde数据库

    在ArcCatalog或者ArcMap中打开ArcToolBox工具箱. 在工具箱中,找到创建企业级地理数据库工具,依次为数据管理工具→地理数据库管理→创建企业级地理数据库,如图所示. 双击打开创建企 ...

  6. 让Entity Framework支持MySql数据库(转载)

    转载地址:http://www.cnblogs.com/wintersun/archive/2010/12/12/1903861.html Entity Framework 4.0 也可以支持大名鼎鼎 ...

  7. 从SDE库文件手工删除SDE图层(转载)

    转载自:http://gis-conquer.blog.sohu.com/164467560.html 一.前言    虽然Catalog能解决这种问题,但是在特殊情况下也许这种方法有点用途.    ...

  8. php连接oracle10数据库 转载

    本文转载自:http://blog.csdn.net/wzg199088/article/details/6678241 一.配置环境: 访问Oracle8以上的数据库需要用到Oracle8Call- ...

  9. php连接oracle数据库转载

    php连接oracle数据库及查询数据的方法 投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-12-29 这篇文章主要介绍了php连接oracle数据库及查询数据的方法 ...

随机推荐

  1. BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌)

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  2. IOIOI卡片占卜(Atcoder-IOIOI カード占い)(最短路)

    题目描述: K 理事長は占いが好きで,いつも様々な占いをしている.今日は,表の面に ‘I’ が,裏の面に ‘O’ が書か れたカードを使って今年の IOI での日本選手団の出来を占うことにした. 占い ...

  3. Spring入门--控制反转(IOC)与依赖注入(DI)

        1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control).它把传统上由程序 ...

  4. Windows Server 2016 上配置 APACHE+SSL+PHP+perl

    Windows Server 2016 上配置 APACHE+SSL+PHP+perl 安装环境 谷歌云实例 Windows Server 2016 Apache Apache/2.4.25 (win ...

  5. 自定义HTML标签属性

    为HTML元素添加一自定义的属性非常方便,只须将其加到尖括号中即可,与内置属性地位相等. 如我们要为TextBox元素添加属性idvalue: <input type="text&qu ...

  6. mysql中配置ssl_key、ssl-cert、ssl-ca的路径及建立ssl连接(适用于5.7以下版本,5.7及以上请看本文末尾的备注)

    1.创建 CA 私钥和 CA 证书 (1)下载并安装openssl,将bin目录配置到环境变量: (2)设置openssl.cfg路径(若不设置会报错,找不到openssl配置文件) \bin\ope ...

  7. golang matrix

    package main import ( "fmt" "go.matrix-go1" //比较有名的关于Matrix在golang中的方法库 "st ...

  8. 【例题 7-8 UVA - 10603】Fill

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 三维显然可以缩短为2维. 只要知道a,b瓶中的水量,c瓶中的水量减一下就能得到. 则设dis[a][b]表示a,b瓶中水量为a,b时 ...

  9. 【“玲珑杯”ACM比赛 Round #20 H】康娜的数学课

    [链接]http://www.ifrog.cc/acm/problem/1161 [题意] 在这里写题意 [题解] 首先x<l肯定无解; 然后,肯定是要选其中的一些数字的. 而且这些数字肯定是大 ...

  10. 【河南省多校脸萌第六场 A】巴什博弈?

    [链接]http://acm.nyist.me/JudgeOnline/problem.php?cid=1013&pid=5 [题意] 在这里写题意 [题解] 0..a-1 YES a..a+ ...