adoquery1.Eof 循环问题(总丢失一行)! ( 积分: 10 )

  • 主题发起人 主题发起人 bjxiangshan
  • 开始时间 开始时间
B

bjxiangshan

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是在本论坛看到的一个例子:但是发现一个问题
procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery1.Close ;
adoquery1.SQL.Clear ;
adoquery1.SQL.Add('select * from table1');
adoquery1.Open;

adoquery1.Frist;
while not adoquery1.Eof do
begin
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);
adoquery1.next;
end;
adoquery1.Close ;

end;

就是如果ADOQuery1.RecordCount=1的时候,这段代码就没有执行,因为只有一行也就是最后一行,刚好跳过(while not adoquery1.Eof do)的范围。
而在程序中,即使一行也是要执行才对!
以上代码如何修正呢?
 
BOF、EOF 属性
BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前。


EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后。
返回值

BOF 和 EOF 属性返回布尔型值。

说明

使用 BOF 和 EOF 属性可确定 Recordset 对象是否包含记录,或者从一个记录移动到另一个记录时是否超出 Recordset 对象的限制。

如果当前记录位于第一个记录之前,BOF 属性将返回 True (-1),如果当前记录为第一个记录或位于其后则将返回 False (0)。

如果当前记录位于 Recordset 对象的最后一个记录之后 EOF 属性将返回 True,而当前记录为 Recordset 对象的最后一个记录或位于其前,则将返回 False。

如果 BOF 或 EOF 属性为 True,则没有当前记录。

如果打开没有记录的 Recordset 对象,BOF 和 EOF 属性将设置为 True,而 Recordset 对象的 RecordCount 属性设置为零。打开至少包含一条记录的 Recordset 对象时,第一条记录为当前记录,而 BOF 和 EOF 属性为 False。

如果删除 Recordset 对象中保留的最后记录,BOF 和 EOF 属性将保持 False,直到重新安排当前记录。
 
最后一行<>Eof
adoquery1.Frist;这个可以去除。试试
。。不过一般没有出现你这种情况
 
楼主在胡说吧,不可能阿
EOF不是最后一条记录,是文件结尾。
 
LZ的代码好像没问题,可以通过啊!COMBOBOX可以取到记录!
要说错误好像是FIRST打错了!
 
道理是这个理,但是实际操作的确碰到上面的现象
 
你测试了吗?你的代码?...
for i:=0 to adoquery1.recordcount-1 do
begin
...
adoquery1.next;
end;
ACCESSc测试没问题,可能SQL SERVER有..
 
combobox1.Items.clear
first写错了
 
回复angellover
的确测试了的
是SQL SERVER数据库
这个问题怎么解决呢
我这样来做
if ADOQuery1.RecordCount=1 then
begin
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);end;
while not adoquery1.Eof do
begin
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);
adoquery1.next;
end;
但是这样又发现数据记录变多了
 
如何解决啊,兄弟们支招
 
我已经测试过了SQLSERVER,没有任何问题,楼上的人们已经说了,EOF不是最后一条记录。我刚才测试过了,没有任何问题。
 
是不是你电脑有问题呀,代码没有任何问题
 
if ADOQuery1.RecordCount=1 then
begin
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);end; //这里添加了一条
while not adoquery1.Eof do //按你的理论以下语句应该没有执行,怎么会多呢
begin
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);
adoquery1.next;
end;
但是这样又发现数据记录变多了
 
我是在公司一个程序实际应用,没有办法
(原始代码和这也许有些差别,道理确实是上面的)
我这样输入代码后,问题得到解决
分两部分执行
if ADOQuery1.RecordCount=1 then
begin
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);
end; //这里添加了一条
if ADOQuery1.RecordCount>1 then
begin
while not adoquery1.Eof do
begin
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);
adoquery1.next;
end;
end;
问题已经得到解决
至于什么原因,目前还不清楚,希望大家继续关注
 
顶起,希望多多关注!
需要源代码验证的朋友,可以与我联系
tashanenjoy@126.com
 
combobox1.Items.Add(adoquery1.fieldbyname('id').asstring);
这句可能有问题
我猜测可在combobox1 onchange事件 里面有刷新了adoquery1
导致当前记录在最后一条记录之后
 
楼主在胡说
 
看看别的事件里是否有处理,我想应该是别的事件里有处理才会样子的
 
原码没问题,可能是加进去的地方出了问题,adoquery1.Frist;写错了!
 
代码没有错误,鉴定完毕!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
740
import
I
I
回复
0
查看
847
import
I
I
回复
0
查看
503
import
I
后退
顶部