ASP.NET 3.5核心编程学习笔记(14):DataAdapter

论坛 期权论坛     
匿名技术用户   2021-1-15 13:26   205   0
<div class="blogpost-body" id="cnblogs_post_body">
<p><strong>数据适配器</strong></p>
<p>       数据适配器对象充当数据源与DataSet对象间的双向桥梁。DataSet是一种非连接的数据容器,适配器负责对它进行填充,并能把它的数据提交给特定的数据源。</p>
<p>       命令与数据适配器最大的不同在于获取数据后的返回方式。查询命令能返回一种只读、只进的游标—数据读取器。数据适配器能执行数据访问,获取所有数据,并将其打包在内存容器中—DataSet或DataTable。其实,数据适配器是一种额外的抽象层,构建于命令/数据读取器对之上。数据适配器在内部会使用命令进行查询,使用数据读取器遍历所有记录,并填充给用户的DataSet。</p>
<p><strong>SqlDataAdapter类</strong></p>
<p>       数据适配器类继承于DbDataAdapter类,并实现了IDbDataAdapter和ICloneable接口。</p>
<p>       SqlDataAdapter类的属性见下表:</p>
<p> <img alt="2011041716480334.gif" src="https://201907.oss-cn-shanghai.aliyuncs.com/cs/5606289-8c5e4d9b27e352f9f9ab32c49b4030af.gif"></p>
<p>       数据适配器是一条双向信道,能够将数据源数据读取到内存表中,也能够将内存中的数据写回数据源中。</p>
<p>       IDbAdapter接口的xxxCommand成员用于在更新操作期间控制内存数据写入数据库的方式。SelectCommand有些特殊,它不仅在批量更新中发挥着作用,还是填充操作必不可少的成员。</p>
<p>       一旦数据被加载到内存中,.NET程序便可对其执行非连接的客户端更新。批量更新是一种由客户端应用程序触发的数据提供程序过程,会将内存中所有挂起的更改应用到数据源中。在这个过程的执行期间,需要一套针对特定数据库管理系统的命令执行3项基本的操作:插入、更新、删除。InsertCommand、UpdateCommand、DeleteCommand属性存储的SqlCommand对象正是分别针对这些操作的命令。</p>
<p>       ADO.NET批量更新包括一系列通过数据适配器顺序提交给数据库的命令。作为开发者,我们只需一条命令便可触发批量更新。从概念上应记住,ADO.NET批量更新不同于通过单条命令提交的一系列查询,也不意味着将批量的命令和数据统统移动到DBMS中,并在那执行。</p>
<p>       批量更新功能强大,但并不适用于ASP.NET应用程序。问题在于Web应用程序工作在无状态协议上。这样,如果要使整个框架正常运行,我们要将内存表缓存到会话中,而这不是所有应用程序都能承受的。此外还应注意,使用批量更新可减少大量的编码工作,并可对其进行配置来处理复杂的更新。但在ADO.NET 1.x中,由于每次操作都使用其自己的命令,因而使用批量更新并无多少性能优势。从ADO.NET 2.0开始,我们可以通过新的UpdateBatchSize属性将多个更新操作集中在一条命令中。</p>
<p>       SqlDataAdapter的方法见下表:</p>
<p><img alt="2011041716501415.gif" src="https://201907.oss-cn-shanghai.aliyuncs.com/cs/5606289-1dfd221012c9c58d7670f809e21bbead.gif"></p>
<p>  数据适配器对象使用SelectCommand属性从数据源获取模式和数据。与SelectCommand关联的连接对象不必手动打开。如果该连接在读取执行前处于关闭状态,那么在获取数据时它会被自动打开,读取完毕后自动关闭。如果连接已被手动打开,则会一直保持该状态,直到手动关闭。</p>
<p>       数据适配器对象会使用Fill方法将通过查询获得的数据填充到内存对象中。这个内存结构为DataSet或DataTable对象。填充DataSet对象就是填充其中的表。数据适配器可以为程序生成的每个结果集创建一张表,表的映射代码决定其方式(如果某个表已存在,则会被更新)。将结果集映射到个上的过程分为两个阶段,分别为表映射和列映射。第一阶段中,数据适配器会确定DataTable的名称,该对象包含当前结果集记录。每个DataTable被指定的默认名称可由程序员随意更改。</p>
<p>       DataTable的默认名称取决于所调用的Fill方法的签名,例如下面的示例:</p>
<div class="cnblogs_code">
  <pre class="blockcode"></pre>
  <div>
   <span style="color:#000000;"> DataSet ds </span>
   <span style="color:#000000;">&#61;</span>
   <span style="color:#000000;"> </span>
   <span style="color:#0000ff;">new</span>
   <span style="color:#000000;"> DataSet();<br> adapter.Fill(ds);<br> adapter.Fill(ds, “MyTable”);</span>
  </div>
</div>        在第一个调用中,由查询生成的第一个结果集的名词默认为Table,如果该查询生成了多个结果集,其他的表会依次在该默认名称后面追加索引号,如Table1、Table2等。对于第二个调用,第一个结果集为MyTable,其他的表依次为MyTable1、MyTable2等。
<p>   
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP