ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接。于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(《ASP.NET MVC5 网站开发之美》,当然,我不是做广告的,只因它确实还可以),里面关于二者之间的区别及原理讲得很清楚,下面我们就进入主题。今天心情不错。。。。
我们都知道ADO.NET提供了对数据库或外部数据源的数据访问接口,它本身实现了面向连接与面向无连接的数据访问方式。面向连接是以数据库连接为基础的,在打开数据库连接后,将数据访问指令送入数据库内执行后,利用游标来存取结果集的访问模式,优点是访问速度快,缺点则是必须建立连接,且会有锁定问题;面向无连接则是先以面向连接的方式获取数据后,将数据存放在内存里,再通过一系列的对象、属性与方法等进行数据的访问,而这些访问工作都是在内存内进行的,与数据库并没有维持连接,优点是节约数据库的连接资源且没有访问的锁定问题,但缺点就是耗费内存,且数据的更新不会反映到数据库内。
下面来看看具体的原理吧。
面向连接的操作
面向连接的操作以IDbConnection接口为起点,通过OPen()打开数据库连接,在操作数据库完成后用Close()关闭连接并且释放资源。若是需要数据库事务处理,则要在连接打开后使用BeginTransaction方法启动事务处理,并得到IDbTransaction接口的对象。事务处理的动作一般来说不是全部完成就是全部失败,因此在执行过程中若发生任何错误或是需要撤销事务处理时可使用Rollback()来撤销,反之则使用Commit()来提示执行完成。ADO.NET也是允许事务处理启动时设置事务处理的隔离层次。
当连接打开后,即可对数据库进行SQL指令的操作,而在执行SQL指令前,必须先将指令封装于IDbCommand接口对象,这个对象内含了参数的设置,而在SQL指令中使用参数是预防SQL Injecion的最好方法,对象也提供了控制执行方式的配置设置,例如:执行超时(Timeout),指令准时(Prepare)以及加入事务处理等设置。当指令设置完成时,就可以通过ExecuteReader()、ExecuteNonQuery()以及ExecuteScalar()来执行。
ExecuteReader()会传回IDataReader接口对象,IDataReader接口对象代表了数据库返回的单向前向游标,并且单向前向游标是只读的,所以不能直接操作IDataReader接口对象来修改数据,修改数据唯一可用的方法只有执行INSERT、UPDATE和DELETE这三个SQL指令,这样的方法能让程序访问数据库的速度加快不少,而且ADO.NET也不再需要维护数据集的游标相对的节约耗用的资源ExecuteReader()是获取IDateReader接口对象的唯一方法,而IDbCommand的其他方法,如ExecueNonQuery()以及ExecuteScalar()都调用了ExecuteReader()来执行指令,只是最后返回的值不同而已。
IDateReader接口对象的使用相当简单,每调用一次Read方法即可将游标往前移动一行(每行都是一个IDateReader接口对象),而在游标移动后,就可以通过GetValue()来获取字段的值,或者通过使用GetOrdinal()获取字段的索引编号,也可以通过使用IsDBNull()来判断字段是否为NULL值等。
面向无连接的操作
为了支持面向无连接的对象,ADO.NET提供了IDateAdapter接口以及IDbDataAdapter接口对象以支持脱机数据的填充和更新。IDataAdapter接口内包含了Fill()以及Update()分别掌管数据的填充与更新,而IDbDataAdapter接口对象则包含了SelectCommand、InsertCommand、UpdateCommand与DeleteCommand等4中指令,以支持脱机数据的CRUD等4项工作。
脱机功能是ADO.NET的特色之一,由DataSet与DataTable提供,DataSet可视为内存里的数据库,DataTable则是内存里的数据表,一个DataSet可以容纳多个DataTable,就像数据库内可以容纳多个数据表一样,并且DataTable之间也可以拥有条件以及关联的设置。
DataSet的数据有面向无连接的IDbDataAdapter接口对象的Fill()获得的,IDbDataAdapter会利用SelectCommand属性所内含的SELECT指令执行的结果来生成相应的DataTable,并加到DataSet内,或是直接以Fill()生成DataTable,再手动加到DataSet亦可。DataSet本身也支持对XML数据的输入和输出,只要调用ReadXml()即可由XML数据生成DataSet,或调用WriteXml()生成XML数据,DataTable也具有相同的方法。DataSet和DataTable也同时支持合并的功能,DataSet和DataTable的Merge()允许程序将两个数据集或数据行合并,同时视MissingSchemaAction所定义的方法判断如何针对遗失或无法对应的结构字段做处理。
DataTable是实际储存数据的对象,它本身是一个内含大量集合对象的容器,DataTable内容纳了定义字段的DataColumn对象以及加载数据的 DataRow对象,每个DataRow代表一个数据行,因此数据行端的判断与操作都可以在DataRow的成员中找到,例如判断字段是否为NULL值的IsNull(),传回所有数据的ItemArray属性,以及判断是否有改变的RowState属性等。DataColumn对象则专司字段的数据类型与格式定义,DataRow内的字段基本上一定会和DataTable的Columns属性内容的DataColumn对象相同。
每个DataRow都有标记版本的概念,DataRow对象内含的RowState属性担当了控制版本的角色。RowState默认的值为Unchanged,当DataRow被加入到DataTable时,RowState会被设置为Added,当程序修改了DataRow内的数据,或是调用DataRow的SetModified()时,会将RowState转换为Modified;当调用DataTable的Remove()删除数据行时,RowState会被设为Deleted。DataTable的Getchanged会搜索所有RowState不是Unchanged的DataRow对象,并传回一个DataTable ,以利于程序找出所有被修改过的数据行,AcceptChanges()会将所有修改过的数据行的RowState全部转换为Unchanged,并将删除的数据行从DataTable中删除,而RejectChanges()则会将修改过的数据行恢复到原来的状态,把修改过或删除的值复原,并将新增的数据行从DataTable中删除。IDbDataAdapter的Update()利用数据行的版本来决定调用INsertCommand、UodateCommand或DeleteCommand。
除了基本的数据管理外,DataTable也支持数据的搜索与汇总功能,Select()允许程序使用搜索指令来检索数据行,并传回符合的数据集,Compute()则允许程序使用汇总指令对数据行进行汇总处理,例如SUM或是AVG等指令。DataTable内也可以设置与其他DataTable的关联,关联对象由DataRelation对象提供,不过,DataRelation对象只记录DataTable之间的关联,而不实际负责数据的控制。与DataRelaion对象相似的是Constraint对象,它允许程序对数据列内的数据进行限制,例如外键限制或是唯一性限制等,这些限制会在数据行操作时自动由DataTable进行检查。脱机数据也可支持特定范围的数据处理功能,此功能由DataView提供,DataView对象内的RowFilter属性可设置DataView如何过滤DataTable内的数据行,或是运用RowStateFilter属性针对RowState进行过滤。DataView也提供创建与修改的功能,或是将过滤出的数据列汇集成新的DataTable。
ADO.NET编程之美----数据访问方式(面向连接与面向无连接)的更多相关文章
- [翻译]比较ADO.NET中的不同数据访问技术(Performance Comparison:Data Access Techniques)
Performance Comparison: Data Access Techniques Priya DhawanMicrosoft Developer Network January 2002 ...
- 关系型数据库工作原理-查询优化器之数据访问方式(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- OPC Utgard的数据访问方式
1.同步读取某个点位的值 Item项的read()方法 Server server = new Server(BaseConfiguration.getCLSIDConnectionInfomatio ...
- ado.net 实体类_数据访问类
实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- ADO.net 实体类 、数据访问类
程序分三层:界面层.业务逻辑层.数据访问层 比较规范的写程序方法,要把业务逻辑层和数据访问层分开,此时需要创建实体类和数据访问类 实体类: 例 using System; using System.C ...
- ADO,NET 实体类 和 数据访问类
啥也不说,看代码. --SQl中 --建立ren的数据库,插入一条信息 create database ren go use ren go create table xinxi ( code ) pr ...
- ADO.NET笔记——使用通用数据访问
相关知识: 前面所有示例,君是访问特定的数据库(SQL Server),因此注入SqlConnection.SqlCommand.SqlDataReader.SqlDataAdapter等类名都添加了 ...
- 007-elasticsearch5.4.3【一】概述、Elasticsearch 访问方式、Elasticsearch 面向文档、常用概念
一.概述 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Elasticsearch 也是使用 Java 编写的,它的内部使用 L ...
- (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)
一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...
随机推荐
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- 为什么 NaN 不等于自身?
NaN 即Not a Number , 不是一个数字, 那么NaN到底是什么呢? 话说在JavaScript中,有6大数据类型,分别包括string,number,boolean,undefined, ...
- Js new到底发生了什么
在Js中,我们使用了new关键字来进行实例化 那么在这个new的过程中到底发生了什么? 关于构造函数的return 正常来讲构造函数中是不用写return语句的,因为它会默认返回新创建的对象. 但是, ...
- 【.net 深呼吸】跨应用程序域执行程序集
应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...
- SDWebImage源码解读之SDWebImageCache(下)
第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...
- 利用apply()或者rest参数来实现用数组传递函数参数
关于call()和apply()的用法,MDN文档里写的非常清晰明白,在这里就不多做记录了. https://developer.mozilla.org/zh-CN/docs/Web/JavaScri ...
- Log4net - 项目使用的一个简单Demo
参考页面: http://www.yuanjiaocheng.net/entity/entitytypes.html http://www.yuanjiaocheng.net/entity/entit ...
- Java compiler level does not match解决方法
从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description Resource Path Location Type Java compiler level d ...
- 数塔问题(DP算法)自底向上计算最大值
Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数 ...
- 如何搭建git服务器
一.前言 现在越来越多的公司用git进行版本控制,不过git是默认是开源的,如果私有的话是需要付费的,如果不想付费自己可以搭建一个git服务器用来版本控制. 二.服务器端操作 1.安装git sudo ...