个人重构版机房收费系统事务的使用

来源:互联网 发布:淘宝上有没有微信号卖 编辑:程序博客网 时间:2024/05/22 01:57

    虽然不是第一次做机房收费系统,对于机房收费系统需求也都了解,但是如果要做出让自己满意的机房收费系统就够费脑筋啊。一个事务弄的我整了好长时间。

事务(Transaction):将彼此相关的多项操作合并成一个逻辑单元,以便于确保这些操作要么全部执行,要么全不执行。

    在ADO.NET使用事务时,sqlconnection oledbconnection对象都包含一个beginTransaction方法,他能够返回sqlTransaction或者oledbTransaction。事务对象拥有commitrollback方法来管理应用程序中的事务。

    执行事务的步骤:(这里以sql数据库为准)

   (1)调用连接对象的beginTransaction方法,将返回值赋给一个sqlTransaction类型的变量

     例如:dim myTrans as (new) SqlTransaction

 Dim conn as new sqlconnection

 myTrans=conn.beginTransaction()

 

   (2)为要在事务中执行的所有对象设置Transaction属性来引用事务对象。

Dim cmd as sqlcommand

Cmd.Transaction=myTrans

   (3)执行必要的命令对象。 

   (4)如果命令完成,则调用事务对象的commit方法。如果发生任何问题,则调用rollback会滚到初始条件

    下面是我对机房收费系统DLL层的代码使用事务的情况(学生注册)界面如下:

    

    我自己设计的数据库中对于学生注册,我建立了两个表:stuInfo    cardInfo 这两个表,所以我是用事务对两个表添加学生信息(能够添加就同时添加,不能添加就都不要添加,这就是我使用事务的本意。)

    具体D层代码如下:

Imports System.Data.SqlClientPublic Class StuRegistDAL : Implements IDAL.IRegister    '注册    Public Function Register_IDAL(ByVal cardInfo As Entity.CardInfoEntity, ByVal stuInfo As Entity.StuInfoEntity) As Boolean Implements IDAL.IRegister.Register_IDAL        '定义字符串        Dim str As String = "Data Source=192.168.24.76;Initial Catalog=Charge_System;uid=sa;Pwd=123456"        '实例化conn并使用构造函数初始化conn        Dim conn As New SqlClient.SqlConnection(str)        '定义 事务类型的变量        Dim myTrans As SqlTransaction        '实例化 Sqlcommand 类        Dim cmd As New SqlCommand        '注册         Try            '打开数据库            conn.Open()            '调用sqltransaction的beginTransaction方法来开始一个本地事务,并将返回的sqlTransaction对象赋给Tstrans            myTrans = conn.BeginTransaction            '将conn对象和cmd相关联            cmd.Connection = conn            '将myTrans对象和 cmd相关联            cmd.Transaction = myTrans            Dim sql As String = "Insert Into T_CardInfo ( cardno,cash,registerdate,registertime,ischeck,userid ) " & _                            " values ( '" & cardInfo.cardno & "','" & cardInfo.cash & "','" & Date.Today & "', '" & TimeOfDay & "','" & cardInfo.ischeck & "','" & cardInfo.userid & "') "            '将cmd对象和Tstrans对象相关联            cmd.CommandText = sql            cmd.ExecuteNonQuery()            '给学生表添加学生表的信息            sql = " insert into T_StuInfo (stuno,cardno,stuname,sex,stuclass,grade,department ) " & _                    "values ( '" & stuInfo.stuno & "','" & stuInfo.cardno & "','" & stuInfo.stuname & "','" & stuInfo.sex & "','" & stuInfo.stuclass & "','" & stuInfo.grade & "','" & stuInfo.department & "' )"            cmd.CommandText = sql            cmd.ExecuteNonQuery()            myTrans.Commit()            Return True        Catch ex As Exception            '事务对象置空            myTrans = Nothing            '让事务回滚            myTrans.Rollback()            '返回 false  其他层,根据该返回值 判断注册的与否 (如果false 当然是没有注册成功)            Return False        End Try    End FunctionEnd Class

这样的话就能够保证两个数据表同时添加数据。





原创粉丝点击