gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:1338回复:2

在MO中向图层添加记录的性能提高

楼主#
更多 发布于:2004-07-14 13:41
<P>经常看到有朋友说, MO添加记录咋那么慢呢,其实MO里面有一个参数的设置,能对添加记录的性能有很大的影响。这个参数就是Recordset对象的AutoFlush属性,先看看MO帮助中的描述把:</P>
<P>The property only applies to Recordsets of MapLayers based on <b>shapefiles</b>. <FONT color=#ee1111>Setting AutoFlush to False</FONT> will result in performance improvements for "batch" type operations such as creating new shapefiles. For updates to be reliably seen as they occur, AutoFlush should be set to True. Setting AutoFlush to True will flush the file, as will StopEditing or releasing the Recordset object.</P>
<P>然后用下面的代码测试一下效果:</P>
<P>  Dim dc As New DataConnection, lyr As New MapLayer, tb As New TableDesc, rs As Recordset
  Dim W As Double, H As Double, pt As New Point, t As Date
  dc.Database = "E:\"
  If Not dc.Connect Then Exit Sub
  Set lyr.GeoDataset = dc.AddGeoDataset("TestSpeed", moShapeTypePoint, tb)
  If Not lyr.Valid Then Exit Sub
  Map1.Layers.Add lyr
  Set rs = lyr.Records
  Randomize
  H = Map1.Extent.Height
  W = Map1.Extent.Width
  '关键代码行, 注释后添加的效率就会非常低
<EM><b>  rs.AutoFlush = False</b></EM>
  t = Now
  For i = 1 To 1000
    pt.Set Rnd * W, Rnd * H
    rs.AddNew
    rs.Fields("Shape").Value = pt
    rs.Update
    Text1.Text = "当前位置:" ; i
    DoEvents
  Next
  rs.StopEditing
  Map1.Refresh
  Text2.Text = "总计耗时(秒): " ; DateDiff("s", t, Now)
</P>
<P>就会发现添加1000条记录的时候,如果autoflush为false,那么不到1秒就可以完成,否则需要80秒左右。如果添加1000条记录,效果就更加明显了。</P>
<P>看来在成批添加数据的时候,还是考虑一下这个东东吧。</P>
喜欢0 评分0
GIS麦田守望者,期待与您交流。
killer315
伴读书童
伴读书童
  • 注册日期2004-07-11
  • 发帖数108
  • QQ
  • 铜币197枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-07-19 19:47
明白了啊
举报 回复(0) 喜欢(0)     评分
ljtfjnu
路人甲
路人甲
  • 注册日期2003-10-09
  • 发帖数4
  • QQ
  • 铜币69枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-07-28 11:13
真厉害!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部