1. 程式人生 > >個人重構版機房收費系統事務的使用

個人重構版機房收費系統事務的使用

    雖然不是第一次做機房收費系統,對於機房收費系統需求也都瞭解,但是如果要做出讓自己滿意的機房收費系統就夠費腦筋啊。一個事務弄的我整了好長時間。

事務(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.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

這樣的話就能夠保證兩個資料表同時新增資料。