偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

曬曬我的通用數(shù)據(jù)訪問層

運(yùn)維 數(shù)據(jù)庫運(yùn)維
筆者在從事多年數(shù)據(jù)庫項(xiàng)目編寫之后,厭倦了機(jī)械化的代碼,不斷重構(gòu)出了屬于自己的代碼——自己的通用數(shù)據(jù)訪問層。在這里與大家分享。

今天來曬曬我的通用數(shù)據(jù)訪問層。

寫了很多年的數(shù)據(jù)庫項(xiàng)目,數(shù)據(jù)訪問嘛,一直是用業(yè)務(wù)實(shí)體+存儲過程的方式,因此經(jīng)常會寫很多調(diào)用存儲過程的代碼。這些代碼用Ado.net如何寫,我想大家應(yīng)該都知道:創(chuàng)建Connection, 創(chuàng)建Command, 給命令參數(shù)一個一個賦值,然后調(diào)用,調(diào)用完成后,如果有輸出參數(shù),則要讀出來,如果有結(jié)果集,則要將結(jié)果集轉(zhuǎn)換成自己的實(shí)體列表,這個過程也是非常機(jī)械化的??傊?,調(diào)用任何存儲過程都需要這樣一堆類似的代碼。

我是個喜歡最求完美的人,自然不喜歡每個項(xiàng)目都有這樣一堆機(jī)械代碼的存在,于是經(jīng)過不斷的重構(gòu)代碼,慢慢的就形成了自己的通用數(shù)據(jù)訪問層。

我的通用數(shù)據(jù)訪問層具有以下特點(diǎn)

  1. 可用于訪問各種類型的數(shù)據(jù)庫,讓您的應(yīng)用程序從特定的數(shù)據(jù)庫類型中解藕出來,從而非常簡單地就可以實(shí)現(xiàn)對多種數(shù)據(jù)庫的支持。
  2. 非常方便的調(diào)用存儲過程、將數(shù)據(jù)庫的結(jié)果轉(zhuǎn)成實(shí)體類型(或列表)、調(diào)用完成后自動“回寫”輸出參數(shù)到實(shí)體對象。 只需要一個調(diào)用便可實(shí)現(xiàn)這三個操作步驟。
  3. 數(shù)據(jù)訪問層可以同時支持多種數(shù)據(jù)庫類型的多個連接。并可以在運(yùn)行時簡單的切換。
  4. 數(shù)據(jù)訪問層可以非常方便地實(shí)現(xiàn)類似“多帳套數(shù)據(jù)庫”的支持,即根據(jù)不同的客戶端請求來切換相應(yīng)的數(shù)據(jù)庫連接。
  5. 數(shù)據(jù)訪問層同時提供簡單或詳細(xì)的API,連接或事務(wù)可以自動控制也可以由上層類來控制??傊褪亲屇谙硎芎喕倪^程中擁有對細(xì)節(jié)的充分控制機(jī)會。
  6. 提供一個輔助(Profiler)工具,讓您可以隨時了解詳細(xì)的數(shù)據(jù)庫訪問情況:打開了多少次連接,每個連接執(zhí)行了哪些調(diào)用,以及調(diào)用的執(zhí)行時間,調(diào)用參數(shù)等等。

設(shè)計(jì)目標(biāo):調(diào)用存儲過程,不管輸入?yún)?shù)多么復(fù)雜,不管有多少輸出參數(shù),包含轉(zhuǎn)換一個結(jié)果集到實(shí)體列表,只需要一行C#代碼。

1. 示范代碼,簡單地調(diào)用單個存儲過程

C#實(shí)體類型,成員與數(shù)據(jù)庫表對應(yīng),這里就不給出表結(jié)構(gòu)截圖了。

  1. /// <summary>  
  2. /// 表示一個商品對象的實(shí)體類  
  3. /// </summary>  
  4. public sealed class Product  
  5. {  
  6.     public int ProductID { getset; }  
  7.     public string ProductName { getset; }  
  8.     public int CategoryID { getset; }  
  9.     public string Unit { getset; }  
  10.     public decimal UnitPrice { getset; }  
  11.     public int Quantity { getset; }  
  12.  
  13.     // 僅當(dāng)加載詳細(xì)信息(單個實(shí)體)時才加載它。加載列表時忽略這個字段。  
  14.     [ItemField(OnlyLoadAll = true)]      
  15.     public string Remark { getset; }  

存儲過程-更新商品信息

  1. create procedure [dbo].[UpdateProduct](   
  2.     @ProductName nvarchar(50),   
  3.     @CategoryID int,   
  4.     @Unit nvarchar(10),   
  5.     @UnitPrice money,   
  6.     @Quantity int,   
  7.     @Remark nvarchar(max),   
  8.     @ProductID int 
  9. )   
  10. as 
  11. update Products   
  12. set ProductName = @ProductName,   
  13.     CategoryID = @CategoryID,   
  14.     Unit = @Unit,   
  15.     UnitPrice = @UnitPrice,   
  16.     Quantity = @Quantity,   
  17.     Remark = @Remark   
  18. where ProductID = @ProductID; 

C#調(diào)用代碼

  1. public bool UpdateProduct(Product product)  
  2. {  
  3.     return (FishBLLHelper.CallSpExecuteNonQuery("UpdateProduct", product) > 0);  

存儲過程-獲取商品列表,支持分頁

  1. create procedure [dbo].[GetProductByCategoryId](  
  2.     @CategoryID int,  
  3.     @PageIndex int = 0,  
  4.     @PageSize int = 20,  
  5.     @TotalRecords int output  
  6. )  
  7. as 
  8. begin  
  9.      
  10. declare @ResultTable table  
  11. (  
  12.     RowIndex int,  
  13.     ProductID int,  
  14.     ProductName nvarchar(50),  
  15.     CategoryID int,  
  16.     Unit nvarchar(10),  
  17.     UnitPrice money,  
  18.     Quantity int 
  19. );  
  20.      
  21. insert into @ResultTable  
  22. select row_number() over (order by ProductID asc) as RowIndex,  
  23.        p.ProductID, p.ProductName, p.CategoryID, p.Unit, p.UnitPrice, p.Quantity  
  24. from   Products as p  
  25. where CategoryID = @CategoryID;  
  26.        
  27. select  @TotalRecords = count(*) from  @ResultTable;  
  28.      
  29. select *  
  30. from   @ResultTable  
  31. where  RowIndex > (@PageSize * @PageIndex) and RowIndex <= (@PageSize * (@PageIndex+1));  
  32.      
  33. end; 

C#調(diào)用代碼

  1. public List<Product> GetProductByCategoryId(int categoryId, ref int pageIndex, int pageSize, out int recCount)  
  2. {  
  3.     return FishBLLHelper.CallSpGetDataItemListPaged<Product>("GetProductByCategoryId",  
  4.    ref pageIndex, pageSize, out recCount, categoryId);  
  5. }  

2. 示范代碼,以事務(wù)方式調(diào)用多個存儲過程

C#實(shí)體類型,成員與數(shù)據(jù)庫表對應(yīng),這里就不給出表結(jié)構(gòu)截圖了。

  1. public sealed class OrderItem  
  2. {  
  3.     public int OrderID { getset; }  
  4.     public int? CustomerID { getset; }  
  5.     public DateTime OrderDate { getset; }  
  6.     public decimal SumMoney { getset; }  
  7.     [ItemField(OnlyLoadAll = true)]    // 僅當(dāng)加載詳細(xì)信息時才加載它。  
  8.     public string Comment { getset; }  
  9.     public bool Finished { getset; }  
  10.     public string CustomerName { getset; }  
  11.  
  12.     [ItemField(IgnoreLoad=true)]    // 不加載這個成員  
  13.     public List<OrderDetail> Detail;  
  14. }  
  15.  
  16. public sealed class OrderDetail  
  17. {  
  18.     public int OrderID { getset; }  
  19.     public int ProductID { getset; }  
  20.     public decimal UnitPrice { getset; }  
  21.     public int Quantity { getset; }  

三個存儲過程,用于插入主表,子表,刷新總金額

  1. create procedure [dbo].[InsertOrder](  
  2.     @CustomerID int = null,  
  3.     @SumMoney money,  
  4.     @Comment nvarchar(300),  
  5.     @OrderID int output  
  6. )  
  7. as 
  8. begin  
  9.    
  10. insert into Orders( CustomerID, OrderDate, SumMoney, Comment)  
  11. values( @CustomerID, getdate(), @SumMoney, @Comment);  
  12.    
  13. set @OrderID = scope_identity();  
  14.    
  15. end;  
  16. create procedure [dbo].[InsertOrderDetail](  
  17.     @OrderID int,  
  18.     @ProductID int,  
  19.     @Quantity int 
  20. )  
  21. as 
  22. declare @Price money;  
  23. select @Price = (select UnitPrice from Products where ProductID = @ProductID);  
  24.  
  25. insert into [Order Details] (OrderID, ProductID, UnitPrice, Quantity)  
  26. values (@OrderID, @ProductID, @Price, @Quantity);  
  27.  
  28.  
  29. create procedure [dbo].[RefreshOrderSumMoney](  
  30.     @OrderID int 
  31. )  
  32. as 
  33. declare @SumMoney money;  
  34. select @SumMoney = (select sum(UnitPrice * Quantity) from [Order Details] where OrderID = @OrderID);  
  35.  
  36. update Orders set SumMoney = @SumMoney  where OrderID = @OrderID;  
  37.  

說明:以上三個存儲要求先調(diào)用InsertOrder,然后獲取新的OrderID后,才能調(diào)用后面二個。下面來看看在C#中該如何調(diào)用這三個存儲過程吧。

C#調(diào)用代碼

  1. public int AddOrder(OrderItem order)  
  2. {  
  3.     // 以事務(wù)的方式創(chuàng)建一個FishDbContext對象,將使用默認(rèn)的連接字符串  
  4.     using( FishDbContext db = new FishDbContext(true) ) {  
  5.         // 添加記錄到表Orders,同時獲取新產(chǎn)生ID  
  6.         FishBLLHelper.CallSpExecuteNonQuery(db, "InsertOrder", order);  
  7.           
  8.         // 為訂單明細(xì)設(shè)置OrderId,并添加到表[Order Details]  
  9.         order.Detail.ForEach(x => {  
  10.             x.OrderID = order.OrderID;  
  11.             FishBLLHelper.CallSpExecuteNonQuery(db, "InsertOrderDetail", x);  
  12.         });  
  13.  
  14.         // 刷新訂單總金額。  
  15.         FishBLLHelper.CallSpExecuteNonQuery(db, "RefreshOrderSumMoney"null, order.OrderID);  
  16.  
  17.         // 提交事務(wù)。  
  18.         db.CommitTransaction();  
  19.  
  20.         return order.OrderID;  
  21.     }  
  22. }  

好了,示例就寫到這里,方不方便嘛,自己覺得好用就行。

今天先不談ORM工具,我們只談存儲過程,下次我會寫個關(guān)于性能測試的文章來專門談ORM。

原文鏈接:http://www.cnblogs.com/fish-li/archive/2011/03/28/1998104.html

【編輯推薦】

  1. DBA應(yīng)用技巧:如何升級InnoDB Plugin
  2. 一句代碼實(shí)現(xiàn)批量數(shù)據(jù)綁定 上
  3. 一句代碼實(shí)現(xiàn)批量數(shù)據(jù)綁定 下
  4. MySQL日志操作教程:DBA們管理的利器
  5. MySQL觸發(fā)器如何正確使用

 

責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2011-05-07 12:56:39

數(shù)據(jù)訪問

2011-05-10 16:44:43

數(shù)據(jù)訪問層

2012-01-11 09:46:31

DAL

2009-08-13 14:59:00

C#數(shù)據(jù)訪問層

2011-05-05 14:33:34

數(shù)據(jù)訪問層

2009-04-02 10:37:52

通用基類SQLLINQ

2009-08-04 10:17:55

ASP.NET SqlASP.NET數(shù)據(jù)訪問

2009-08-19 10:54:42

ASP.NET數(shù)據(jù)訪問

2009-09-04 18:00:54

C#數(shù)據(jù)訪問層

2012-06-07 10:53:08

架構(gòu)設(shè)計(jì)數(shù)據(jù)訪問層設(shè)計(jì)原則

2009-07-24 13:25:43

創(chuàng)建數(shù)據(jù)訪問層

2012-08-15 11:03:18

框架項(xiàng)目

2009-07-24 14:15:51

數(shù)據(jù)訪問層

2025-01-26 17:00:46

2012-02-24 09:07:53

云計(jì)算成本

2009-07-24 13:45:28

添加參數(shù)化

2025-04-08 09:40:00

DWD數(shù)據(jù)倉庫大數(shù)據(jù)

2023-07-27 08:16:51

數(shù)據(jù)訪問層項(xiàng)目

2024-11-18 08:00:00

數(shù)據(jù)倉庫通用語義層商業(yè)智能

2010-10-22 09:43:34

數(shù)據(jù)庫訪問層
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號