发新话题
打印

一条insert语句同时插入两个表,如何解决?

一条insert语句同时插入两个表,如何解决?

如题目。

如果有一个表插入失败,则都不插入数据?

为的是保持协调和统一?

谁有好的解决方法?

TOP

方法一   

利用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

TOP

这样也可以吧

可以利用数据库系统内部的事务处理机制,通过在数据库服务器中编写包含事务的存储过程,完成对数据操作的事务处理。同时,利用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

TOP

发新话题