都写了10年了,下面的代码,还可以优化吗? ( 积分: 50 )

  • 主题发起人 主题发起人 www.ynxbs.com
  • 开始时间 开始时间
W

www.ynxbs.com

Unregistered / Unconfirmed
GUEST, unregistred user!
m.close;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;m.CommandText&nbsp;:=&nbsp;'select&nbsp;*&nbsp;from&nbsp;NamingTree&nbsp;&nbsp;order&nbsp;by&nbsp;DispID,parentid,NodeID';<br>&nbsp;m.Open;<br>//都写了10年了,下面的代码,还可以优化吗?<br>&nbsp;ParentList&nbsp;:=&nbsp;tstringlist.Create;<br>&nbsp;while&nbsp;not&nbsp;m.Eof&nbsp;do<br>&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParentList.Add(m.fieldbyname('ParentID').asstring);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next;<br>&nbsp;end;
 
试试用&nbsp;Append&nbsp;代替&nbsp;add&nbsp;看看
 
将&nbsp;m.fieldbyname('ParentID')&nbsp;定义一个字段变量,如果m字段比较多的话,速度会有大的提升(假设ParentId不在前面)
 
'select&nbsp;*&nbsp;from&nbsp;NamingTree&nbsp;&nbsp;order&nbsp;by&nbsp;DispID,parentid,NodeID'<br>当数据多时<br>'select&nbsp;parentid&nbsp;from&nbsp;NamingTree&nbsp;&nbsp;order&nbsp;by&nbsp;DispID,parentid,NodeID'<br>没有太多的必要,改用数组或许会好些
 
支持楼上说的,建议不要使用*,如果字段可以确定还是把字段一个一个写出来。如果用*,将来数据库结构变了,多了或少了一个字段的,就很容易出问题的。不支持使用*
 
不支持2楼的<br>Append也只是多调用了一次Add而已
 
。。。。
 
bjzhq说得对。FieldByName每调用一次就会在Fields中搜索指定FieldName的TField。
 
to:liuchong,<br>您再仔细看看Classes单元内的源码,此add非彼add,有差异的。
 
1.试看看能否将ParentList换成数组……。<br>2.DataSet&nbsp;遍历加&nbsp;DisableControls&nbsp;。
 
有点意思,学&nbsp;习
 
你们的答案我非常不满意哦
 
哈哈&nbsp;&nbsp;&nbsp;&quot;非常不滿意&quot;````寫點你的心得出來呀﹐讓我們學習學習```
 
能不能用指针,或者copymemory之类
 
楼主是啥意思?
 
定义一个类<br>暴露类似setdata(alist:tstrings;aFiles:TFIELDS);//可能有拼写错误<br>while&nbsp;not&nbsp;m.eof&nbsp;do<br>setdata(list,fields);<br>m.next<br>之类的方法.或者研究一下迭代子模式。就现在来看,RUBY最爽了,它的内部迭代无与伦比,你几乎看不到循环。
 
uses&nbsp;ADOInt;<br>ParentList.Text:=m.Recordset.GetString(adClipString,m.RecordCount,#9,#13#10,'')
 
DisableControls<br>EnableControls<br>都没用上?<br>用&nbsp;Query1.fields[0].&nbsp;显式的指定应会好点吧。<br><br>&nbsp;&nbsp;ParentList.BeginUpdate;<br>&nbsp;&nbsp;ParentList.EndUpdate
 
function&nbsp;GetStrList(table,&nbsp;field:&nbsp;String;&nbsp;condition:&nbsp;String='';&nbsp;orderby:&nbsp;String='';&nbsp;firstItem:&nbsp;String='';&nbsp;lastItem:&nbsp;String=''):&nbsp;TStringList;<br>var&nbsp;s:&nbsp;String;&nbsp;q:&nbsp;TADOQuery;<br>begin<br>&nbsp;&nbsp;result:=TStringList.Create;<br><br>&nbsp;&nbsp;s:='SELECT&nbsp;'+field+'&nbsp;FROM&nbsp;'+table;<br>&nbsp;&nbsp;if&nbsp;condition&lt;&gt;''&nbsp;then&nbsp;s:=s+'&nbsp;WHERE&nbsp;'+condition;<br>&nbsp;&nbsp;if&nbsp;orderby&lt;&gt;''&nbsp;then&nbsp;s:=s+'&nbsp;ORDER&nbsp;BY&nbsp;'+orderby;<br><br>&nbsp;&nbsp;q:=TADOQuery.Create(nil);<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;q:=GetADOQuery(s);&nbsp;//自己搞个吧:&nbsp;GetADOQuery<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;q=nil&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;firstItem&lt;&gt;''&nbsp;then&nbsp;result.Add(firstItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;not&nbsp;q.Eof&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.Add(q.fieldbyname(field).AsString);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.Next;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lastItem&lt;&gt;''&nbsp;then&nbsp;result.Add(lastItem);<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;q.Free;<br>&nbsp;&nbsp;end;<br>end;<br>//使用&nbsp;GetStrList('NamingTree',&nbsp;'ParentID',&nbsp;'DispID,parentid,NodeID',&nbsp;'全部');
 
我觉得解决这个问题得从三个方面考虑:<br>一:修改原来的查询语句<br>Select&nbsp;parentid&nbsp;From&nbsp;NamingTree&nbsp;&nbsp;order&nbsp;by&nbsp;DispID,parentid,NodeID<br>二:将DataSet中的数据加入数组或StringList中试一下的.<br>三:如果是菜单树的加载,我见意将菜单树分级加载,不然的话一定会慢慢的,楼主也说了都&nbsp;&nbsp;十年了,数据一定也不多了.<br>就像微软的Web帮助一样,先加载一级菜单,当用户点中某一节点时对该节点下的二级进行加载.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部