项目开发中,大多数开发人员的核心工作就是如何对数据进行存储及访问。为了进行数据操作,我们首先得解决几个基本问题:
1、如何与一个数据库建立连接。
2、如何从数据库读取相应的数据。
3、如何对数据表进行增改操作。
.NET中,ADO.NET很方便的解决了上面三个问题,我们可以使用DbConnection进行连接,DataSet进行数据存储,DataAdapter进行数据更新。先看一段代码:

//创建DbConnection对象连接数据库
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "server=.;uid=sa;password=123456; database=DATA_BASE; max pool size=300;";

//创建DataAdapter、Command对象,读取数据
SqlDataAdapter da = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM TEST";
da.SelectCommand = cmd;

//创建DataSet对象,存储数据,建立与物理表的映射
DataSet ds = new DataSet();
da.Fill(ds, "TEST");

上述代码实现对数据库“DATA_BASE”中“TEST”表数据读取,并用DataSet时行存储。
既然读出了TEST表中的数据,接下来要解决的就是如何对TEST表进行增、删、改操作。
为实现增、删、改操作,需要为DataAdapter指定InsertCommand、DeleteCommand以及UpdateCommand,并为每个Command对象绑定参数:

//新增数据
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO TEST (ID, NAME, VAL) VALUES (@ID, @NAME, @VAL)";
SqlParameter param = new SqlParameter("@ID", null);
param.SourceColumn = "ID";
cmd.Parameters.Add(param);
param = new SqlParameter("@NAME", null);
param.SourceColumn = "NAME";
cmd.Parameters.Add(param);
param = new SqlParameter("@VAL", null);
param.SourceColumn = "VAL";
cmd.Parameters.Add(param);
da.InsertCommand = cmd;

//修改数据
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "UPDATE TEST SET NAME = @NAME, VAL = @VAL WHERE ID = @ID";
param = new SqlParameter("@ID", null);
param.SourceColumn = "ID";
cmd.Parameters.Add(param);
param = new SqlParameter("@NAME", null);
param.SourceColumn = "NAME";
cmd.Parameters.Add(param);
param = new SqlParameter("@VAL", null);
param.SourceColumn = "VAL";
cmd.Parameters.Add(param);
da.UpdateCommand = cmd;

//删除数据
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "DELETE FROM TEST WHERE ID = @ID";
param = new SqlParameter("@ID", null);
param.SourceColumn = "ID";
cmd.Parameters.Add(param);
da.DeleteCommand = cmd;

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

DataTable dt = ds.Tables["TEST"];
dt.PrimaryKey = new DataColumn[] { dt.Columns["ID"] };
dt.Rows.Add(new object[]{
Guid.NewGuid().ToString(), string.Format("测试:{0}", DateTime.Now), string.Format("测试值:{0}", DateTime.Now)
});

DataRow dr = dt.Rows.Find("f8dc2c64-f51a-4e99-bde1-a20069b09c3a");
if (dr != null)
{
dr["NAME"] = string.Format("测试修改:{0}", DateTime.Now);
}

dr = dt.Rows.Find("ed7d079b-81ec-4ba4-bf85-688621e495e7");
if (dr != null)
{
dr.Delete();
}

最后调用DataAdapter的Update方法保存变更后的数据:
da.Update(ds, "TEST");

利用ADO.NET的上述方法,我们已经完成了对数据库的完整操作。
注:上述代码是利用DataAdapter对数据库进行读写的基本原理,非常重要,我们后面的改造都将以此作为依据。

虽然我们已经能完成对数据的操作,但现实际上还是存在很多问题:
1、我们只是对MSSql数据库进行操作,如果要对Oracle或MySql进行操作我们得定义新的Oracle或MySql数据对象,如果能由系统自动判断操作的数据库类型,我们就能省去对数据对象的关注。
2、我们做了太多的准备工作,我们只对一张表进行操作,如查我们要对多张表进行操作,参数又很多,实际上会产生大量的重复代码,我们得考虑消除这些代码。

对于上述问题,如果我们自己实现一个数据访问层,对ADO.NET对象进行封装,只关注实际的数据的操作,而不关注系统是如何与数据库进行连接、如何进行参数传递,那我们的需求就算基本满足了。
我们可以先进行假设,需要达成如下效果,以伪码的形式给出:

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

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

转载于:https://www.cnblogs.com/FlySoul/archive/2011/05/02/2034368.html

打造自己的数据访问层(一)相关推荐

  1. 打造自己的数据访问层(二)

    上一篇打造自己的数据访问层(一)中,我们已了解了.NET对数据库操作的基本原理,并就Ado.net对象的使用提出了几点疑问: 1.如何由系统来判断数据库型. 2.如何消除这些重复代码. 而上篇中也提出 ...

  2. 打造自己的数据访问层(三)

    上一篇打造自己的数据访问层(二)中,我们已具体实现了数据访问层对应的功能,该进行收尾工作了,先来看段代码,试试上一篇实现的功能: View Code string sqlText = "SE ...

  3. 数据访问层之数据库访问设计(转)

    在PetShop中,系统需要处理的数据库对象分为两类:一是数据实体,对应数据库中相应的数据表.它们没有行为,仅用于表现对象的数据.这些实体类都被放到Model程序集中,例如数据表Order对应的实体类 ...

  4. CYQ.Data 轻量数据访问层(一) 概述

    在很久很久以前.2007年底,我曾发布过CYQ.Data.DLL,那时的学术氛围很浓,评论的也比较重 在那里,我曾做过一些简介与使用方法的帮助 在这个系列中,我将一步一步开源并讲解实现的过程,由于文章 ...

  5. PetShop 4.0 数据访问层之我所见

    个人感觉数据访问层,设计上应该可以更精简. 现有的框架是一个DAL,对应一个Helper(我们可以理解其实就是真正的数据引擎).这种方式实现上确实很简单,但是有重复的地方.对于每种DAL,不同的只是H ...

  6. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层

    原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...

  7. 数据访问层设计(持久层架构设计)

    1.在线访问[直接根据需要每次调用] 2.Data Access Object [感觉类似于自己写的数据访问层明天CAT,专门用来访问数据库的] 3.DataTransfer Object [感觉类似 ...

  8. Spring Boot - 构建数据访问层

    文章目录 基础规范: JDBC 关系型数据库访问规范 JDBC 规范中的核心编程对象 DriverManager DataSource Connection Statement/PreparedSta ...

  9. Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层

    在上一篇中,我们已经搭建起了整个解决方案的项目,并且建好了数据库,完成了实体类和Nhibernate映射文件.在本文中,将定义数据访问接口,并利用Nhibernate实现接口,利用Spring.net ...

  10. ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...

    ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...

最新文章

  1. 算法基础(09)— 字符串常用操作
  2. a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)
  3. LoRa、蓝牙、技术在电子显示牌上的应用
  4. 变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在
  5. 'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件
  6. 4.6上午口语练习 阅读词汇
  7. MATLAB_平面几何_判断两平面矩形是否干涉
  8. 安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效
  9. JVM中8种垃圾收集器小结
  10. 网络传输大数据——内存映射
  11. python和java选择哪个-python与java,该选择哪一个?
  12. WordPress源代码研究-插件机制
  13. 破解补丁的方式 无限期破解idea
  14. java pdf文件转换图片,pdf文件转图片(java实现)
  15. 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
  16. python自动化测试平台方案_基于Python的软件测试自动化平台研究
  17. this is related to npm not being able to find a file
  18. Kinetics-400数据集下载
  19. LightSwitch 社区内容汇总 – 2012年9月
  20. 智能电视root,获取最高权限,su: must be suid to work properly解决

热门文章

  1. 多图像合成为延时视频的方法
  2. 在Mac上查找和删除相似或重复的照片的三种方法
  3. xadmin 组件拓展自定义使用
  4. (完美)华为畅玩7A AUM-AL00的Usb调试模式在哪里打开的步骤
  5. Fiddler抓包7-post请求(json)
  6. Oracle 开放源代码项目
  7. 再见 FTP/SFTP!是时候拥抱下一代文件传输利器 Croc 了!
  8. 推荐一款 IDEA 生成代码神器,写代码再也不用加班了!
  9. 【性能优化实战】4次版本迭代,我们将项目性能提升了360倍!
  10. Python被誉为神奇的“胶水语言”,到底神奇在哪?