AO开发SDE(二)

引言: 这次的主要内容是连接SDE加载数据和开始编辑时候碰到的问题

一:关于初始化问题

这个主要是关系到许可的问题,如果许可初始化不到位的话,那么功能很容易报错,出现各式各样的错误。

自己碰到的大约有几个:

1. 检索 COM 类工厂中 CLSID 为 {4AFAF64D-0CB2-4ADB-BC88-9FB07548D10D} 的组件失败,原因是出现以下错误: 80040111 ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))。(因为没有绑定产品)

2.异常来自 HRESULT:0x8004021F(许可为初始化,由于是SDE编辑,所以需要esriLicenseProductCodeEngineGeoDB许可)

初始化代码如下:

    

public static class LiscenseManager
    {


        /// <summary>
        /// 用来初始化许可
        /// </summary>
        public static void StratUsing()
        {
            RuntimeManager.Bind(ProductCode.EngineOrDesktop);
            IAoInitialize PAoInitialize = new AoInitializeClass();
            PAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
            esriLicenseStatus _LicenseStatus = PAoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
            if (_LicenseStatus == esriLicenseStatus.esriLicenseAvailable)
            {
                //PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeVBAExtension);
               // PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst);
            }
            //if (PAoInitialize.IsExtensionCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine, esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst) == esriLicenseStatus.esriLicenseUnavailable)
            //{
             //   PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst);
            //}


        }
    }

将初始化代码写在main函数里面即可。

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            LiscenseManager.StratUsing();
            Application.Run(new Form1());
        }



二:连接SDE加载数据

SDE连接方式有两种,这里说的是代码写法上的两种中哈。

Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory");
            IWorkspaceFactory2 pWorkspaceFactory2 = (IWorkspaceFactory2)Activator.CreateInstance(factoryType);//两种方式区别主要在这块
        //另一种是 IWorkspaceFactory factory = new SdeWorkspaceFactoryClass();    
	if (pWorkspaceFactory2 != null)
            {
                m_WorkspaceFactory2 = pWorkspaceFactory2;
            }
            IPropertySet pPropertySet = new PropertySet();
            pPropertySet.SetProperty("SERVER", "hangye");
            pPropertySet.SetProperty("SERVICES", "5151");
            pPropertySet.SetProperty("USER", "sde");
            pPropertySet.SetProperty("PASSWORD", "sde");
            pPropertySet.SetProperty("VERSION", "sde.DEFAULT");
            IWorkspace pWorkspace = pWorkspaceFactory2.Open(pPropertySet,0);
            
            if (pWorkspace != null)
            {
                m_Workspace = pWorkspace;
                IEnumDataset pEnumDataset = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureClass);
                IDataset pDataset = pEnumDataset.Next();
                while (pDataset != null)
                {
                   // IFeatureDataset pFeatureDataset = pDataset as IFeatureDataset;
                    //IEnumDataset pChildDataset = pFeatureDataset.Subsets;
                   // IDataset pChildlayer=pChildDataset.Next();
                    //while (pChildlayer != null)
                    //{
                    IFeatureClass pFeatureClass = pDataset as IFeatureClass;
                        IFeatureLayer pFeatureLayer = new FeatureLayer();
                        pFeatureLayer.FeatureClass = pFeatureClass;
                        pFeatureLayer.SpatialReference = (pDataset as IGeoDataset).SpatialReference;
                        axMapControl1.Map.AddLayer(pFeatureLayer as ILayer);
                        
                       // pChildlayer = pChildDataset.Next();
                    //}
                    pDataset = pEnumDataset.Next();
                }
            }

三 编辑数据

说明一点,以前做编辑是直接用的IWorkSpaceEdit借口来启动编辑等等,最近在看到帮助文档时候说到了IEngineEditor接口,于是就尝试用一下,看看效果。

具体参看。http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/How_to_create_an_edit_session/0001000000qv000000/

启动编辑代码如下:红色部分值得注意,如果不设置编辑类型,则会报异常来自 HRESULT:0x80040356,这个设置类似用在Arcmap中Edit工具栏下来的Opetions选项的Versision选项卡。

	IEngineEditor m_EngineEditor = new EngineEditor();
      if (m_EngineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing)
                {
                    m_EngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeNonVersioned;
                    m_EngineEditor.StartEditing(m_Workspace as IWorkspace, axMapControl1.Map);
                }

开始编辑成功。先到此为止。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值