個人重構版機房收費系統事務的使用
雖然不是第一次做機房收費系統,對於機房收費系統需求也都瞭解,但是如果要做出讓自己滿意的機房收費系統就夠費腦筋啊。一個事務弄的我整了好長時間。
事務(Transaction):將彼此相關的多項操作合併成一個邏輯單元,以便於確保這些操作要麼全部執行,要麼全不執行。
在ADO.NET使用事務時,sqlconnection和 oledbconnection物件都包含一個beginTransaction方法,他能夠返回sqlTransaction或者oledbTransaction。事務物件擁有commit和rollback方法來管理應用程式中的事務。
執行事務的步驟:(這裡以
(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)如果命令完成,則呼叫事務物件的
下面是我對機房收費系統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
這樣的話就能夠保證兩個資料表同時新增資料。