国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

如何實現(xiàn)SQL事務(wù)的提交,又不對外進(jìn)行污染(2)

2019-11-17 01:57:25
字體:
供稿:網(wǎng)友

如何實現(xiàn)SQL事務(wù)的提交,又不對外進(jìn)行污染(2)

緊接著上文,這里主要記錄事務(wù)操作,實現(xiàn)多實體的功能

在SqlTran類中添加方法如下:

1、兩個不同實體類型的事務(wù)方法:

 1         /// <summary> 2         /// 執(zhí)行事務(wù)(事務(wù)中不同實體) 3         /// </summary> 4         /// <typeparam name="T">實體</typeparam> 5         /// <param name="method">要執(zhí)行的方法(SqlTransaction 默認(rèn)傳入為null)</param> 6         /// <param name="obj1">參數(shù)值</param> 7         /// <returns></returns> 8         public static Int32 ExecuteTran<M, N>(Func<M, SqlTransaction, Int32> method1, Func<N, SqlTransaction, Int32> method2, M obj1, N obj2) 9             where M : new()10             where N : new()11         {12             Int32 count = 0;13             SqlConnection conn = null;14             SqlTransaction tran = null;15             try16             {17                 conn = new SqlConnection(Repository.connStr);18                 conn.Open();19                 tran = conn.BeginTransaction();20 21                 count += method1(obj1, tran);22                 count += method2(obj2, tran);23 24                 tran.Commit();25                 return count;26             }27             catch (Exception ex)28             {29                 tran.Rollback();30                 return -1;31             }32             finally33             {34                 if (tran != null)35                     tran.Dispose();36                 if (conn != null)37                 {38                     conn.Close();39                     conn.Dispose();40                 }41             }42 43         }44 45         /// <summary>46         /// 執(zhí)行事務(wù)(事務(wù)中不同實體)47         /// </summary>48         /// <typeparam name="T">實體</typeparam>49         /// <param name="method">要執(zhí)行的方法(SqlTransaction 默認(rèn)傳入為null)</param>50         /// <param name="obj1">參數(shù)值</param>51         /// <returns></returns>52         public static Int32 ExecuteTran<M, N>(IList<Func<M, SqlTransaction, Int32>> methods1, IList<Func<N, SqlTransaction, Int32>> methods2, IList<M> objs1, List<N> objs2)53             where M : new()54             where N : new()55         {56             Int32 count = 0;57             SqlConnection conn = null;58             SqlTransaction tran = null;59             try60             {61                 conn = new SqlConnection(Repository.connStr);62                 conn.Open();63                 tran = conn.BeginTransaction();64 65                 if (methods1.Count() != objs1.Count())66                     return -1;67                 if (methods2.Count() != objs2.Count())68                     return -1;69 70                 for (int i = 0; i < objs1.Count(); i++)71                     count += methods1[i](objs1[i], tran);72                 for (int i = 0; i < objs2.Count(); i++)73                     count += methods2[i](objs2[i], tran);74 75                 tran.Commit();76                 return count;77             }78             catch (Exception ex)79             {80                 tran.Rollback();81                 return -1;82             }83             finally84             {85                 if (tran != null)86                     tran.Dispose();87                 if (conn != null)88                 {89                     conn.Close();90                     conn.Dispose();91                 }92             }93 94         }
View Code

參數(shù)為List的時候,注意對應(yīng)關(guān)系

methods1-->objs1

methods2-->objs2

2、測試方法:

 1         public void Test() 2         { 3             Repository repository = new Repository(); 4              5             Orders order11 = new Orders() { Id = 11, Name = "name11" }; 6             Orders order21 = new Orders() { Id = 12, Name = "name12" }; 7             Orders order31 = new Orders() { Id = 13, Name = "name13" }; 8             OrderDetail orderDetail11 = new OrderDetail() { Id = 11, OrderId = 1, Name = "namedetail11" }; 9             OrderDetail orderDetail12 = new OrderDetail() { Id = 12, OrderId = 1, Name = "namedetail12" };10 11             var count1 = SqlTran.ExecuteTran<Orders, OrderDetail>(repository.AddOrder, repository.AddOrderDetail, order11, orderDetail11); //不同方法,不同實體類型12 13             List<Func<Orders, SqlTransaction, Int32>> listFuncOrders = new List<Func<Orders, SqlTransaction, Int32>>();14             List<Func<OrderDetail, SqlTransaction, Int32>> listFuncOrdersDetail = new List<Func<OrderDetail, SqlTransaction, Int32>>();15             List<Orders> listOrder = new List<Orders>();16             List<OrderDetail> listOrderDatail = new List<OrderDetail>();17 18             listFuncOrders.Add(repository.AddOrder);19             listFuncOrders.Add(repository.AddOrder);20             listOrder.Add(order21);21             listOrder.Add(order31);22 23             listFuncOrdersDetail.Add(repository.AddOrderDetail);24             listFuncOrdersDetail.Add(repository.UpdateOrderDetail);25             listOrderDatail.Add(orderDetail12);26             orderDetail11.Name = "namedetail11Update";27             listOrderDatail.Add(orderDetail11);28 29             var count2 = SqlTran.ExecuteTran<Orders, OrderDetail>(listFuncOrders, listFuncOrdersDetail, listOrder, listOrderDatail);30         }
View Code

3、三個不同實體類型的事務(wù)方法:定義

public static Int32 ExecuteTran<M, N, T>(Func<M, SqlTransaction, Int32> method1, Func<N, SqlTransaction, Int32> method2, Func<T, SqlTransaction, Int32> method3, M obj1, N obj2, T obj3) where M : new() where N : new() where T : new()

所以根據(jù)實體的個數(shù)進(jìn)行定義就ok,之后就可以重用了

缺點之一:每個事務(wù)方法中大部分的代碼是一樣的,只有委托執(zhí)行方法部分有微小的變化(如:count += method(obj1, tran); ),本人目前沒有更好的辦法把這塊相同的代碼提取出來進(jìn)行共用,希望看到這里的同行,如果有好的解決方案,希望能拿出來互相交流!指點迷津。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 涞水县| 清远市| 香港| 甘洛县| 孟津县| 五华县| 云南省| 云南省| 巴彦淖尔市| 普陀区| 南平市| 綦江县| 平塘县| 房山区| 沙湾县| 班玛县| 凤冈县| 定兴县| 保靖县| 香格里拉县| 疏勒县| 女性| 江都市| 从江县| 武隆县| 甘洛县| 颍上县| 彰化县| 湖南省| 宁武县| 前郭尔| 弋阳县| 广州市| 虞城县| 资阳市| 勐海县| 博客| 丰县| 宜君县| 尉氏县| 蓬莱市|