100165601.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 164 行 · 第 1/2 页
HTM
164 行
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这几个命令设置了每个参数的值,然后执行存储过程。该过程没有返回值,因此使用</span><span lang="EN-US">ExecuteNonQuery</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"><a ftel="recorddeleting"><span style="FONT-FAMILY: 宋体">下一个存储过程可用于从数据库中删除一个</span><span lang="EN-US">Region</span></a><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">CREATE PROCEDURE RegionDelete (@RegionID INTEGER) AS</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> SET NOCOUNT OFF</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> DELETE FROM Region</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> WHERE RegionID = @RegionID</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">GO</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这个过程只需要该记录的主键码值。下面的代码使用</span><span lang="EN-US">SqlCommand</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-GB">SqlCommand aCommand = new SqlCommand("RegionDelete" , conn);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB">aCommand.CommandType = CommandType.StoredProcedure;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB">aCommand.Parameters.Add(new SqlParameter("@RegionID" , SqlDbType.Int , 0 , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> "RegionID"));</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-GB">aCommand.UpdatedRowSource = UpdateRowSource.None;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这个命令只接收一个参数,如下面的代码所示,它执行</span><span lang="EN-US">RegionDelete</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-GB">aCommand.Parameters["@RegionID"].Value= 999;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-GB">aCommand.ExecuteNonQuery();</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-GB">2. </span><span style="FONT-FAMILY: 黑体">调用返回输出参数的存储过程</span></h4>
<p class="MsoNormal"><a ftel="outputparameters"><span style="FONT-FAMILY: 宋体">前面两个执行存储过程的示例都没有返回值。如果存储过程包含输出参数,则它们就需要在</span><span lang="EN-US">.NET</span></a><span style="FONT-FAMILY: 宋体">客户程序中定义,以便在过程返回时填充其输出参数。下面的示例说明了如何在数据库中插入记录,把该记录的主键码返回给调用者。</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">记录的插入</span></p>
<p class="MsoNormal"><a ftel="recordinserting"><span lang="EN-US">Region</span></a><span style="FONT-FAMILY: 宋体">表仅由一个主键码</span><span lang="EN-US">(RegionID)</span><span style="FONT-FAMILY: 宋体">和描述字段</span><span lang="EN-US">(RegionDescription)</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">CREATE PROCEDURE RegionInsert(@RegionDescription NCHAR(50),</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> @RegionID INTEGER OUTPUT)AS</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> SET NOCOUNT OFF</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> SELECT @RegionID = MAX(RegionID)+ 1</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> FROM Region</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> INSERT INTO Region(RegionID, RegionDescription)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> VALUES(@RegionID, @RegionDescription)</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">GO</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">插入过程创建一个新</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">Region</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">记录,在数据库本身生成主键码值时,这个值作为输出参数从过程返回</span><span lang="EN-US">(@RegionID)</span><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">)</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">,通常不使用输出参数,而选择整个插入的行,把该行返回给调用者。</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">.NET</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">类可以处理这两种情况。</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-GB">SqlCommand aCommand = new SqlCommand("RegionInsert" , conn);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB">aCommand.CommandType = CommandType.StoredProcedure;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB">aCommand.Parameters.Add(new SqlParameter("@RegionDescription" , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> SqlDbType.NChar , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> 50 , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> "RegionDescription"));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB">aCommand.Parameters.Add(new SqlParameter("@RegionID" , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> SqlDbType.Int, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> 0 , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> ParameterDirection.Output ,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> false , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> 0 , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> 0 , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> "RegionID" , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> DataRowVersion.Default , </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB"> null));</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-GB">aCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">其中参数的定义比较复杂。第二个参数</span><span lang="EN-US">@RegionID</span><span style="FONT-FAMILY: 宋体">定义为包含其参数定向</span><span style="FONT-FAMILY: 宋体">,在这个示例中是</span><span lang="EN-US">Output</span><span style="FONT-FAMILY: 宋体">。除这个标志之外,该示例还在最后一行使用</span><span lang="EN-US">UpdateRowSource</span><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></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">调用这个存储过程类似于前面的示例,但在这个实例中,需要在执行完过程后读取输出参</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-GB">aCommand.Parameters["@RegionDescription"].Value = "South West";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-GB">aCommand.ExecuteNonQuery();</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-GB">int newRegionID = (int) aCommand.Parameters["@RegionID"].Value;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在执行完命令后</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">读取</span><span lang="EN-US">@RegionID</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">ExecuteNonQuery()</span><span style="FONT-FAMILY: 宋体">,应调用另一个方法</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">例如</span><span lang="EN-US">ExecuteReader())</span><span style="FONT-FAMILY: 宋体">,遍历所有的返回记录。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165600.htm">上一页</a> <a href="index.html">首页</a> <a href="100165602.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='100165601.htm'><font color='red'>21.3.2 调用存储过程</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165598.htm'>21.2.2 事务处理</a></div><div style='float:right;width:49%'>·<a href='100165599.htm'>21.3 命令</a></div><div style='float:left;width:49%'>·<a href='100165600.htm'>21.3.1 执行命令</a></div><div style='float:right;width:49%'>·<a href='100165602.htm'>21.4 快速数据访问:数据读取器</a></div><div style='float:left;width:49%'>·<a href='100165603.htm'>21.5 管理数据和关系:DataSet类</a></div><div style='float:right;width:49%'>·<a href='100165604.htm'>21.5.1 数据表</a></div></div>
</div>
</div>
</div>
<!-- 评论 -->
<!-- 今日推荐 -->
</div>
<!-- 页脚 -->
<div id="foot">
<img src="../../book/readbook.aspx@node=5601&bookid=16&bookname=21.3.2++_25b5_25f7_25d3_25c3_25b4_25e6_25b4_25a2_25b9_25fd_25b3_25cc" alt="" width="0" height="0" />
<style>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?