关于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没有关闭。我也搞不清了。请大家帮忙。
我现已经回滚的部分注释了
...全文
176 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 '事务开始 '开始一个事务
commons-beanutils.jar Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。 commons-collections.jar Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大 commons-lang.jar Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 commons-logging.jar: Apache Commons包中的一个,包含日志功能 commons-io.jar Apache Commons包中的一个,java.io.*的扩展,输入输出,支持文件上传 commons-fileupload.jar Apache Commons包中的一个,是一个通过Http接收上传的文件并处理结果文件的库 dom4j-1.4.jar 和 jaxen-1.1.1.jar 是一个Java的XML API,类似于jdom,用来读写XML文件的。Hibernate使用dom4j解析XML配置文件和XML映射元文件。必需的。 ehcache-1.2.jar Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 hibernate3.jar hibernate3的核心类库。 itext.jar 是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iTextAsian.jar itext中关于亚洲编码的类库,在这里用于中文字体的输入。 junit.jar Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用。 commons-digester.jar Apache Commons包中的一个,通过它可以很方便的解析xml文件生成java对象 aspectjrt.jar 和aspectjweaver.jar Annotation 方式实现 AOP commons-dbcp.jar commons-pool-1.2.jar DBCP数据库连接池 cglib-nodep-2.1_3.jar CGLIB是一个强大的高质量高性能的代码生成库,在运行时可以用它来扩展Java类 jfreechart-1.0.12.jar 使用java生成图表的工具 log4j-1.2.15.jar 通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器 jxl-2.6.jar 通过java操作excel表格的工具类库 jta-1.1.jar Java事务API,为J2EE平台提供了分布式事务服务 lucene-core.jar 、lucene-highlighter.jar 、compass-index-patch.jar、 compass-2.1.0.jar 是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 json-lib-2.2.3-jdk15.jar json和java转化的辅助工具 flexjson.jar java到json串的转换 gson-1.3.jar java到json串的转换 ognl-2.6.11.jar OGNL表达式所需要的包,支持EL htmlparser.jar 强大的html解析器 jcommon-1.0.15.jar 使用java生成图表的工具 freemarker-2.3.8.jar 模板相关操作需要包 struts2-core-2.0.14.jar struts2核心包 struts2-spring-plugin-2.0.14.jar struts2整合spring所需要的包 xwork-2.0.7.jar xwork核心包 antlr-2.7.6.jar 一个语言转换工具, Hibernate利用它实现 HQL 到 SQL 的转换模板相关操作需要包 javassist-3.9.0.GA.jar 代码生成工具 Hibernate用它在运行时扩展 Java类和实现,同cglib包 slf4j-api-1.5.8.jar和slf4j-log4j12-1.5.0.jar hibernate使用的一个日志系统 spring.jar spring核心包 spring-security-core-2.0.4.jar 和 spring-security-taglibs-2.0.4.jar

28,406

社区成员

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

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