大侠请进:ADO数据库应用程序出现'对象处于zombie状态'应该怎么解决?
在Delphi的ADO数据库应用程序中出现错误:
ITransaction::Commit 或Itransaction::Abort被调用,并且对象处于zombie状态
这是怎么回事?应该怎么解决呀?
环境D7+ADO2.8+SQL2000
问题点数:100、回复次数:9Top
1 楼caiso(十年磨一剑)回复于 2005-01-03 09:00:49 得分 0
顶一下Top
2 楼Kshape(C/C++初学者~~~~)回复于 2005-01-03 09:50:54 得分 30
例如:A 表中有10条记录,我要将这10条记录,插入B表中。
我代码是这样写的
dim rs
set rs=server.createobjct("adodb.recrodset")
sql="select * from a"
rs.open sql,conn,1,1
do while not rs.eof
sql="insert into b (dd,aa) values ('" & trim(rs("dd")) & "','" & trim(rs("aa")) & "')"
conn.begintrans
conn.execute(sql)
if conn.errors.count>0 then
conn.rollbacktrans
response.write "对不起,你提交出错了!"
else
conn.committrans
end if
rs.movenext
loop
rs.close
set rs=nothing
这样子会出现以下错误
Microsoft OLE DB Provider for SQL Server 错误 '8000ffff'
ITransaction::Commit 或 ITransaction::Abort 被调用,并且对象处于 zombie 状态。
/shop/txdhd.asp,行15 (rs.movenext这名出现)
//请问有办法解决吗?
=========================================================================
//这样字就好了
dim rs
set rs=server.createobjct("adodb.recrodset")
sql="select * from a"
rs.open sql,conn,1,1
conn.begintrans //put here
do while not rs.eof
sql="insert into b (dd,aa) values ('" & trim(rs("dd")) & "','" & trim(rs("aa")) & "')"
conn.execute(sql)
if conn.errors.count>0 then
conn.rollbacktrans
response.write "对不起,你提交出错了!"
response.end
end if
rs.movenext
loop
conn.committrans //最后提交事务
rs.close
set rs=nothing
Top
3 楼Kshape(C/C++初学者~~~~)回复于 2005-01-03 09:54:00 得分 30
所以:
最好是调用数据库系统中的事务控制
并写上事务标识
begin transaction T1
回滚时也带上T1标记
在sql server中,在insert,update,delete语句后系统会自动增加commit transaction
(应该是吧,如果没记错.......)
Top
4 楼kuki84(天道酬勤)回复于 2005-01-03 11:27:13 得分 10
upTop
5 楼siaosa()回复于 2005-01-03 21:12:29 得分 0
我是这样使用才出错的.
ADOConnection1.BeginTrans
try
ADOConnection.exec('.....');
except
ADOConnection1.RollbackTrans;
end;
ADOConnection1.CommitTrans;
Top
6 楼Kevin_Lmx(繁华阅尽)回复于 2005-01-03 21:18:43 得分 30
应该是你的SQL语句有错误,所以事务回滚了,也就是执行了ADOConnection1.RollbackTrans;这一句,然而在异常处理后你又添加了一句ADOConnection1.CommitTrans;,此时你的事务已经回滚,再提交当然就出错了。
改为:
ADOConnection1.BeginTrans;
try
ADOConnection.exec('.....');
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
end;
另外,先检查你的SQL语句吧。Top
7 楼siaosa()回复于 2005-01-04 08:45:50 得分 0
改成:
try
ADOConnection1.BeginTrans;
ADOConnection.exec('.....');
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
end;
也报同样的错误. SQL语句是正确的.跟踪调试,它是执行了CommitTrans语句的.
ITransaction::Commit 或Itransaction::Abort被调用,并且对象处于zombie状态Top
8 楼siaosa()回复于 2005-01-04 09:54:53 得分 0
try
ADOConnection1.BeginTrans;
ADODataSet1.UpdateBatch(arAll)
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
end;
也报错:ITransaction::Commit 或Itransaction::Abort被调用,并且对象处于zombie状态Top
9 楼siaosa()回复于 2005-01-04 10:26:50 得分 0
有没有办法判断出ADOConnection是否处在zombie状态?Top




