打造自己的数据访问层一

项目开发中,大多数开发人员的核心工作就是如何对数据进行存储及访问。为了进行数据操作,我们首先得解决几个基本问题:

1、如何与一个数据库建立连接。

2、如何从数据库读取相应的数据。

3、如何对数据表进行增改操作。

.NET中,ADO.NET很方便的解决了上面三个问题,我们可以使用DbConnection进行连接,DataSet进行数据存储,DataAdapter进行数据更新。先看一段代码:

  1. //创建DbConnection对象连接数据库
  2. SqlConnection conn = new SqlConnection();
  3. conn.ConnectionString = "server=.;uid=sa;password=123456; database=DATA_BASE; max pool size=300;";
  4. //创建DataAdapter、Command对象,读取数据
  5. SqlDataAdapter da = new SqlDataAdapter();
  6. SqlCommand cmd = new SqlCommand();
  7. cmd.Connection = conn;
  8. cmd.CommandText = "SELECT * FROM TEST";
  9. da.SelectCommand = cmd;
  10. //创建DataSet对象,存储数据,建立与物理表的映射
  11. DataSet ds = new DataSet();
  12. da.Fill(ds, "TEST"); 

上述代码实现对数据库“DATA_BASE”中“TEST”表数据读取,并用DataSet时行存储。

既然读出了TEST表中的数据,接下来要解决的就是如何对TEST表进行增、删、改操作。

为实现增、删、改操作,需要为DataAdapter指定InsertCommand、DeleteCommand以及UpdateCommand,并为每个Command对象绑定参数:

  1. //新增数据  
  2. cmd = new SqlCommand();  
  3. cmd.Connection = conn;  
  4. cmd.CommandText = "INSERT INTO TEST (ID, NAME, VAL) VALUES (@ID, @NAME, @VAL)";  
  5. SqlParameter param = new SqlParameter("@ID"null);  
  6. param.SourceColumn = "ID";  
  7. cmd.Parameters.Add(param);  
  8. param = new SqlParameter("@NAME"null);  
  9. param.SourceColumn = "NAME";  
  10. cmd.Parameters.Add(param);  
  11. param = new SqlParameter("@VAL"null);  
  12. param.SourceColumn = "VAL";  
  13. cmd.Parameters.Add(param);  
  14. da.InsertCommand = cmd;  
  15.  
  16. //修改数据  
  17. cmd = new SqlCommand();  
  18. cmd.Connection = conn;  
  19. cmd.CommandText = "UPDATE TEST SET NAME = @NAME, VAL = @VAL WHERE ID = @ID";  
  20. param = new SqlParameter("@ID"null);  
  21. param.SourceColumn = "ID";  
  22. cmd.Parameters.Add(param);  
  23. param = new SqlParameter("@NAME"null);  
  24. param.SourceColumn = "NAME";  
  25. cmd.Parameters.Add(param);  
  26. param = new SqlParameter("@VAL"null);  
  27. param.SourceColumn = "VAL";  
  28. cmd.Parameters.Add(param);  
  29. da.UpdateCommand = cmd;  
  30.  
  31. //删除数据  
  32. cmd = new SqlCommand();  
  33. cmd.Connection = conn;cmd.CommandText = "DELETE FROM TEST WHERE ID = @ID";  
  34. param = new SqlParameter("@ID"null);  
  35. param.SourceColumn = "ID";  
  36. cmd.Parameters.Add(param);  
  37. da.DeleteCommand = cmd;  

完成准备工作后,利用DataTable进行数据操作:

  1. DataTable dt = ds.Tables["TEST"];  
  2. dt.PrimaryKey = new DataColumn[] { dt.Columns["ID"] };  
  3. dt.Rows.Add(new object[]{  
  4.     Guid.NewGuid().ToString(), string.Format("测试:{0}", DateTime.Now), string.Format("测试值:{0}", DateTime.Now)  
  5. });  
  6. DataRow dr = dt.Rows.Find("f8dc2c64-f51a-4e99-bde1-a20069b09c3a");  
  7. if (dr != null){  
  8.     dr["NAME"] = string.Format("测试修改:{0}", DateTime.Now);  
  9. }  
  10. dr = dt.Rows.Find("ed7d079b-81ec-4ba4-bf85-688621e495e7");  
  11. if (dr != null){      
  12. dr.Delete();  

***调用DataAdapter的Update方法保存变更后的数据:

da.Update(ds, “TEST”);

利用ADO.NET的上述方法,我们已经完成了对数据库的完整操作。

注:上述代码是利用DataAdapter对数据库进行读写的基本原理,非常重要,我们后面的改造都将以此作为依据。

虽然我们已经能完成对数据的操作,但现实际上还是存在很多问题:

1、我们只是对MSSql数据库进行操作,如果要对Oracle或MySql进行操作我们得定义新的Oracle或MySql数据对象,如果能由系统自动判断操作的数据库类型,我们就能省去对数据对象的关注。

2、我们做了太多的准备工作,我们只对一张表进行操作,如查我们要对多张表进行操作,参数又很多,实际上会产生大量的重复代码,我们得考虑消除这些代码。

对于上述问题,如果我们自己实现一个数据访问层,对ADO.NET对象进行封装,只关注实际的数据的操作,而不关注系统是如何与数据库进行连接、如何进行参数传递,那我们的需求就算基本满足了。

我们可以先进行假设,需要达成如下效果,以伪码的形式给出:

  1. 创建数据执行者:DataExecuter:execObj;    
  2. 创建数据映射对象:DataMapping map;    
  3. 由映射对象填充数据集:map.Fill(sqlText, "TEST", ds);    
  4. 设置映射对象更新命令:map.SetCommands(Insert | Update | Delete, ds);    
  5. DataTable进行实际增、删、改操作。    
  6. 数据执行者执行***的变更操作:execObj.Update(ds);    

 

后面我将一步步看到上述假设是如何实现的。

原文链接:http://www.cnblogs.com/FlySoul/archive/2011/05/02/2034368.html

【编辑推荐】

  1. 晒晒我的通用数据访问层
  2. 几步走,教你创建简单访问数据库方法
  3. 一句代码实现批量数据绑定 下
  4. 一步一步设计你的数据库1
  5. 不重复随机数列生成算法

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/266971.html<

(0)
管理的头像管理
上一篇2025-05-06 05:07
下一篇 2025-05-06 05:09

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注