关于asp使用SQL回滚事物的解决方法

召耳先生 2009-07-23 03:37:07
Function Login()


if cstr(session("GetCode"))<>cstr(request("checkCode")) then
Response.Write("<script>alert('验证有误,请重新计算');window.navigate('login.asp');</script>")
'response.Redirect("index.asp")
response.End()
end if

Username=Request.Form("Username")
Password=Request.Form("Password")
dlip=Request.ServerVariables("REMOTE_ADDR")

Session("Userzsname")=""
Session("userUname")=""
Session("UserID")=""
session("dltime")=""
Session("dlhits")=""
Session("dlip")=""
session("jifen")=""
session("dj")=""



'cn.BeginTrans '事务开始 '开始一个事务

str="select * from member where Username="& Sqlstr(Username)
Set objrs=Cn.execute(str)
if not objrs.eof then
if Password=objrs("Password") then
Session("UserID")=objrs("UserID")
Session("Userzsname")=objrs("zsname")
Session("userUname")=objrs("username")
session("dltime")=objrs("dltime")
Session("dlhits")=objrs("dlhits")+1
Session("dlip")=objrs("dlip")
session("zctime")=objrs("addtime")
session("dj")=objrs("dj")
jfmx="每日登陆获取10分积分!"
djmx="每日登陆获取1点劵"
dj=1
bz=""
jf=10
stime=FormatDate(now(),2)


sstr="select * from jflog where username="&sqlstr(session("useruname"))&" order by jfid desc"
set rrs=cn.execute(sstr)
if not rrs.eof then
if stime=formatdate(rrs("addtime"),2) then


a="Update member set dlhits=dlhits+1,dltime=getdate(),dlip='"&dlip&"' where userID=" & Session("UserID")
Cn.execute(a)
session("jifen")=objrs("jifen")
else
b="Update member set dlhits=dlhits+1,dltime=getdate(),dlip='"&dlip&"',jifen=jifen+10,dj=dj+1 where userID=" & Session("UserID")
Cn.execute(b)

c="insert into jflog(userid,username,addtime,jfmx,bz,jf,ip) values(" & sqlstr(Session("UserID")) & "," & sqlstr(Session("userUname")) &",getdate()," & sqlstr(jfmx)&"," & sqlstr(bz)&"," & sqlstr(jf)&"," & sqlstr(dlip)&")"
cn.execute c
session("jifen")=objrs("jifen")+10

f="insert into djlog(userid,username,addtime,djmx,bz,dj,ip) values(" & sqlstr(Session("UserID")) & "," & sqlstr(Session("userUname")) &",getdate()," & sqlstr(djmx)&"," & sqlstr(bz)&"," & sqlstr(dj)&"," & sqlstr(dlip)&")"
cn.execute f
session("dj")=objrs("dj")+1



end if
else
d="Update member set dlhits=dlhits+1,dltime=getdate(),dlip='"&dlip&"',jifen=jifen+10,dj=dj+1 where userID=" & Session("UserID")
Cn.execute(d)

e="insert into jflog(userid,username,addtime,jfmx,bz,jf,ip) values(" & sqlstr(Session("UserID")) & "," & sqlstr(Session("userUname")) &",getdate()," & sqlstr(jfmx)&"," & sqlstr(bz)&"," & sqlstr(jf)&"," & sqlstr(dlip)&")"
cn.execute e
session("jifen")=objrs("jifen")+10

g="insert into djlog(userid,username,addtime,djmx,bz,dj,ip) values(" & sqlstr(Session("UserID")) & "," & sqlstr(Session("userUname")) &",getdate()," & sqlstr(djmx)&"," & sqlstr(bz)&"," & sqlstr(dj)&"," & sqlstr(dlip)&")"
cn.execute g
session("dj")=objrs("dj")+1
end if
'======================================================
'用户每天登陆都可增加10积分,每天只计一次 ,每天重复登陆N次也只加一次积分
'以上要认真看看,可能要修改成回滚事物来处理。
'======================================================

response.Redirect("/member/")


%>
<%else%>
<script language="JavaScript">
alert('密码错误!')
</script>

<%end if%>
<%else%>

<script language="JavaScript">
alert('用户名错误!')
</script>
<%
end if


' if cn.Errors.Count=0 then
' cn.CommitTrans '如果没有conn错误,则执行事务提交
'else
' cn.RollbackTrans '否则回滚
'end if

End Function



本人想实现上面回滚操作,因为上面要执行三四次或更新或写入的操作。我现在想如果其中一步出错了。就执行回滚。前面已经执行过的自动无效。
但是本人写了之后,老是出错,请各位帮我看看。
错误说是那一个CONN没有关闭。我也搞不清了。请大家帮忙。
我现已经回滚的部分注释了
...全文
179 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
toury 2009-07-25
  • 打赏
  • 举报
回复
你SET了两个以上的记录集:
Set objrs=Cn.execute(str)


set rrs=cn.execute(sstr)

在使用事务时,不能使用超过一个的动态游标!而SET恰恰是动态的。

解决方法:
1、SET之后把记录集的EOF保存一下,例如:
blnObjrsEOF=objrs.eof
if not blnObjrsEOF then
' 取出数据.........
' 关闭记录集

end if
然后再去SET rrs
rrs也照此办理

2、把CursorLocation设为3,rrs.open sql,conn,1,1,1打开
召耳先生 2009-07-25
  • 打赏
  • 举报
回复
我把回滚事务打开后,出现的错误
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'

在事务中,不能存在多个使用此游标类型的记录集。请更改游标类型、提交事务,或关闭其中某个记录集。

/member/login.asp,行 217


错误就是这行: set rrs=cn.execute(sstr)

toury 2009-07-23
  • 打赏
  • 举报
回复
错误出在第几行?这样试试:

if cn.state<>1 then
response.write"<h3>数据库没连上,还回滚什么?<h3/>"
response.end
end if
cn.BeginTrans '事务开始 '开始一个事务

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧