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 enumDsif (dsName != "") { enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureDataset)IFeatureDataset featureDs = enumDs.Next() as IFeatureDatasetwhile (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 featClassIFeatureClassContainer fcContainer = featDs as IFeatureClassContainerfor (int i = 0i <fcContainer.ClassCounti++) { 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 IFeatureClasswhile (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.esriLicenseProductCo deEngineGeoDB)} 在窗体加载的时候初始化 GDB 许可。 当然, 对于一个健壮的程序而言, 我们还需要在初始化之前先判断将被初始化的许可是否可 用,应先使用 IsProductCodeAvailable 方法进行判断,需要初始化扩展模块的许可,可使用 CheckOutExtension 方法。1)ArcObject是编程用的对象——ArcGis提供的对象,是编程开发接口;你编程时主要与ArcObject打交道; 2)ArcEngine是地图引擎——是ArcGis的核心,将地图数据和地理信息渲染后输出为图像。程序通过ArcObject *** 作ArcEngine3)ArcGis是这个产品的总...1、连接sde数据库
在10.1中数据库的连接默认为直连,但是对于以前的代码没有任何影响,如下面的代码(如果你用的是sde10的32位数据库,连接方法和以前一样,直接用代码连接;如果你用的是64位的数据库,请将32位的数据库客户端放到安装Engine的bin目录下):
public IWorkspace GetSDEWorkspace(
评论列表(0条)