100165616.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 100 行

HTM
100
字号


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
	
        21.9.1  分层开发
</title></head>
<body>
    <div class="area">

        

        <div class="col1">
            <div class="lineBlue">
            </div>
            <!-- title -->
            <div class="arcTitle">
                <h1>
                    <a href="../16">
                        C#高级编程(第3版)
                    </a>
                </h1>
                <div style="text-align: center; font-size: 15px">
                    <a href="100165616.htm">
                        21.9.1  分层开发
                    </a>
                </div>
                <div style="text-align: center; font-size: 15px">
                    <a class="url" href="../../default.htm">http://book.csdn.net/</a>
                    2006-10-13 14:41:00
                </div>
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165616.htm'><font color='red'>21.9.1  分层开发</font></a></h1>
                        <div id="divRelateNode" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165613.htm'>21.8.1  通过数据适配器进行更新</a></div><div style='float:right;width:49%'>·<a href='100165614.htm'>21.8.2  写入XML输出结果</a></div><div style='float:left;width:49%'>·<a href='100165615.htm'>21.9  使用ADO.NET</a></div><div style='float:right;width:49%'>·<a href='100165617.htm'>21.9.2  SQL Server的键生成</a></div><div style='float:left;width:49%'>·<a href='100165618.htm'>21.9.3  命名约定</a></div><div style='float:right;width:49%'>·<a href='100165619.htm'>21.10  小结</a></div></div>
                    </div>
                </div>
                </div>
            <!-- main -->
            <div id="main">
                <div id="text">
                  <div id="csdn_zhaig_ad_yahoo_2"></div>
                  
                 <link href="css.css" rel="stylesheet" type="text/css" /><h3 style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 0cm; MARGIN-RIGHT: 0cm; FTEL: 8.15pt"><a ftel="_Toc507815173"><span lang="EN-GB">21.9.1&nbsp; </span></a><span style="FONT-FAMILY: 黑体">分层开发</span></h3>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><a ftel="tiers"><span style="FONT-FAMILY: 宋体">开发与数据交互操作的应用程序时,常常要把应用程序分层,常见的模型是一个应用层</span><span lang="EN-US">(</span></a><span style="FONT-FAMILY: 宋体">前端</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">、一个数据服务层和数据库本身。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">但使用这个模型的难题是,确定在层之间传输什么数据,以及应采用什么格式来传输数据。有了</span><span lang="EN-US">ADO.NET</span><span style="FONT-FAMILY: 宋体">,就不必担心这个问题了,这种结构一开始就提供了这种支持。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">1. </span><span style="FONT-FAMILY: 黑体">复制</span><span style="FONT-FAMILY: 黑体">和合并数据</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如何复制完整的</span><span lang="EN-US">OleDb</span><span style="FONT-FAMILY: 宋体">记录集?在</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">中,这是很简单的,只需复制</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">即可:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">DataSet source = {some dataset};</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">DataSet dest = source.Copy();</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这将创建源</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">的一个附加副本<span style="LETTER-SPACING: -1pt">&mdash;&mdash;</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">所有的</span><span lang="EN-US">DataTables</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">DataColumns</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">DataRows</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">Relations</span><span style="FONT-FAMILY: 宋体">都会被逐字地复制下来,所有的数据所处的状态都与它在源</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">中所处的状态完全相同。如果只需要复制</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">的模式,可以试试下面的代码:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">DataSet source = {some dataset};</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">DataSet dest = source.Clone();</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这也会复制所有的表、关系等,但每个复制的</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">都是空的。这个过程非常简单。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">在编写一个分层的系统</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">(</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">无论该系统是基于</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">Win32</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">还是基于</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">Web)</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">时,常见的要求是在层之间附带尽可能少的数据。这减少了资源的消耗。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要达到这个要求,</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">类有一个</span><span lang="EN-US">GetChanges()</span><span style="FONT-FAMILY: 宋体">方法,这个简单的方法执行许多任务,返回一个</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">,其中只包含源数据集中修改过的行。这是在层之间传输数据时最理想的情况,因为只有很少量的数据在网络上传输。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下面的示例说明了如何生成对</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">的一个修改:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><a ftel="GetChanges"><span lang="EN-US">DataSet source = {some dataset};</span></a></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">DataSet dest = source.GetChanges();</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这是很乏味的,下面介绍的内容会比较有趣。</span><span lang="EN-US">GetChanges</span><span style="FONT-FAMILY: 宋体">方法有两个重载形式,一个重载方法的参数是一个</span><span lang="EN-US">DataRowState</span><span style="FONT-FAMILY: 宋体">枚举的值,返回对应于该状态的行。</span><span lang="EN-US">GetChanges()</span><span style="FONT-FAMILY: 宋体">只调用</span><span lang="EN-US">GetChanges(Deleted | Modified | Added)</span><span style="FONT-FAMILY: 宋体">,该方法首先检查,以确保调用</span><span lang="EN-US">HasChanges</span><span style="FONT-FAMILY: 宋体">进行了一些修改,如果没有修改,就立即给调用者返回空值。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下一个操作是复制当前的</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">,完成后,会设置新的</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">,以忽略违反约束的情况</span><span lang="EN-US">(EnforceConstraints = false)</span><span style="FONT-FAMILY: 宋体">,然后,把每个表中所有修改的行都复制到新的</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">中。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在得到一个只包含修改内容的</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">后,就可以把它们移动到数据服务层上进行处理。在数据在数据库中更新后,修改了的数据集就返回给调用者</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">例如,存储过程的一些输出参数在某些列上有更新的值</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,然后使用</span><span lang="EN-US">Merge()</span><span style="FONT-FAMILY: 宋体">方法,把这些修改的内容合并到源</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">中。操作的顺序如图</span><span lang="EN-US">21-9</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="103" src="21/image009.gif" width="523" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 21-9</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165615.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165617.htm">下一页</a>
                </div>
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165616.htm'><font color='red'>21.9.1  分层开发</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165613.htm'>21.8.1  通过数据适配器进行更新</a></div><div style='float:right;width:49%'>·<a href='100165614.htm'>21.8.2  写入XML输出结果</a></div><div style='float:left;width:49%'>·<a href='100165615.htm'>21.9  使用ADO.NET</a></div><div style='float:right;width:49%'>·<a href='100165617.htm'>21.9.2  SQL Server的键生成</a></div><div style='float:left;width:49%'>·<a href='100165618.htm'>21.9.3  命名约定</a></div><div style='float:right;width:49%'>·<a href='100165619.htm'>21.10  小结</a></div></div>
                    </div>
                </div>
                </div>
            <!-- 评论 -->
            <!-- 今日推荐 -->
            </div>
        <!-- 页脚 -->
        <div id="foot">
         <img src="../../book/readbook.aspx@node=5616&bookid=16&bookname=21.9.1++_25b7_25d6_25b2_25e3_25bf_25aa_25b7_25a2" alt="" width="0" height="0" />
        <style>

        </div>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?