100165605.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 440 行 · 第 1/5 页
HTM
440 行
<p class="a4" style="MARGIN-LEFT: 10.7pt"><span style="FONT-FAMILY: 宋体">自从最后一次调用</span><span lang="EN-US">AcceptChanges</span><span style="FONT-FAMILY: 宋体">以来,数据行都没有发生改变</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><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">AcceptChanges</span><span style="FONT-FAMILY: 宋体">方法。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">修改</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">中数据最常见的方式是使用索引器,但如果对数据进行了许多修改,就需要考虑使用</span><span lang="EN-US">BeginEdit() </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> EndEdit()</span><span style="FONT-FAMILY: 宋体">方法。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在对</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">中的行进行了修改后,就会在该行的</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">上引发</span><span lang="EN-US">ColumnChanging</span><span style="FONT-FAMILY: 宋体">事件。可以重写</span><span lang="EN-US">DataColumnChangeEventArgs </span><span style="FONT-FAMILY: 宋体">类的</span><span lang="EN-US">ProposedValue</span><span style="FONT-FAMILY: 宋体">属性,按照需要修改它。这是在列值上进行某些数据有效性验证的一种方式。如果在进行修改前调用</span><span lang="EN-US">BeginEdit()</span><span style="FONT-FAMILY: 宋体">方法,就不会引发</span><span lang="EN-US">ColumnChanging</span><span style="FONT-FAMILY: 宋体">事件,可以进行多次修改,再调用</span><span lang="EN-US">EndEdit()</span><span style="FONT-FAMILY: 宋体">方法,保存这些修改。如果要回退到初值,应调用</span><span lang="EN-US">CancelEdit()</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">可以以某种方式链接到其他数据行上,在数据行之间能够建立可导航的链接,这在主</span><span lang="EN-US">/</span><span style="FONT-FAMILY: 宋体">从数据表中非常常见。</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">包含一个</span><span lang="EN-US">GetChildRows()</span><span style="FONT-FAMILY: 宋体">方法,该方法可以从同一个</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">DataSet</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">的另一个表中把一组相关行返回为当前行。这些将在本章后面的“数据关系”一节中介绍。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-GB">2. </span><span style="FONT-FAMILY: 黑体">模式的生成</span></h4>
<p class="MsoNormal"><a ftel="DataTable2"></a><a ftel="schemas"><span style="FONT-FAMILY: 宋体">为</span><span lang="EN-US">DataTable</span></a><span style="FONT-FAMILY: 宋体">创建模式有</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">种方式:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">让运行库来完成</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">编写代码来创建表</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">模式生成器</span></p>
<p class="MsoNormal"><span lang="EN-GB">(1) </span><span style="FONT-FAMILY: 宋体">运行</span><span style="FONT-FAMILY: 宋体">库</span><span style="FONT-FAMILY: 宋体">生成的模式</span> </p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">前面的</span><span lang="EN-US">DataRow</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">SqlDataAdapter da = new SqlDataAdapter(select , conn);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">DataSet ds = new DataSet();</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">da.Fill(ds , "Customers");</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">这是很容易使用的,但也有几个缺点。例如,必须利用默认的列名来处理<span style="LETTER-SPACING: -1pt">——</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">这是可以的,但在某些情况下,还要把物理数据库的列</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">如</span><span lang="EN-US">PKID)</span><span style="FONT-FAMILY: 宋体">重新命名为一个用户友好性更高的名称。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">自然,可以在</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">子句中重新给列指定别名,例如</span><span lang="EN-US">SELECT PID AS PersonID FROM PersonTable</span><span style="FONT-FAMILY: 宋体">。最好不要在</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">中重新给列命名,因为列实际上只需要在屏幕上显示一个“比较好”的名称即可。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">自动生成</span><span lang="EN-US">DataTable/DataColumn</span><span style="FONT-FAMILY: 宋体">的另一个潜在的问题是不能控制运行库为列选择的数据类型。运行库可以确定正确的数据类型,但有时需要对此有更多的控制。例如,为给定的列定义枚举类型,以简化类的用户代码。如果接受运行库生成的默认列类型,该列就可能是一个</span><span lang="EN-US">32</span><span style="FONT-FAMILY: 宋体">位的整数,而不是有预定选项的枚举。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">最后,也是最有可能出的问题是,在使用自动生成的表时,不能对</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">中的数据进行类型安全的访问<span style="LETTER-SPACING: -1pt">——</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">索引器就会返回</span><span lang="EN-US">object</span><span style="FONT-FAMILY: 宋体">的实例,而不是派生的数据类型。如果要用代码对表达式进行类型转换,就可以跳过下面的章节。</span></p>
<p class="MsoNormal"><span lang="EN-US">(2) </span><span style="FONT-FAMILY: 宋体">手工编码的模式</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">用生成代码来创建</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">再用相关的</span><span lang="EN-US">DataColumns</span><span style="FONT-FAMILY: 宋体">来填充是相当简单的。本节的示例将访问</span><span lang="EN-US">Northwind</span><span style="FONT-FAMILY: 宋体">数据库中的</span><span lang="EN-US">Product</span><span style="FONT-FAMILY: 宋体">表</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">如图</span><span lang="EN-US">21-6</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="144" src="21/image006.jpg" width="224" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US"> 21-6</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下面的代码生成了一个</span><span lang="EN-US">DataTable</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></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">public static void ManufactureProductDataTable(DataSet ds)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> DataTable products = new DataTable("Products");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("ProductID", typeof(int)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("ProductName", typeof(string)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("SupplierID", typeof(int)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("CategoryID", typeof(int)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("QuantityPerUnit", typeof(string)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("UnitPrice", typeof(decimal)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("UnitsInStock", typeof(short)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("UnitsOnOrder", typeof(short)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("ReorderLevel", typeof(short)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> products.Columns.Add(new DataColumn("Discontinued", typeof(bool)));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ds.Tables.Add(products);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">可以改变</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">示例中的代码,使用新生成的表定义:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">string source = "server=(local)\\NetSDK;" +</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> "integrated security=sspi;" + </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> "database=Northwind";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">string select = "SELECT * FROM Products";</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">SqlConnection conn = new SqlConnection(source);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">SqlDataAdapter cmd = new SqlDataAdapter(select, conn);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">DataSet ds = new DataSet();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">ManufactureProductDataTable(ds);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">cmd.Fill(ds, "Products");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">foreach(DataRow row in ds.Tables["Products"].Rows)</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("'{0}' from {1}", row[0], row[1]);</span></p>
<p class="MsoNormal"><span lang="EN-US">ManufactureProductDataTable</span><span style="FONT-FAMILY: 宋体">方法创建一个新</span><span lang="EN-US">DataTable</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><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><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">DataSet</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US"> DataTable</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> DataRow</span><span style="FONT-FAMILY: 宋体">,为表、行和列定义类型安全的存取器。可以自己生成这段代码,这并不是特别乏味,最终将得到可以进行类型安全访问的类。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果不愿意自己生成这些类型安全的类,可以使用帮助。</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">允许使用</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">模式来定义</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">DataTables</span><span style="FONT-FAMILY: 宋体">和本节介绍的其他类。本章后面的</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">模式一节详细介绍了这个方法。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165604.htm">上一页</a> <a href="index.html">首页</a> <a href="100165606.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='100165605.htm'><font color='red'>21.5.2 数据列</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165602.htm'>21.4 快速数据访问:数据读取器</a></div><div style='float:right;width:49%'>·<a href='100165603.htm'>21.5 管理数据和关系:DataSet类</a></div><div style='float:left;width:49%'>·<a href='100165604.htm'>21.5.1 数据表</a></div><div style='float:right;width:49%'>·<a href='100165606.htm'>21.5.3 数据关系</a></div><div style='float:left;width:49%'>·<a href='100165607.htm'>21.5.4 数据约束</a></div><div style='float:right;width:49%'>·<a href='100165608.htm'>21.6 XML模式</a></div></div>
</div>
</div>
</div>
<!-- 评论 -->
<!-- 今日推荐 -->
</div>
<!-- 页脚 -->
<div id="foot">
<img src="../../book/readbook.aspx@node=5605&bookid=16&bookname=21.5.2++_25ca_25fd_25be_25dd_25c1_25d0" alt="" width="0" height="0" />
<style>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?