# 这可不是正确的做法!!!

Posted by 阿晴 on October 17, 1997 at 15:12:02:

In Reply to: 不要加 MoveFirst ! posted by 小吴 on October 17, 1997 at 07:01:52:

你开资料库的方法不可以用 dbOpenDynaset, 否则你一定会抓不准
Rs(Recordset).AbsolutePosition --> 目前资料库指标位置.
而且, 最大的缺点是你不可以用 Seek 这个指令, 所以:
虽然你用 Dynaset 开档时它会自动帮你把资料依 Key 值排好, 这
样好像我们可以少做排序这个动作, 而且 Add资料时它也会依 Key
值排好, 这只是一种假象. 因为, 你在 Seek 资料时, FindFirst
是从资料库第一笔找到最后一笔, 这种方法称之为 "暴力搜寻法",
如果你的资料量很大, 那劝你还是不要用这种方法, 会让硬碟累死
的!!!
但是, 如果你是用 OpenTable 那就不同了, 再大的资料量也可以
在瞬间找到 (6万笔不用0.1秒, 用 Rs.Seek ">=" PrimaryKey) ,
这样你建 "索引" 才有意义, 否则建了索引郤用 OpenDynaset,
一点也看不出来你建索引有何意义. 注意: Dynaset 不可以用
Seek 方法, 而 Table 不可以用 AbsolutePosition!!
我之前也是用 OpenDynaset , 结果还要多设 2个变数 -> 一个存
目前的动作指标, 称之为程式指标; 一个存 Rs.RecordCount 总
记录数. 因为, AbsolutePosition不一定正确, 但是我们程式计算
的结果一定正确, 例如: AddNew 时, 如果 UpDate 则总笔数要
加一, 但是资料库的 RecordCount 可不会加一, 所以要你自已去
指定, AbsolutePosition也一样. MoveNext 加一, MovePrevious
减一, MoveFirst = 0, MoveLast = RecordCount.
除此之外还要设 BookMark, 用在新增及删除时. 而且删除时, 你
要注意一下资料指标, 如果你删最后一笔, 再按 PageDown移到下
一笔时, 错误讯息出现了 --> 没有现用的记录!!! 所以,如果删的
是最后一笔则要先 BookMark 起来再往前移动 2笔, 这样才不会
有问题. Why? 举例: 如果资料总数为 100, 你要删第一百笔, 则
要确定先让 AbsolutePosition = 99, 然后 Rs.Delete , UpDate.
此时 AbsolutePosition 还停在 99 的位置, 你要告诉它先移回来
然后再做其它的动作, 否则一下没处理好, 就出错了! 这种方法比
较不好! 比较正统的方法是用 Index. 保证立刻让你少了 3个变
数, 而且怎么删都不会出错, 不用 BookMark 都没关系, 删第一
笔跟最后一笔也不用做特别处理 & 判断!
你可以先到 http://www.kj.com.tw DownLoad 王国荣在 Run!PC
发表的资料库专栏, 一共有四份, 那里面对 "索引" 讲得很清楚!
有问题再 mail 给我.
eipper@ms14.hinet.net

Follow Ups:

- 感谢二位！我再试试看. 有问题再向你（妳）们请教　（无内文） 巨蟹座女子 19:38:47 10/17/97 (0)