当前位置:编程学习 > VB >>

机房收费系统完美设计——事务处理VS三层架构

 

上面的博客中只是通过简单的例子介绍事物的应用,但是在三层架构中事物应该怎样使用呢,要弄清楚这一点首先是明白事物、连接、command对象之间的关系

connection 对象是数据连接,他决定你链接什么数据库,数据库在哪里

command 对象是查询执行,由他来完成查询语句或执行语句

事物呢,一个连接可以有多个事物。但一个事物只属于一个连接。连接就好像北京到上海的一条铁路,事物就是铁路上的列出,列车可以只有车头,也可以带有好多车厢,火车包括车头都是要到北京的。但是要是要不整列火车到达北京,要不都没有到达。

上面是我对事物的理解。

说说我的三层架构:

我的三层结构中融入了设计模式,其中U层对B层的操作是通过外观模式来操作的。外观模式的作用就是让B层复杂的逻辑统一到一个外观中来。

以注册新卡为例:

注册新卡需要插入学生信息和卡信息。当然是需要放在事物里的。要不都插入成功,要不都不插入。

通过以上我的解说大家应该能想出,事物的开始和结束都要放在外观层的(后面用Fa层代替)但是事物的创建时要在连接的基础上的。也就是Fa层要获得连接。就要在B、D、Factory、IDAL走一遍。然后获得的Transaction,还要以参数的形式传回D层操作。这个过程走下来,我发现自己要改的东西又有很多了。

让我们先看看怎么实现。

这里我找了一部分别人的代码。其中的Sqlhelper写的比较有代表性。给大家分享。当然方法一定不止是有一个的。大家写好的sqlhelper不一定不好。

将事务处理独立出来,该类的功能主要是创建数据库连接,开启事务处理,关闭连接。代码如下:


[vb]
Imports System.Data.Common   
Public Class TranUtil   
    Private Sub New()   
    End Sub   
    '开启事务    
    Public Shared Function BeginTransaction() As IDbTransaction   
        Dim conn As DbConnection = DButil.CreateConnection   
        If conn.State = ConnectionState.Closed Then   
            conn.Open()   
        End If   
        Dim tran As IDbTransaction = conn.BeginTransaction()   
        Return tran   
    End Function   
    '关闭连接    
    Public Shared Sub Close(ByVal tran As IDbTransaction)   
        If tran IsNot Nothing AndAlso tran.Connection.State = ConnectionState.Open Then   
            tran.Connection.Close()   
            tran = Nothing   
        End If   
    End Sub   

Imports System.Data.Common 
Public Class TranUtil 
    Private Sub New() 
    End Sub 
    '开启事务 
    Public Shared Function BeginTransaction() As IDbTransaction 
        Dim conn As DbConnection = DButil.CreateConnection 
        If conn.State = ConnectionState.Closed Then 
            conn.Open() 
        End If 
        Dim tran As IDbTransaction = conn.BeginTransaction() 
        Return tran 
    End Function 
    '关闭连接 
    Public Shared Sub Close(ByVal tran As IDbTransaction) 
        If tran IsNot Nothing AndAlso tran.Connection.State = ConnectionState.Open Then 
            tran.Connection.Close() 
            tran = Nothing 
        End If 
    End Sub 

数据库操作类代码如下:

 

[vb]
Imports System.Data.Common   
Imports System.Configuration   
Imports System.Reflection.MethodBase   
Imports MySql.Data.MySqlClient   
Imports log4net   
Public Class DButil   
    Private Shared log As ILog = LogManager.GetLogger(GetCurrentMethod().DeclaringType.ToString)   
    Private Sub New()   
    End Sub   
    ' 创建数据库链接    
    Public Shared Function CreateConnection() As DbConnection   
        log.Info("创建数据库连接")   
        Try   
            '读取app.config中的连接字符串    
            Dim sConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString   
            '创建数据库连接    
            Dim dbConn As MySqlConnection = New MySqlConnection(sConn)   
            Return dbConn   
        Catch ex As Exception   
            log.Error(ex)   
            Throw ex   
        End Try   
    End Function   
    '取得DbCommand    
    Public Shared Function GetSqlCommand(ByVal connection As DbConnection, ByVal sqlQuery As String) As DbCommand   
        log.Info("sqlQuery:" & sqlQuery)   
        Try   
            Dim dbCommand As MySqlCommand = connection.CreateCommand   
            dbCommand.CommandText = sqlQuery   
            dbCommand.CommandType = CommandType.Text   
            Return dbCommand   
        Catch ex As Exception   
            log.Error(ex)   
            Throw ex   
        End Try   
    End Function   
    ' 给DbCommand对象的参数

补充:软件开发 , Vb ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,