晒晒我的通用数据访问层

发表于:2011-7-07 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李奇峰    来源:51Testing软件测试网采编

  摘要:笔者在从事多年数据库项目编写之后,厌倦了机械化的代码,不断重构出了属于自己的代码——自己的通用数据访问层。在这里与大家分享。

  今天来晒晒我的通用数据访问层。

  写了很多年的数据库项目,数据访问嘛,一直是用业务实体+存储过程的方式,因此经常会写很多调用存储过程的代码。这些代码用Ado.net如何写,我想大家应该都知道:创建Connection, 创建Command, 给命令参数一个一个赋值,然后调用,调用完成后,如果有输出参数,则要读出来,如果有结果集,则要将结果集转换成自己的实体列表,这个过程也是非常机械化的。总之,调用任何存储过程都需要这样一堆类似的代码。

  我是个喜欢最求完美的人,自然不喜欢每个项目都有这样一堆机械代码的存在,于是经过不断的重构代码,慢慢的就形成了自己的通用数据访问层。

  我的通用数据访问层具有以下特点:

  1、可用于访问各种类型的数据库,让您的应用程序从特定的数据库类型中解藕出来,从而非常简单地就可以实现对多种数据库的支持。

  2、非常方便的调用存储过程、将数据库的结果转成实体类型(或列表)、调用完成后自动“回写”输出参数到实体对象。 只需要一个调用便可实现这三个操作步骤。

  3、数据访问层可以同时支持多种数据库类型的多个连接。并可以在运行时简单的切换。

  4、数据访问层可以非常方便地实现类似“多帐套数据库”的支持,即根据不同的客户端请求来切换相应的数据库连接。

  5、数据访问层同时提供简单或详细的API,连接或事务可以自动控制也可以由上层类来控制。总之就是让您在享受简化的过程中拥有对细节的充分控制机会。

  6、提供一个辅助(Profiler)工具,让您可以随时了解详细的数据库访问情况:打开了多少次连接,每个连接执行了哪些调用,以及调用的执行时间,调用参数等等。

  设计目标:调用存储过程,不管输入参数多么复杂,不管有多少输出参数,包含转换一个结果集到实体列表,只需要一行C#代码。

  1. 示范代码,简单地调用单个存储过程

  C#实体类型,成员与数据库表对应,这里就不给出表结构截图了。

  1. /// <summary> 
  2. /// 表示一个商品对象的实体类 
  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.     [ItemField(OnlyLoadAll = true)]      
  14.     public string Remark { getset; }  
  15. }

  存储过程-更新商品信息

  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;

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号