虽然不是第一次做机房收费系统,对于机房收费系统需求也都了解,但是如果要做出让自己满意的机房收费系统就够费脑筋啊。一个事务弄的我整了好长时间。
事务(Transaction):将彼此相关的多项操作合并成一个逻辑单元,以便于确保这些操作要么全部执行,要么全不执行。
在ADO.NET使用事务时,sqlconnection和 oledbconnection对象都包含一个beginTransaction方法,他能够返回sqlTransaction或者oledbTransaction。事务对象拥有commit和rollback方法来管理应用程序中的事务。
执行事务的步骤:(这里以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.SqlClient
Public 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 Function
End Class