• 裁剪要素出现错误 :HRESULT:0x80040239


    pFeatureBuffer = pOutFeaCls.CreateFeatureBuffer();
                    pFeatureCursor = pOutFeaCls.Insert(true);
                    while (pfea != null)
                    {
                        Application.DoEvents();
                        try
                        {
                            //裁剪要素,此处只做示例不裁减
                            IGeometry pGeom = pfea.ShapeCopy;
                            pFeatureBuffer.Shape = pGeom ;
                            pFeatureCursor.InsertFeature(pFeatureBuffer);
                        }
                        catch (Exception ex)
                        {
                            LogWrite(logpath, "裁剪图层要素出错,要素OID:" + pfea.OID + "    " + ex.Message);
                        }
     
                        pfea = pcur.NextFeature();
                    }
                   pFeatureCursor.Flush();
                  //释放com
     
    代码大概如上,大量循环时程序就报错了:HRESULT:0x80040239
     
    第一反应是com对象未释放导致,于是把函数里所有创建的com对象全部用 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject  释放,然后再跑程序,问题依旧。
     
    于是开始网上搜索,度娘自然只会卖萌搜不到任何有用的,谷哥由于斯巴达封锁上不去,必须到esri论坛找。
     
    只是在进行itopologicaloperator之前进行simplify的操作。  
    试了下,所有临时geo全部处理下,仍然是这个错。

    看这里:-2147220935(80040239)  http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=71334
    esriNetworkErrors Constants ([url=mkMSITStore:C:Program%20FilesArcGISDeveloperKitHelpVBesriGeoDatabase.chm::/GeoDatabase_library.htm]esriGeoDatabase[/url])
    NETWORK_E_UPDATE_SESSION_IN_PROGRESS


    似乎是指已有一个更新进程了,导致失败。
    -2147220935 An update session is in progress.


    FeatureCursor.Flush是完成更新执行的,看这里http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=105480 5楼, 清理内存,确保将缓存中所有的信息写入图层文件,所以应该是这个问题。
     
    再看这里http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=108323,虽然只是个提问但是FeatureCursor.Flush 感觉解释得不错。
    一个数据处理功能,开始用IFeatureBuffer方法插入数据,对IFeatureBuffer赋值后调用IFeatureBuffer.InsertFeature插入,但没有调用Flush,结果当数据库为SDE(oracle)时发现大概每300条就停顿一两秒,如果数据是FieldGDB则没此情况
    google一番后,发现有部分例子采用了Flush,因此,我在InsertFeature之后又调用Flush,结果停顿情况没了
    在AE的帮助文档中,对Flush的解释是Flush any outstanding buffered writes to the database.,直译为“任何优秀的缓冲冲洗写信给数据库。”。我理解是将outstanding的缓存(buffer)写到数据库里,outstanding不知道怎么理解。
    另外,在SDE中,我试了每插入300条要素才调用一次Flush,结果又出现那种停顿的情况,那我想,是不是如果不手动调用Flush,系统也会自动调用,比如在缓存(buffer)满了的时候 
     
    猜想是缓存太大未完全存进数据库即进行下次更新缓存操作,导致出现此问题。于是修改代码:
     pFeatureBuffer = pOutFeaCls.CreateFeatureBuffer();
                    pFeatureCursor = pOutFeaCls.Insert(true);
                    while (pfea != null)
                    {
                        Application.DoEvents();
                        try
                        {
                            //裁剪要素,此处只做示例不裁减
                            IGeometry pGeom = pfea.ShapeCopy;
                            pFeatureBuffer.Shape = pGeom ;
                            pFeatureCursor.InsertFeature(pFeatureBuffer);
                            pFeatureCursor.Flush();
                        }
                        catch (Exception ex)
                        {
                            LogWrite(logpath, "裁剪图层要素出错,要素OID:" + pfea.OID + "    " + ex.Message);
                        }
     
                        pfea = pcur.NextFeature();
                    }
                  //释放com
     
    只是把pFeatureCursor.Flush();放进循环内部,再测试,问题解决。
    每循环一次写一次缓存,总体对性能基本无影响(个人测试)。
     
    看了一下,论坛的几个帖子主要对拓扑出错,目前测试此函数拓扑正常,和拓扑无关。
     
    希望对大家有用。
  • 相关阅读:
    怎样修改原型对象prototype
    怎样获取构造函数的名字
    怎样把实例对象当构造函数用
    怎样理解prototype对象的constructor属性
    怎样理解构造函数的原型对象prototype
    怎样给回调函数绑定this
    怎样绑定this
    怎样理解数组的空元素empty与undefined的区别
    怎样找出数组中的最大数值
    怎样调用对象的原生方法
  • 原文地址:https://www.cnblogs.com/jhlong/p/5394432.html
Copyright © 2020-2023  润新知