当前位置:主页>销售管理软件> 列表

问一个ADO删除记录出现的问题. 找人事档案管理软件

记账软件版1楼: 环境:Delphi7 ADO2.81 SQL2000

在删除一条记录时出现 ADODataSet.Delete(arCurrent) :
BOF 或 EOF 中有一个是"真",或者当前的记录已被删除,所需的操作要求一个当前的记录。

在大富翁上搜索了一下,有很多人提这个问题,最终用D5版本的是要求升级,而其它版本的都是不了了之.请大侠指点一下.这个问题应该怎么解决.
执行删除ADODataSet.Delete(arCurrent)操作时,ADODataSet只有一条记录时出现这种错误的机率最高.

2楼: 可能是Delphi包装ADO时有点问题
试着查一下ADO手册
绕过Delphi的包装试试 如仓库进销存管理

3楼: 安装新的ADO驱动,至少要ado2.6以上,到微软网站上下载

4楼: 下载MDAC 2.8

5楼: To:myatm
happycyp

程序环境:Delphi7 ADO2.81 SQL2000

已经是最新的ADO 2.81,微软官方网站上目前没有比这个更新的版本了. 还有一个ADO 2.82是Windows2003的.

6楼: 使用sql呢?直接delete

记账软件版7楼: To:lxw5214
直接使用SQL语句是没有问题,但不方便.

有哪位大侠知道为什么会出现这个错误提示?

8楼: If Not ADODataSet.Eof Then


ADODataSet.Delete;

9楼: 这个需要下载ado升级包,留下信箱,我给你

10楼: To:墨剑
我的邮箱:tonny2003@163.com

我的ADO已经是最新的2.81版了,Delphi是7.0的,还有什么升级包呀?

11楼: 删除的时候试一下
query.last;
query.first;
然后再删除指定的记录

12楼: To:chengangsir
具体的删除方法
adodataset.first;
if AdoDataSet.RecordCount=1 then
adodataset.delete(arCurrent) //出错 如客户档案管理软件

13楼: 你使用这:
if not adorecordset.eof and not adorecordset.bof then
adorecordset.delete

而不要使用RecordCont来判断.

记账软件版14楼: To:ls210
使用你的方法是可以不出错,但如果ADODataSet剩下一条记录时,会删除不掉.

15楼: 这样:
with ADOTable1 do
begin
Active := True;
first;
while not eof do
begin
delete;
if bof and eof then break;
next;
end;
Active := False;
end;
详细请看本人在这张帖子里的试验:


http://www.delphibbs.com/delphibbs/dispq.asp?lid=3163205
找yzxcsw的回答。

16楼: To: yzxcsw
按您的方法,执行到delete时一样发生错误.

 我是主从关系表,删除从表时,发如果从表只有一条记录.一删除就发生错误.

按您的方法
ADODataSet2.First;
while (not AdoDataSet2.Eof) do
begin
ShowMessage(IntToStr(ADODataSet2.RecordCount)); //显示1条记录
ADODataSet2.Delete; //出错
if (ADODataSet2.Bof) and (ADODataSet2.Eof) then
break;
ADODataSet2.Next;
end;

17楼: 还是习惯于用SQL语句直接删除

18楼: 试试这个
ADODataSet2.First;
while not AdoDataSet2.Eof do begin
ADODataSet2.Delete; //出错
ADODataSet2.First;
end;

19楼: 我一贯的操作是:

if (not aQuery.Active) or aQuery.isEmpty then
exit

try
aQuery.Delete;
except
aQuery.Cancel;
raise;
end;

如果你使用 adoDataSet 来删除,就不要在删完之后 Next 了,会自动的

20楼: 刚才没看懂楼主的意思! :)



你发现没有,这样做有个逻辑问题,就像这样的代码

for i:=0 to aList.count-1 do
begin
aList.delete(i);
end;

这样肯定出错的!发现为什么吗?不但删除不完全,到后面还会出错。

具体到这个例子,可以这样来写:

DBConn.BeginTran;
with aQuery do
begin
First;
while not eof do
begin
try
Delete;
except
DBConn.RollbackTran;
exit;
end;
if bof or eof then break;
end;
end

DBConn.CommitTran;

不要 Next 了,删除掉之后会自动往上提的。就像前面代码一样,需要这样做。
while aList.Count>0 do
begin
aList.delete(0)
end;

记账软件版21楼: 我用的清空语句:
with (MainSource.DataSet as TBBaseDataSet).DetailDataSet do
begin//这里不能使用DisableControls;否则会出错
First;
while not Eof do
Delete;
end;
不可以使用DisableControls,比如在这种情况下就会出错,
关联了一个DBGridEh,而且这个DBGridEh.SumList.Active:=True;

22楼: 你的ADO2.81有问题。
这个问题已经在ADO2.7版本更正。 如人事档案管理软件

23楼: //如果有资料则删除


if DataSet.RecordCount>0 then
begin
DataSet.First;
While ( not DataSet.Eof) do
DataSet.Delete; //在删除最后一条资料的时候照样出错.使用DeleteRecord(arCurrent)也一样出错
end;

24楼: 那我认为应该是其他地方的代码引发的错误.
不然你试试建立一个全新的工程,只加入adoquery,然后执行这段代码会不会出错.

25楼: ADODataSet2.First;
while (not AdoDataSet2.Eof) do
begin
ShowMessage(IntToStr(ADODataSet2.RecordCount)); //显示1条记录
ADODataSet2.Delete; //出错
adodataset2.next;
end;

26楼: To:wrl_001
其它的地方没有错,我新建了一个工程,只做删除这一块,也一样出错.

To:duhai_lee
你说的方法已经试过了,见前边的帖子,一样出错

27楼: 今天发现问题在哪了:ADODataSet2.CacheSize设置为1000时出现这个问题,设置成1不会. 李维的书上讲设置为1000效率最好就设置成1000,结果删除时出问题,上当了,看来不能够改成1000,用默认值一切正常

记账软件版28楼: 数据库表有设置了触发器或关联之类吗?
你把这个新建的工程发给我wrl_001@tom.com;

29楼: 我原来试验不完善,应当是:
while (not eof) do
begin
delete;
if eof and bof then
begin
ShowMessage(''删完了'');
break;
end;
end;

//没有next;

30楼: 发现:ADODataSet2.CacheSize设置为1000时出现这个问题,设置成1不会。
我当年也是犯了这个错误。不知道李维当时做demo时有没有做过测试。

搂主发帖子时,应该把控件属性的非默认设置帖出来。还有具体的代码。这样别人才能够更好的理解。

我发现有一点很有意思,有好多人不看完帖子就回答问题。