level 1
D7中TClientDataSet使用的问题,为什么游标不在头也不在尾,bof和eof中却有一个为真呢?
RecordCount>0情况下,调用First,竟然bof或eof中有一个为真,是D7的Bug吗,麻烦有碰到这个问题的高手说说
2010年08月05日 10点08分
1
level 6
LZ
调用First后,游标移到了BOF位置,BOF当然是真的了。
调用First后,BOF不是真才会是BUG呢。
你试下调用Last,看看EOF会不会变成真呢。
2010年08月05日 14点08分
2
level 0
各位,bof应该是在第一条记录之前的位置才真吧, First是跑到第一条记录,bof应该为假才对
2010年08月07日 02点08分
4
level 1
那我想问问大家,在Delhpi的DataSet或Table这些中,如何判断当前的游标是否指向了一条记录
2010年08月07日 02点08分
5
level 6
好象你自己都知道
当RecordCount>0,而且 bof和eof都不是True的情况下,当前的游标是指向了一条记录
2010年08月07日 03点08分
6
level 1
Fit大虾 你说的对,理论上 bof和eof都不为True的情况下,应该是指向了一条记录,但是我在使用TClientDataSet的时候就碰了上面我所说的奇怪事情,就是在游标指向了一条记录后,在bof和eof其中却有一个为true
2010年08月07日 06点08分
7
level 6
我经常用TClientDataSet,什么问题都没有,估计是你的代码的问题。
2010年08月08日 04点08分
8
level 1
if tcds.bof or tcds.eof then
beign
showmessage('请选择记录!');
exit;
end;
showmessage(tcds.fieldbyname('xxx'));
以上测试时,会弹出'请选择记录' 的对话框
当把以上代码改为
showmessage(tcds.fieldbyname('xxx').asstring);
测试时,弹出显示xxx字段值的对话框
小弟是用D7在使用TClientDataSet绑定DBGrid时出现以上问题
Fit大虾你是没这样用过所以才没碰到这样的问题吧
2010年08月11日 07点08分
9
level 6
看了一下BOF和EOF的解释,其实BOF和EOF是一个标记而已,用来表示游标到了开头或者到了结尾。跟所谓的什么控件没有关系。
当RecordCount>0时,BOF或者EOF有一个TRUE,游标同样指向记录,bof为TRUE时,指向第一条记录,eof为TRUE时,指向最后一条记录。记录集空的时候,BOF和EOF同时为TRUE。
BOF平时很少使用,EOF使用比较多。看看我下面的语句:
q:tadoquery;
……
q.Open;
//执行完OPEN打开数据库后,马上判断是否EOF,TRUE表示这个数据库是空的。
if not q.eof then//EOF非TRUE表示这个记录集不是空的,也可以用IsEmpty代替此句EOF
begin
//下面执行循环
while not q.Eof do //此处用EOF判断游标是否到了末尾
begin
showmessage(q.fieldbyname('BigKindName').AsString); //
q.next;//游标移到下一条记录
//如果当前记录已经是最后一条记录,执行next则把EOF设为TRUE后什么也不干
end;
end;
/////同样道理,你可以把上面语句改成这样
if not q.IsEmpty then //IsEmpty为TRUE表示这个记录集是空的
begin
q.last;//先移到最后,在用循环从后往前移动游标
while not q.bof do //此处用BOF判断游标是否到了开头
begin
showmessage(q.fieldbyname('BigKindName').AsString); //
q.Prior;//游标移到前一条记录
//如果当前记录已经是第一条记录,执行Prior则把BOF设为TRUE后什么也不干
end;
end;
2010年08月12日 03点08分
10
我碰到的是查询结果35条或以下时,指向最后一条记录Eof为FALSE,但是大于35条记录,同样指向最后一条Eof为TRUE,不知何解?
2017年03月30日 02点03分
level 6
讨论过程,以后面说的为准,另外“实践是检验真理的唯一标准”,你除了看文挡,还要实践一下。
你参看的是不是VB的文档?
例如执行一下last后EOF马上变成TRUE,showmessage(q.fieldbyname('XXX').AsString); 出来的是最后一条记录。
在DELPHI,有记录的情况下,BOF和EOF是个标记,在BOF真情况下执行Prior或者EOF真执行Next不会导致出错。
你可以去ADOTABLE和ADTQUERY等去试一下。
2010年08月17日 06点08分
12
level 6
我以前也是用VB和ASP的,改学DELPHI不久,所以开头也和楼主一样理解,后来测试过几次,才知道DELPHI和M$的ADO是有区别的,正是LZ提到的部分。
在有记录的情况下,测试了一下,结果真的不一样。
1,
VB里,执行了q.Recordset.MoveFirst后,游标指向第一条记录,但BOF是FALSE的。
DELPHI里执行了q.first后,游标指向第一条记录,但BOF是TRUE的。
VB里,执行了q.Recordset.MoveLast后,游标指向最后一条记录,但EOF是FALSE的。
DELPHI里执行了q.last后,游标指向最后一条记录,但EOF是TRUE的。
2,
VB里如果BOF是真,再执行q.Recordset.MovePrevious就会出错,DELPHI则无论Prior多少次,也是什么也不干,所以不会报错。EOF为真的情况下执行next也是,VB报错DELPHI不报错。
也就是说,
VB:当RecordCount>0,而且 bof或者eof是True的情况下,游标不指向记录
DELPHI:当RecordCount>0,而且 bof或者eof是True的情况下,游标指向记录
所以微软的ADO文档不一定对DELPHI有参考作用,作好还是自己实践一下。
2010年08月17日 07点08分
13
level 1
没错,跟使用VB的ADO是有点不同的
所以才郁闷,像在VB中可以通过 not rs.eof and not rs.bof 这样来判断游标是否指向了某条记录
但是使用delphi就没办法这样判断了,因为当指向第一条记录或最后一条记录的时候,rs.bof和rs.eof是有可能为true的
所以我就想问问,在delphi中如何判断当前游标是指向了某条记录,包括第一条和最后一条
2010年08月19日 09点08分
14
level 1
那么我想会不会是,只要recordcount>0,那么就一定指向某一条记录!!
2010年08月19日 09点08分
15