IFeatureCursor.UpdateFeature不能更新MDB的问题

本文分享了解决在ArcGIS中使用UpdateFeature方法时遇到的数据库锁定或只读错误的经验。通过调整UpdateCursor和SearchCursor的使用顺序,成功避免了错误并提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       上周有个同事要我帮忙把土地利用图斑的村名写到BLOCK_CODE字段中,因为只能根据空间关系来做,所以最好写程序。刚开始以为这样的小问题,半个小时不到应该就能解决,没想到折腾了一个下午也没有完全搞定。每次执行到UpdateFeature就出错,说数据库被锁定或者只读。实在没有办法了上ESRI的User Forums上查了查,通常别人应该也会碰到和我类似的问题,结果的确找到不少,不过感觉不是正解。他们说要用IFeature.Store代替UpdateFeature,但是UpdateFeature可以批量提交性能会好些,而且也没有找出导致不能更新的根本原因。因为我发现UpdateFeature方法不是所有情况下都不能用,比如我写了一个简单的函数,所有的Feature赋上同样的值是可以的,所以我坚信肯定是别的原因导致这个错误。
       因为村相对于图斑要少得多,一个区县村通常只有近百个,而图斑达数万甚至几十万。如果用区县来选择图斑可以减少查询的次数,速度应该会快一点。所以我采用一个只读的Search Cursor内嵌套可更新的Update Cursor,我发现论坛上的那些人也是这样的模式,有些人说是Update Cursor锁定了表,对象没有释放,但是即便你用完后用Set pCursor = Nothing也于事无补。周末我有空就在思考这个问题,感觉应该把Update Cursor放在外面可能能够解决问题,结果真如我想象的那样,UpdateFeature工作得很好!
    关键代码如下:
    featureCount = 0
    
Set pLCursor = pLandUseFC.Update(NothingFalse)
    
Set pLFeature = pLCursor.NextFeature
    
Do While Not pLFeature Is Nothing
       
        
If IsNull(pLFeature.Value(fldLBlock)) Then
            blockCode 
= ""
        
Else
            blockCode 
= pLFeature.Value(fldLBlock)
        
End If
        
Set pSpatialFilter.Geometry = pLFeature.Shape
        
Set pVCursor = pVillageFC.Search(pSpatialFilter, False)
       
        
Set pVFeature = pVCursor.NextFeature
        
Do While Not pVFeature Is Nothing
            
If Not IsNull(pVFeature.Value(fldVBlock)) Then
                
If blockCode = "" Then
                    blockCode 
= pVFeature.Value(fldVBlock)
                
Else
                    blockCode 
= blockCode & "," & pVFeature.Value(fldVBlock)
                
End If
            
End If
           
            
Set pVFeature = pVCursor.NextFeature
        
Loop
        
        pLFeature.Value(fldLBlock) 
= blockCode
        pLCursor.UpdateFeature pLFeature
        featureCount 
= featureCount + 1
        
If featureCount = 1000 Then
            pLCursor.flush
            featureCount 
= 0
        
End If
        
Set pLFeature = pLCursor.NextFeature
    
Loop
    pLCursor.flush

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值