项目总结——再谈事务机制
引言:
做机房收费系统时,有研究过在三层架构中添加事务处理的机制。那时候基本是自创的一个方法。因为要访问一个公共的静态变量。当时自然就想到了使用实体类,这样得到公共的Connection以后就可以不用在每个层中传了。同样这次的系统中也用到了事务机制的处理。发现了另一种使用事务机制的好的方法,当然也要拿出来给大家分享下了。
基本思路:看代码之前,大概说一下这次系统中使用是如何使用事务机制了。事务无非就是同时执行多条sql语句,要保证事务的实现无非就是让执行这几条sql语句在同一个Connection链接下操作。其实事务很简单,不过是和三层混在了一起所以让人无从下手罢了,这次的系统中实现事务机制的方法是把要同时执行的多条sql语句放在D层的一个方法里。如果多条sql语句都没有参数,那么就只需要把这多条的sql语句保存起来然后再传给sqlhelper逐条的执行,如果多条的sql语句都带有参数,那么需要保存的就不止有sql语句还用其对应的参数了。
技术难点:看到这里大家发现其实主要的技术难点只剩下两个,
1.保存这些sql语句,以及他们可能有的参数,然后对应的取出来。
2.就是把对应的把sql语句自己的参数附加上去。
代码以及说明:说到现在我想应该让大家看看代码了:(这里的例子是带有参数的sql语句,这个掌握了,不带参数的自然也就掌握了。)
首先是D层确定需要放在同一个事务中处理的sql语句,并保存起来用于送给sqlhelper处理。
''' <summary> ''' 写入参数--韩义 ''' </summary> ''' <param name="cmd">sqlCommand命令</param> ''' <param name="conn">sqlconnection命令</param> ''' <param name="trans">事务</param> ''' <param name="cmdText">sql语句</param> ''' <param name="cmdParms">参数</param> ''' <remarks></remarks> Public Sub PrepareCommand(ByVal cmd As SqlCommand, ByVal conn As SqlConnection, ByVal trans As SqlTransaction, ByVal cmdText As String, ByVal cmdParms() As SqlParameter) If conn.State <> ConnectionState.Open Then conn.Open() End If cmd.Connection = conn '设置连接 cmd.CommandText = cmdText '设置对数源执行的sql语句 If Not IsNothing(trans) Then cmd.Transaction = trans '设置执行事务 cmd.CommandType = CommandType.Text End If If Not IsNothing(cmdParms) Then '如果存在参数 '遍历每个参数 For Each parameter As SqlParameter In cmdParms If (parameter.Direction = ParameterDirection.InputOutput Or parameter.Direction = ParameterDirection.Input) And (IsDBNull(parameter.Value)) Then parameter.Value = DBNull.Value '附空值 End If cmd.Parameters.Add(parameter) '加入参数 Next End If End Sub
这样我们也就解决了第二个问题--就是把对应的把sql语句自己的参数附加上去。
看到这里,事务处理基本已经完成了。对于没有参数的多条sql语句,当然泛型是很好的选择。把多条sql语句保存在一个字符串类型的泛型中,然后向下传递。 总结: 两种在三层中添加事务的处理方式都已经在我的博客中有介绍了。那么让我们来总结,比较一下这两种方法的区别把(另一篇博客地址:http://blog.csdn.net/hy6688_/article/details/8933097)我总结的区别有一下几点:(为了方便说明原来的那篇称第一篇,现在的这篇称第二篇)。 1.第一篇中的方法,没有第二篇的简单、直接。 2.第一篇中的方法可以实现这样的操作:第二条sql语句的执行要依赖与第一条sql语句执行的返回结果。 3.第一篇中的方法把每一个sql语句单独的作为一个方法,这样可以实现简单的复用,如果另一个事务机制的处理需要使用这个方法直接拿来用就可以了。 4.第二篇中的方法,用到的hashtable,方法很巧妙值得学习研究。
- 3楼hy6688_昨天 16:42
- 欢迎大家斧正
- 2楼lfmilaoshi昨天 16:59
- 总结的很好,尤其是对比的很好!
- 1楼sunliduan昨天 16:57
- 机房合作中继续学习