打造自己的数据访问层(一)
项目开发中,大多数开发人员的核心工作就是如何对数据进行存储及访问。为了进行数据操作,我们首先得解决几个基本问题:
1、如何与一个数据库建立连接。
2、如何从数据库读取相应的数据。
3、如何对数据表进行增改操作。
.NET中,ADO.NET很方便的解决了上面三个问题,我们可以使用DbConnection进行连接,DataSet进行数据存储,DataAdapter进行数据更新。先看一段代码:
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进行数据操作:
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对象进行封装,只关注实际的数据的操作,而不关注系统是如何与数据库进行连接、如何进行参数传递,那我们的需求就算基本满足了。
我们可以先进行假设,需要达成如下效果,以伪码的形式给出:
创建数据映射对象: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
打造自己的数据访问层(一)相关推荐
- 打造自己的数据访问层(二)
上一篇打造自己的数据访问层(一)中,我们已了解了.NET对数据库操作的基本原理,并就Ado.net对象的使用提出了几点疑问: 1.如何由系统来判断数据库型. 2.如何消除这些重复代码. 而上篇中也提出 ...
- 打造自己的数据访问层(三)
上一篇打造自己的数据访问层(二)中,我们已具体实现了数据访问层对应的功能,该进行收尾工作了,先来看段代码,试试上一篇实现的功能: View Code string sqlText = "SE ...
- 数据访问层之数据库访问设计(转)
在PetShop中,系统需要处理的数据库对象分为两类:一是数据实体,对应数据库中相应的数据表.它们没有行为,仅用于表现对象的数据.这些实体类都被放到Model程序集中,例如数据表Order对应的实体类 ...
- CYQ.Data 轻量数据访问层(一) 概述
在很久很久以前.2007年底,我曾发布过CYQ.Data.DLL,那时的学术氛围很浓,评论的也比较重 在那里,我曾做过一些简介与使用方法的帮助 在这个系列中,我将一步一步开源并讲解实现的过程,由于文章 ...
- PetShop 4.0 数据访问层之我所见
个人感觉数据访问层,设计上应该可以更精简. 现有的框架是一个DAL,对应一个Helper(我们可以理解其实就是真正的数据引擎).这种方式实现上确实很简单,但是有重复的地方.对于每种DAL,不同的只是H ...
- Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层
原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...
- 数据访问层设计(持久层架构设计)
1.在线访问[直接根据需要每次调用] 2.Data Access Object [感觉类似于自己写的数据访问层明天CAT,专门用来访问数据库的] 3.DataTransfer Object [感觉类似 ...
- Spring Boot - 构建数据访问层
文章目录 基础规范: JDBC 关系型数据库访问规范 JDBC 规范中的核心编程对象 DriverManager DataSource Connection Statement/PreparedSta ...
- Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层
在上一篇中,我们已经搭建起了整个解决方案的项目,并且建好了数据库,完成了实体类和Nhibernate映射文件.在本文中,将定义数据访问接口,并利用Nhibernate实现接口,利用Spring.net ...
- ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...
ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...
最新文章
- 算法基础(09)— 字符串常用操作
- a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)
- LoRa、蓝牙、技术在电子显示牌上的应用
- 变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在
- 'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件
- 4.6上午口语练习 阅读词汇
- MATLAB_平面几何_判断两平面矩形是否干涉
- 安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效
- JVM中8种垃圾收集器小结
- 网络传输大数据——内存映射
- python和java选择哪个-python与java,该选择哪一个?
- WordPress源代码研究-插件机制
- 破解补丁的方式 无限期破解idea
- java pdf文件转换图片,pdf文件转图片(java实现)
- 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
- python自动化测试平台方案_基于Python的软件测试自动化平台研究
- this is related to npm not being able to find a file
- Kinetics-400数据集下载
- LightSwitch 社区内容汇总 – 2012年9月
- 智能电视root,获取最高权限,su: must be suid to work properly解决