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对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...
随机推荐
- 为你的Web程序加个启动画面
.Net开发者一定熟悉下面这个画面: 这就是宇宙第一IDE Visual Studio的启动画面,学名叫Splash Screen(或者Splash Window).同样,Javar们一定对Eclip ...
- 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...
- [C#] 进阶 - LINQ 标准查询操作概述
LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- 【架构设计】分布式文件系统 FastDFS的原理和安装使用
本文地址 分享提纲: 1.概述 2. 原理 3. 安装 4. 使用 5. 参考文档 1. 概述 1.1)[常见文件系统] Google了一下,流行的开源分布式文件系统有很多,介绍如下: -- mo ...
- android绘制圆形图片的两种方式
看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...
- Linux学习笔记(一):常用命令
经过统计Linux中能够识别的命令超过3000种,当然常用的命令就远远没有这么多了,按照我的习惯,我把已经学过的Linux常用命令做了以下几个方面的分割: 1.文件处理命令 2.文件搜索命令 3.帮助 ...
- Linux的学习笔记
Linux,1991年,系统安全,良好的可移植性,多用户,多任务,良好的兼容性,良好的用户界面, 主流的是RedHat或者CentOS, CentOS 设置的网关 192.168.2.2 Window ...
- 实现php连接memcached
准备工作: 实现lnmp环境 给php添加模块,so库 下载扩展包:memcache-2.2.5.tgz wget http://pecl.php.net/get/memcache-2.2.5.tgz