阅读:2183回复:5
生成shp文件时,往shp中增加记录时速度很慢
<P> while not UDM.cdsMaster.Eof do<BR> begin<BR> FrmSchedule.ProgressBar.Position := i;<BR> Lon := UDM.cdsMaster.FieldByName('LONGTITUDE').AsFloat;<BR> Lat := UDM.cdsMaster.FieldByName('LATITUDE').AsFloat;<BR> PoliceMan := UDM.cdsMaster.FieldByName('NAME').AsString;<BR> HandSet := UDM.cdsMaster.FieldByName('LOGIN_NAME').AsString;<BR> DeptName := UDM.cdsMaster.FieldByName('GROUPID').AsString;</P>
<P> X:=0;<BR> Y:=0;<BR> C:=114.0;<BR> L:=Lon;<BR> B:=Lat;<BR> SgMidServ := TsgMidServ.Create(NIL);<BR> SgMidServ.sgGPSCvtBL2XY(B,L,C,1,Y,X);<BR> Pt.X := X;<BR> Pt.Y := Y;</P> <P> Recs:=IMoMapLayer(MainForm.MostMap.layers.item('警员位置')).Records;<BR> Recs.AddNew;<BR> Recs.fields.item('shape').value:=pt;<BR> Recs.fields.item('NAME').value:=PoliceMan;<BR> Recs.fields.item('LOGIN_NAME').value:=HandSet;<BR> Recs.fields.item('GROUPID').value:=DeptName;<BR> Recs.fields.item('X').value:=X;<BR> Recs.fields.item('Y').value:=Y;<BR> Recs.update;<BR> Recs.stopediting;</P> <P> UDM.cdsMaster.Next;<BR> i := i+1;<BR> end;<BR> UDM.cdsMaster.Close;</P> <P>主要是这段代码很慢:</P> <P> Recs.AddNew;<BR> Recs.fields.item('shape').value:=pt;<BR> Recs.fields.item('NAME').value:=PoliceMan;<BR> Recs.fields.item('LOGIN_NAME').value:=HandSet;<BR> Recs.fields.item('GROUPID').value:=DeptName;<BR> Recs.fields.item('X').value:=X;<BR> Recs.fields.item('Y').value:=Y;<BR> Recs.update;<BR> Recs.stopediting;</P> <P>哪个兄弟有没有好的建议?</P> |
|
1楼#
发布于:2007-06-16 10:53
<P>可以用事务的方式:</P>
<P>//获取记录集,启动事务</P> <P> function THHUGIS.openRsForHugeAdd(ln:string):boolean;<BR>var<BR> index:integer;<BR> wddl : IMoMapLayer; <BR>begin<BR> result:=false;</P> <P> index:=getLayerIndex(ln);<BR> if (index<0) then exit;</P> <P> wddl := getLayerObject(ln);<BR> rsForHugeAdd := IMoRecordset(wddl.Records);<BR> rsForHugeAdd.AutoFlush := false;<BR> rsForHugeAdd.StartTransaction();<BR> <BR> result:=true;<BR>end;</P> <P>反复增加记录</P> <P>function THHUGIS.addElementToRsForHugeAdd(id:integer; x, y:double; d:double):boolean;<BR>var<BR> p:IMoPoint;<BR> field:IMoField;<BR>begin<BR> p := IMoPoint(CreateOleObject('MapObjects2.Point'));<BR> p.X := X;<BR> p.Y := Y;<BR> RsForHugeAdd.AddNew();<BR> if (RsForHugeAdd.EditMode = moEditAdd) then<BR> begin</P> <P> field:= IMoField(RsForHugeAdd.Fields.Item('ID'));<BR> field.Value := id ;<BR> field:= IMoField(RsForHugeAdd.Fields.Item('Shape'));<BR> field.Value := p;<BR> field:= IMoField(RsForHugeAdd.Fields.Item('prop'));<BR> field.Value := d;<BR> RsForHugeAdd.Update();<BR> end;<BR> result:=true;<BR>end;</P> <P>//提交失误</P> <P>function THHUGIS.closeRsForHugeAdd():boolean;<BR>begin<BR> rsForHugeAdd.CommitTransaction();<BR> rsForHugeAdd.AutoFlush := true;<BR> <BR>end;</P> <P>我用的20几万个点很快就加载完毕</P> |
|
2楼#
发布于:2007-07-30 17:07
<P>现在的问题不是读数据慢,而是生成shp文件时很慢</P>
|
|
3楼#
发布于:2007-07-31 13:22
<img src="images/post/smile/dvbbs/em05.gif" />
|
|
4楼#
发布于:2007-10-07 10:23
<P>recordset.autoflush=false</P>
<P>插入数据</P> <P>recordset.autoflush=true</P> |
|
|
5楼#
发布于:2007-10-07 10:25
<P>二楼说的是对的,关键不是启用事务,而是启用批提交</P>
|
|
|