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表中存放的是该注册用 户的个人资料,并且以用户名为索引。下面是表USERUSERDOC的定义: 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语句、存储过程的几种方法

https://blog.csdn.net/jewely/article/details/84756060?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-2.nonecase

 

使用connection对象

会返回一个关闭的recordset记录集,此记录集不要再次声明关闭

建议在updateinsertdelete时使用

 

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表示updateinsertdelete影响的行数

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

posted @   茶叶蛋蛋  阅读(263)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示