ASP事务提交方法
很多时候,需要每次批量执行SQL,尤其是有些不能用存储过程的时候,程序写起来比较麻烦。
为了简单,写了下边的这个函数。只要将数据库连接对象,和由sql文组成的1维数组传递进去,
就可以实现批量的执行SQL语句,并在任何一条语句执行失败的时候回滚.
Function RunSQL(ByRef conDB, ByVal arrSQL) Dim l_intICount On Error Resume Next If UCase(TypeName(conDB)) = UCase("Connection") Then RunSQL = -1 Exit Function End If conDB.BeginTrans() If IsArray(arrSQL) Then For l_intICount=0 To UBound(strSQL) conDB.Execute strSQL(l_intICount) If conDB.Errors.Count > 0 Then conDB.RollbackTrans() JAfnc_ExecSQL = -1 Exit Function End If Next Else conDB.Execute strSQL If conDB.Errors.Count > 0 Then conDB.RollbackTrans() JAfnc_ExecSQL = -1 Exit Function End If End If conDB.CommitTrans() JAfnc_ExecSQL = 1 End Function
————————————————
版权声明:本文为CSDN博主「SanndyTian」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sanndytian/article/details/1575924
在开发Web应用时,无一例外 地需要访问数据库,以完成对数据的查询、插入、更新、删除等操作。受应用逻辑的影响,有时需要将多条数据库操作指令组成一个工作单元(事务)。在数据库 中,所谓事务是指一组逻辑操作单元,它使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,应当用离散的成组的逻辑单元操作数据:当它全部完 成时,数据的一致性可以保持;而当单元中的一部分操作失败时,整个事务会被全部忽略,所有从起始点以后的操作全部退回到开始状态。
实际上,在默认方式下对数据库的每一次操作都是隐含的事务处理。本文以一个典型的用户注册程序为例,介绍三种利用ASP实现事务处理的方法:基于ASP数 据库组件的解决方法、基于数据库内部的事务处理机制的解决方法和基于MTS组件的解决方法。 程序功能 在SQL Server数据库中建立两个表:USER表和USERDOC表。其中USER表中存放的是注册用户的用户名和密码,USERDOC表中存放的是该注册用 户的个人资料,并且以用户名为索引。下面是表USER和USERDOC的定义: Create Table USER(userName varchar(30),userPasswd varchar(30)) Create Table USERDOC(userName varchar(30),Age int,Sex int,PhoneNumber varchar(20),Address varchar(50))
当用户请求注册时,ASP脚本先将用户名和密码插入到USER表中,然后在USERDOC表中插入用户个人信息(年龄、性别、联系电话和家庭住址等)。同时,应用程序还必须保证USER表中的每一条记录在USERDOC表中都有相应的记录。
方法一 利用ASP内置ADO组件中的Connection对象可以实现对数据库操作的事务性处理。Connection对象的部分方法如下:
●Connection.BeginTrans方法:启动一个事务;
●Connection.CommitTrans方法:完成/提交一个事务;
●Connection.RollBackTrans方法:撤消/放弃一个事务。
//启动一个事务操作 <% Conn.BeginTrans %> <% sqlText="Insert into USER(userName,userPasswd) values('" %> <% sqlText=sqlText & request("usrName") & "','"&request("usrPasswd")&"') " %> <% conn.execute(sqlText) %> <% if conn.Errors.Count>0 then %> <% conn.Errors.Clear %>
//如果插入数据操作失败,则事务向前回滚
<% conn.RollBackTrans %> <% response.Redirct RegisterFail.html %> <% end if %> <% sqlText="Insert into USERDOC(userName,Age,Sex,PhoneNumber,Address) "%> <% sqlText=sqlText & "values('"& request ("usrName") & "', " & request("Age") %> <% sqlText=sqlText & ",'" & request ("PhoneNum") & "','" %> <% sqlText=sqlText & request("Address") & "') " %> //执行事务单元中的第二条插入语句 <% conn.execute(sqlText) %> <% if conn.Errors.Count>0 then %> <% conn.Errors.Clear %>
//如果操作失败,则事务向前回滚 <% conn.RollBackTrans %> <% response.Redirct RegisterFail.html %> <% end if %>
//如果整个事务操作执行正确,则提交事务 <% Conn.CommitTrans %>
//转向注册成功处理页面 <% response.Redirct RegisterOk.html %>
方法二 可以利用数据库系统内部的事务处理机制,通过在数据库服务器中编写包含事务的存储过程,完成对数据操作的事务处理。同时,利用ADO组件调用存储过程,还可以根据存储过程的返回代码判断事务处理是否执行成功。
在数据库系统中,每一条SQL语句都是一个事务。因此可以保证每条语句要么完成,要么退回到开始之处。但是如果希望一组SQL语句的操作要么全部完成,要么全部无效,就需要利用数据库的事务处理机制来实现。
在数据库中生成存储过程的主要代码如下:
Create proc RegisterUser (@usrName varchar(30), @usrPasswd varchar(30),@age int, @PhoneNum varchar(20), @Address varchar(50) ) as begin //显示定义并开始一个事务 begin tran insert into USER(userName,userPasswd) values(@usrName,@usrPasswd) if @@error<>0 begin //操作失败,则事务回滚 rollback tran //返回存储过程,并设置返回码为事务操作失败return -1 end insert into USERDOC(userName,age,sex,PhoneNumber,Address) values(@Usrname,@age,@PhoneNum,@Address) if @@error<>0 begin //操作失败,则事务回滚 rollback tran return -1 end //如果操作执行正确,则提交事务 commit tran return 0 end
在ASP脚本中调用数据库存储过程的主要代码如下:
<% Set Comm=server.CreateObject ("ADODB.Command") %> <% Set Comm.ActiveConnection=conn %> <% Comm.CommandType=adCmdStoredProc %> <% Comm.CommandText="RegisterUser" %> //创建存储过程返回参数对象 <% Set RetCode=Comm.CreateParameter ("RetCode",adInteger,adParamReturnValue) %> //创建存储过程输入参数对象 <% Set usrName=Comm.CreateParameter ("usrName",adVarchar,adParamInput,30) %> <% Set usrPwd=Comm.CreateParameter ("usrPasswd",adVarchar,adParamInput,30) %> <% Set age=Comm.CreateParameter("age",adInteger,adParamInput) %> <% Set PhoneNum=Comm.CreateParameter ("PhoneNum",adVarchar,adParamInput, 20) %> <% Set Address=Comm.CreateParameter("Address",adVarchar,adParamInput,50) %> <% Comm.Parameters.Append usrName %> <% Comm.Parameters.Append usrPwd %> <% Comm.Parameters.Append age %> <% Comm.Parameters.Append PhoneNum %> <% Comm.Parameters.Append Address %> <% Comm.Parameters("usrName")=request("usrName") %> <% Comm.Parameters("usrPasswd")=request("usrPasswd") %> <% Comm.Parameters("age")=request("age") %> <% Comm.Parameters("PhoneNum")=request("PhoneNum") %> <% Comm.Parameters("Address")=request("Address") %> <% Comm.Execute %> <% RetValue=Cint(Comm("RetCode")) %> //根据数据库存储过程返回代码判断注册是否成功 <% if RetValue< 0 then %> <% response.Redirect RegisterFail.html %> <% else %> <% response.Redirect RegisterOk.html %> <% end if %>
方法三 利用MTS(Microsoft Transaction Server)组件的事务处理机制实现事务处理时,需要特别注意的是,这种机制下的事务不能跨越多个ASP页,如果一个事务处理需要来自多个组件的对象,则须将对这些对象的操作组合在一个ASP页中。
首先需要在页首添加指令@TRANSACTION,将一个ASP页面声明为事务性。
@TRANSACTION指令必须在一页中的第一行,否则将产生错误。当页面中 ASP脚本处理结束时,当前事务即告结束。
<%@ TRANSACTION=Required Language= VB Script %>//事务执行成功触发事件
<% Sub OnTransactionCommit() %> <% response.Redirect RegisterOk.html %> <% End Sub %> //事物执行失败触发事件
<% Sub OnTransactionAbort() %> <% response.Redirect RegisterFail.html %> <% End Sub %>
<% sqlText="Insert into USER(userName,userPasswd) values('" %>
<% sqlText=sqlText & request("usrName") & "','" &request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %> <% conn.Errors.Clear %> <% ObjectContext.SetAbort %> <% end if %>
<% sqlText="Insert into USERDOC(userName,Age,Sex,PhoneNumber,Address) "%>
<% sqlText=sqlText & "values('" & request("usrName")& "', " & request("Age") %>
<% sqlText=sqlText & ",'" & request("PhoneNum") & "','" %>
<% sqlText=sqlText & request("Address") & "') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %> <% conn.Errors.Clear %> <% ObjectContext.SetAbort %> <% end if %>
<% ObjectContext.SetComplete %>
方案比较 从灵活的角度考
asp执行sql语句、存储过程的几种方法
使用connection对象
会返回一个关闭的recordset记录集,此记录集不要再次声明关闭
建议在update、insert、delete时使用
strCon="provider=sqloledb;data source=servername;initial catalog=databasename;uid=username;pwd=password"
set conn=server.CreateObject("adodb.connection")
conn.open strCon
conn.begintrans '事务开始
conn.execute(sql),num 'num表示update、insert、delete影响的行数
conn.committrans '事务提交
conn.rollbacktrans '事务回滚
set rs=conn.execute("sp_XXXX",参数1,参数2) '执行存储过程sp_XXXX,是否返回记录集可选
conn.close
set conn=nothing
使用recordset对象
返回一个recordset记录集,建议查询时使用
set rs=server.CreateObject("adodb.recordset")
rs.open sql,strCon,1,1
do while not rs.eof '循环读取记录集
xx=rs("filename") '读取记录集中filename字段
rs.movenext
loop
rs.close
set rs=nothing
使用command对象
建议存储过程使用
创建存储过程的参数对象命令,参数数量根据不同类型而有所变化:
Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)
Name-参数名,Type-参数数据类型,Direction-参数类型,Size-长度(可选),Value-参数值(可选)
set conn=server.CreateObject("adodb.connection")
set cmd=server.CreateObject("adodb.command")
conn.open strCon
set cmd.ActiveConnection=conn
cmd.CommandText="sp_XXXX" '存储过程名
cmd.CommandType=4 '命令类型:1-普通命令,2-表名,4-存储过程
'输入参数:参数名、参数数据类型、参数类型(输入参数)
cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger,adParamInput)
cmd(“@aaa”)=100 '给输入参数赋值
'输出参数:参数名、参数数据类型、参数类型(输出参数)
cmd.Parameters.Append cmd.CreateParameter("@bbb",adInteger,adParamOutput)
'返回值:只能整数
cmd.Parameters.Append cmd.CreateParameter("@return_value",adInteger,adParamReturnValue )
cmd.Execute() '执行存储过程
bbb=cmd(“@bbb”) '获取输出值
rrr=cmd(“@return_value”) '获取返回值
指明参数类型时可使用类型名或者序号
Type-参数数据类型
类型 序号 说明
adDBTimeStamp 135 日期时间数据类型
adDecimal 14 十进制整数值
adDouble 5 双精度小数值
adError 10 系统错误信息
AdGUID 72 全域性唯一识别字(Globally unique identifier)
adDispath 9 COM/OLE自动对象(Automation Object)
adInteger 3 4字节有符号整数
adIUnknown 13 COM/OLE对象
adLongVarBinary 205 大型2字节值
adLongVarChar 201 大型字符串值
adLongVarWChar 203 大型未编码字符串
adNumeric 131 十进制整数值
adSingle 4 单精度浮点小数
adSmallInt 2 2字节有符号整数
adTinyInt 16 1字节有符号整数
adUnsignedBigInt 21 8字节无符号整数
adUnsignedInt 19 4字节无符号整数
adUnsignedSmallInt 18 2字节无符号整数
adUnsignedTinyInt 17 1字节无符号整数
adUserDefined 132 用户自定义数据类型
adVariant 12 OLE对象
adVarBinary 204 双字节字符变量值
adVarChar 200 字符变量值
advarchar 202 未编码字符串变量值
adWchar 130 未编码字符串
Direction-参数类型
类型 序号 说明
adParamInput 1 允许数据输入至该参数当中
adParamOutput 2 允许数据输出至该参数当中
adParamInputOutput 3 允许数据输入、输出至该参数当中
adparamReturnValue 4 允许从一子程序中返回数据至该参数当中
————————————————
版权声明:本文为CSDN博主「景韦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jewely/article/details/84756060
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了