接触3层也有一段时间了,了解水平一般,前段时间在想在三层中怎么使用事务呢,放在哪呢?Sqlherper ? DAL? BLL?。然后我就疯狂的百度,好几次都是未果(因为做的都是小项目,不用事务也关系不大),今天我再次查时,好好的看了csdn上的以讨论,,结合前辈和高手们的意见,自己改了一个出来。我的想法是将事务逻辑写在业务逻辑层,数据库的处理还都是在SQLHELPER,BLL层通过事务SqlTransaction传值访问DAL,再访问Sqlhelper。接下来是分块的代码。
Sqlhelper:
1 private static SqlConnection Cnn = new SqlConnection(DbConfig.ConnectionString); 2 3 #region 判读SqlConnection 是否开启连接 并开启 4 ///5 /// 判读SqlConnection 是否开启连接 并开启 6 /// 7 ///返回SqlConnection 8 private static SqlConnection GetCnn() 9 { 10 if (Cnn.State == ConnectionState.Closed) 11 { 12 Cnn.Open(); 13 } 14 return Cnn; 15 } 16 #endregion 17 18 #region 关闭数据库连接 19 ///20 /// 关闭数据库连接 21 /// 22 public static void CloseCnn() 23 { 24 Cnn.Close(); 25 } 26 #endregion 27 28 #region 产生一个事务并开始 29 ///30 /// 产生一个事务并开始 31 /// 32 ///返回此事务 33 public static SqlTransaction BeginTransaction() 34 { 35 SqlTransaction tran = GetCnn().BeginTransaction(); 36 return tran; 37 } 38 #endregion
DAL:
1 public bool test(int i,SqlTransaction tran) 2 { 3 string sql = "insert into [test]([item]) values(@i)"; 4 SqlParameter[] paras=new SqlParameter[]{ new SqlParameter("@i",i)}; 5 return sqlhelper.ExecutenQuery(sql, paras, CommandType.Text, tran)>0; 6 }
BLL:
1 UserDAO userdao = new UserDAO(); 2 3 4 public bool test() 5 { 6 using (SqlTransaction tran = SQLHelper.BeginTransaction()) 7 { 8 try 9 { 10 userdao.test(2, tran); 11 userdao.test(3, tran); 12 tran.Commit(); return true; 13 } 14 catch 15 { 16 17 tran.Rollback(); 18 return false; 19 } 20 finally 21 { 22 SQLHelper.CloseCnn();//关闭数据库连接 23 } 24 } 25 }