当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:22:00  来源:本站整理

谈asp中数据库的事件处理及本领[MSSQL防范]

赞助商链接



  本文“谈asp中数据库的事件处理及本领[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
看过不少朋友的代码,包含一些学了挺长时间的朋友,在对数据库的处该当中历来不利用事件,大概有些固然利用了事件处理,但并没有到达他们所预期的效果.实际上,真正要做一个商业化的程序,对数据的事件处理是必不可少的.下面就一些事件处理的问题谈一下我的见解.
什么叫事件,这里我就不祥述了,感爱好的朋友可以自己看一下sql server的book online或是msdn.我举一个浅显的例子吧,比方说你要把一个form中的数据同时向两个相关联的表中插入,假如不利用事件,那便大概呈现这用情形,第一个表中成功更新后,忽然数据库呈现不测情况,第二个表的操作没有完成,这样的话有什么后果也就不用说了.要避免这种情形,就应当利用事件,它的作用就是要不两个表都操作成功,要不都失利,换句话说,就是保持数据的一致性.具体做法是这样,在begin trans之后的全部操作只有到commit trans的时刻才真正履行,假如此中有一部份操作失利,那么就用rollback trans恢复整个事件,是数据保持全部操作举行从前的状况.但这里需求注意的一个问题是,假若有一部份操作失利,但不是致命错误,那么数据库不会停在那儿,而是持续下一条操作,直到履行到commit trans , 系统会履行那些已经成功的操作,这也就是为什么有些程序固然用了事件但还是呈现只有部份数据被更新的情形,而不是预想的可以保持数据的一致性.所以精确的做法应当是在每一个对数据的操作后,都应当查抄一下@@error的值,假如出错则转向错误处理部份,该部份负责履行rollback trans ,恢复整个事件.
看下面两个表,这是一个bbs的注册用户表以及它的相关表.
if exists(select * from sysobjects where ID = object_id("BBSUser"))
drop table BBSUser
go

create table BBSUser
(
ID int Primary key identity not null ,
UserName varchar(20) default "" not null ,
Password varchar(10) default "" not null ,
UserType tinyint default 0 not null , --用户范例,1为斑竹
Email varchar(100) default "" not null ,
HomePage varchar(100) default "" not null ,
ICQ varchar(20) default "" not null ,
Signature varchar(255) default "" not null , --签名
Point int default 0 not null , --用户积分
)
go

if exists(select * from sysobjects where ID = object_id("BBSUserAction"))
drop table BBSUserAction
go

create table BBSUserAction
(
id int Primary key identity not null ,
UserID int default 0 not null , --用户ID
SignTime datetime default getdate() not null , --登录时间
IP varchar(15) default "" not null , --登录IP
)
go

下面这个存储历程要完成这样一个任务,就是用户在注册完后把数据插入这两个表,并且第二表中的UserID的值是插入第一个表中的自动增添型字段ID,这里就用到一个本领,用到了系统变量@@identity,它的值就是最后一次插入操作中的identity型字段的值.这个存储历程中就用到了事件,请细心看一下代码吧,我就不多说了.
if exists (select * from sysobjects where ID = object_id("up_RegisterUser"))
drop proc up_RegisterUser
go

create proc up_RegisterUser
@a_strUserName varchar(20) , @a_strPassword varchar(10) , @a_strEmail varchar(100) ,
@a_strHomepage varchar(100) , @a_strICQ varchar(20) , @a_strSignature varchar(255) ,
@a_strIP varchar(15)
as
declare @m_strUserID int

/*因为要对两个表举行操作,所以放到事件当中*/
begin tran --事件开始
insert into BBSUser values --更新BBSUser表
(
@a_strUserName , @a_strPassword , 0 , @a_strEmail ,
@a_strHomepage , @a_strICQ , @a_strSignature , 0
)
if (@@error <> 0) goto On_Error --假如操作失利,转向错误处理
select @m_strUserID = @@identity --保存刚插入的ID号

insert into BBSUserAction values --更新BBSUserAction表
(
@m_strUserID , getdate() , @a_strIP
)
if (@@error <> 0) goto On_Error --假如操作失利,转向错误处理

commit tran --事件完毕
return (0) --返回成功码

On_Error: --错误处理
rollback tran --恢复事件
return (-1) --返回错误码

  以上是“谈asp中数据库的事件处理及本领[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 浅谈aspx网站的安全
  • 谈asp中数据库的事件处理及本领
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .