一个看似简单其实挺难的问题,有兴趣的朋友进来看看(10分)

  • 主题发起人 主题发起人 Fuweng
  • 开始时间 开始时间
to 温柔一刀:
真是冤枉!你仔细看清楚我说的话!
"我确实没有用过ADO,但昨天试用之后怎么感觉效率很低呢!"
~~~~~~~~
这里的"效率很低"是指我用ADO访问数据库效率很低.
"你这段代码我回去看看,若效率低干脆就不用序号了,代码只做经验收藏起来."
~~
全"怪"你审题不清!哈哈!人家不辞辛劳地给我解答问题,却落个不是,简直是太不象
话了!!代码我试了,在我的老奔上运行还可以(奔腾133,32M,4.3G,S3 765...),在单
位肯定更没问题!本来序号可有可无,只是为了领导看着方便.
总结一下,通过此题得到的最大收获不是你这段代码(代码并无难度),而是思路!
你这种方法属于是在数据集出来之后再将序号加上的,由于加序号是本地运行,所以
比较快.过几天好好把"存储过程"攻一下,将"由于加序号是本地运行"中的本地换成
服务器端,我想那应该是除了ADO之外的最佳方法.
看看别人还有什么高见,明天结束此问题.
 
用ADO怎么会效率低?用ado访问MS SQL效率是相当高的,甚至可以绕过ODBC直接访问
SQL数据库。
 
我的代码已经再次改进,效率提高数十倍,
因此你再在P133上试试,想必绝对没问题。
(再次提醒,请不要把我的代码与其他效率问题说到一起去,
即使出现在同一句话里,也让人看着难受 :-)

代码如下:(使用二分搜索定位bookmark)

procedure TForm1.recnoGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
var
i:Smallint;
ab:TBookMark;
begin
with Sender.DataSet do
begin
ab:=getbookmark;
text:=inttostr(BSearch(sender.DataSet,ab,bklist)+1);
freebookmark(ab);
end;
end;

function TForm1.BSearch(dataset:TDataset;sbmark: TBookmark; bmarkList: tlist): integer;
var
sIndex,eIndex,midIndex,ipos:integer;
begin
result:=dataset.comparebookmarks(sbmark,bmarkList[0]);
if result=0 then Exit
else result:=-1;

sIndex:=0;
eIndex:=bmarkList.Count-1;
while (result= -1) and (sindex<>eindex) do
begin
midIndex:=(sIndex+EIndex+1) div 2;
ipos:=dataset.comparebookmarks(sbmark,bmarkList[midIndex]);
if ipos=0 then
result:=midIndex
else
if ipos<0 then
eIndex:=midIndex
else sIndex:=midIndex;
end;
end;

别忘了,这题可是200分哟! :-)
 
to apartment:
ADO的问题是我没用好,以后再说吧!

此问题该结束了.
chji: 5分 因为是他先提出用ADO的方法可以.
温柔一刀: 5分 剩余的195分我会分期还清的.
 
多人接受答案了。
 
此问题有又新进展!

在我回答另一个问题时,琢磨出在一定条件下可以直接通过SQL来产生ID号。
详见http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=318597

而且条件还算比较“宽松”...(作洋洋自得状)
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部