<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_CharlesChen's Technical Space</title><subtitle type="text">简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)Not the best, only better</subtitle><id>http://feed.cnblogs.com/blog/u/33180/rss</id><updated>2012-05-25T04:00:49Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33180/rss"/><entry><id>http://www.cnblogs.com/Charles2008/archive/2012/04/17/Reflector_Project.html</id><title type="text">Reflector导出.NET工程项目的修复</title><summary type="text">我们知道Reflector可以反编译IL代码，根据它可以查看到不同语言的源代码(如C#,VB.Net等)，但是Reflector还可以导出成工程文件，得到源代码的工程项目文件。通过这种方式得到的工程文件如果用Visual Studio打开后，虽然大多数的问题是由于缺少引用“程序集”带来的编译不能通过，但是还是一些非与此相关的问题存在，需要对反编译的工程项目进行手动修改和调整。</summary><published>2012-04-17T08:34:00Z</published><updated>2012-04-17T08:34:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2012/04/17/Reflector_Project.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2012/04/17/Reflector_Project.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们知道Reflector可以反编译IL代码，根据它可以查看到不同语言的源代码(如C#,VB.Net等)，但是Reflector还可以导出成工程文件，得到源代码的工程项目文件。通过这种方式得到的工程文件如果用Visual Studio打开后，虽然大多数的问题是由于缺少引用&amp;#8220;程序集&amp;#8221;带来的编译不能通过，但是还是一些非与此相关的问题存在，需要对反编译的工程项目进行手动修改和调整。比如对于Winform程序中的窗体打开时候会出现一系列的错误提示：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1、&lt;span style="font-size: 14pt; color: red"&gt;设计器无法处理第&amp;nbsp;** 行的代码: this.okButton.DialogResult = DialogResult.Cancel; 方法&amp;#8220;InitializeComponent&amp;#8221;内的代码由设计器生成，不应手动修改。请移除任何更改，然后尝试重新打开设计器。 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;解决方法：对所有System.Winform.Forms.命名空间里面的控件需要全命名空间的申明，例如对上面的就改成&lt;/p&gt;&lt;p&gt;this.okButton.DialogResult=System.Windows.Forms.DialogResult.Cancel;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2、&lt;span style="font-size: 14pt; color: red"&gt;变量"manager"未申明或从未赋值&lt;/span&gt;&lt;/p&gt;&lt;p&gt;解决方法：本方法只限于在InitializeComponent中包含System.Resources.ResourceManager调用的窗体。&lt;/p&gt;&lt;p&gt;(1)资源文件格式转换，将.resources(二进制)文件转成.resx文件（XML)&amp;nbsp; 用C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin下 resgen.exe&amp;nbsp; 格式: resgen *.resources *.resx（.resx文件最好与窗体.cs文件同名）&lt;/p&gt;&lt;p&gt;(2)将InitializeComponent方法中的对象manager替换为resources（没错，只替换变量名^_^，全部都换掉哦，最好的办法就是更改manager的申明)&lt;/p&gt;&lt;p&gt;(3)将资源文件.resx放到窗体文件.cs相同的文件夹下。&lt;/p&gt;&lt;p&gt;(4)将所有窗体(.cs）从工程中排除，再添加（这样可以省去将.resx文件映射到.csproj的过程）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3、&lt;span style="font-size: 14pt; color: red"&gt;打开窗体后类型****.Properties.Resources&amp;#8221;没有名为&amp;#8220;Login&amp;#8221;的属性。 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;找到对应的代码：&amp;nbsp;&amp;nbsp;&amp;nbsp; this.logoPictureBox.Image = Resources.Login;表示无法找到资源文件Login名称。&lt;/p&gt;&lt;p&gt;(1)资源文件格式转换,将.resources(二进制)文件转成.resx文件(XML) 用C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin下 resgen.exe&amp;nbsp; 格式: resgen *.resources *.resx（.resx文件最好与窗体.cs文件同名）。&lt;/p&gt;&lt;p&gt;(2)然后用VS打开转换成功的*.resx文件就找到窗体的资源文件。&lt;/p&gt;&lt;p&gt;(3)将找到的窗体资源文件和对应的窗体即能解决。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4、&lt;span style="font-size: 14pt; color: red"&gt;针对winform的资源文件保护两类：项目资源文件和窗体资源文件。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;选择资源的时候，资源上下文包含本地资源和项目资源文件。&lt;/p&gt;&lt;p&gt;(1)本地资源文件就是指当前窗体的资源(命名为窗体名.resx)&lt;/p&gt;&lt;p&gt;(2)项目资源文件是项目的资源(默认为Resources.resx)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/2453907.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2012/04/17/Reflector_Project.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2012/04/16/StoreProc_ReturnValue.html</id><title type="text">存储过程返回值及输出参数笔记</title><summary type="text">在项目中写了一个存储过程： CreatePROCEDURE [dbo].[****]@ParkingAddress nvarchar(50) ASBEGINinsert into table(ParkingAddress)values(@ParkingAddress)ENDif(@@rowcount&gt;0)return 1elsereturn 0 在程序中我需要调用这个存储过程并且得到它的返回值。因此需要获取该存储过程的返回值。在程序中我通过SqlCommand中的ExecuteNonQuery方法调用成功后，一时不知道怎么得到它的返回值。(没有用output输出参数),故查了些资料得到了</summary><published>2012-04-16T09:25:00Z</published><updated>2012-04-16T09:25:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2012/04/16/StoreProc_ReturnValue.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2012/04/16/StoreProc_ReturnValue.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;在项目中写了一个存储过程：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span&gt;Create&amp;nbsp;PROCEDURE [dbo].[****]&amp;nbsp;@ParkingAddress nvarchar(50) AS&lt;br /&gt;BEGIN&lt;br /&gt;insert into table(ParkingAddress)&lt;br /&gt;values(@ParkingAddress)&lt;br /&gt;END&lt;br /&gt;if(@@rowcount&amp;gt;0)&lt;br /&gt;return 1&lt;br /&gt;else&lt;br /&gt;return 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在程序中我需要调用这个存储过程并且得到它的返回值。因此需要获取该存储过程的返回值。在程序中我通过SqlCommand中的ExecuteNonQuery方法调用成功后，一时不知道怎么得到它的返回值。(没有用output输出参数),故查了些资料得到了解决方案，下面是一些记录，这里整理在一起，便于以后查找方便。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;要点：output是在存储过程中的参数的返回值(输出参数)，而ReturnValue是存储过程返回的值(使用return关键字)，一个存储过程可以有任意多个依靠参数返回的值，但只有一个ReturnValue。&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;一、获取存储过程的返回值--通过查询分析器获得&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 存储过程大体分成三类：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;1、返回记录集的存储过程:执行结果是一个记录集，例如，从数据库中检索出符合某一个或几个条件的记录。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;2、返回数值得的存储过程(也可称为标量存储过程)，其执行完后返回一个值，例如数据库中执行一个有返回值的函数或命令。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;3、行为存储过程，用来实现数据库的某个功能，而没有返回值，例如在数据库中的更新和删除操作。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;另外：含有return的存储过程其返回值为return返回的那个值。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;没有return的存储过程，无论执行结果又无结果集，其返回值都是0，&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;&lt;font color="#000000"&gt;带有输出参数的存储过程，如果有RETURN则返回RETURN返回的那个值，如果要SELECT输出参数，则出现输出参数的值，和有无RETURN无关。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: #0000ff"&gt;&lt;span style="color: red"&gt;二、获取存储过程的返回值--通过程序获得&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;SqlParameter[] cmdParms = { .. ,new SqlParameter("@return",SqlDbType.Int)};&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.ReturnValue;或者&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Output或者&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Input; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;得到返回值 object obj = cmdParms[cmdParms.Length - 1].Value;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;根据上面的思路，最后在项目中通过&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);//这里的@ReturnValue可以根据需要自己命名，如果不命名系统将提供默认的一个名称。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.Direction = ParameterDirection.ReturnValue;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SqlCommand.Parameters.Add(P);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlCommand.ExecuteNonQuery();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object obj=SqlCommand.Parameters["ReturnValue"].Value;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;就这样程序就得到存储过程中的返回值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;问题解决!&lt;img src="http://www.cnblogs.com/Emoticons/others/cool002.jpg"  alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/2452046.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2012/04/16/StoreProc_ReturnValue.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2012/02/16/2354300.html</id><title type="text">使用本地系统帐户和域用户帐户两者区别(microsoft SQLServer2000)(ZT)</title><summary type="text">SQL Server 2000中使用本地系统帐户和域用户帐户两者区别</summary><published>2012-02-16T06:51:00Z</published><updated>2012-02-16T06:51:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2012/02/16/2354300.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2012/02/16/2354300.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本文转载于：&lt;/span&gt;&lt;a title="使用本地系统帐户和域用户帐户两者区别(microsoft SQLServer2000)" href="http://www.25175.com/200609/25175/25175_html/2010-08/3749.html" target="_blank"&gt;&lt;span style="font-size: 10pt"&gt;使用本地系统帐户和域用户帐户两者区别(microsoft SQLServer2000)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在安装SQLSERVER2000时，会有这样的&lt;/span&gt;&lt;span style="font-size: 8pt"&gt;一个选择画面，这是设&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;置启动sqlserver服务的登录身份。SQLSERVER2000装好后，会产生一个&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;MSSQLSERVER服务，在这里设置的就是启动它这个服务的登录身份。&lt;/span&gt;&lt;!--DVNEWS_AD_BEGIN--&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;img alt="" src="http://www.25175.com/200609/25175/25175_upload/2010_08/100818121532861.jpg" /&gt;&lt;br /&gt;&lt;span style="font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那么我们究竟要选择哪一个呢？两者各代表什么意思呢？下文我们就来研究一下。&lt;/span&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们先看熟悉一下两个相关概念。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;什么是凭据？&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows凭据（Credential）其实就是指用户帐户和口令，我们调用一些API，如WTSOpenServer，QueryServiceStatus，&lt;a title="25175.net网站" href="http://www.25175.net/"&gt;net&lt;/a&gt;UserEnum等等涉及到RPC的，只要当前用户存储有目标远程机的权限合适的凭据，则这些API就不会因产生ERROR_ACCESS_DENIED而执行失败。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不好理解么？那么我们来看一下访问别的计算机的情形，加深理解。访问远程计算机必然用到rpc。&lt;br /&gt;&amp;nbsp;&lt;img alt="" src="http://www.25175.com/200609/25175/25175_upload/2010_08/100818121532862.jpg" /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 上图就是我们连接到IP为172.16.100.1计算时的情形，这个时候是需要我们输入用户帐户与密码的。这里的用户帐户与密码就是所谓的凭据。&lt;br /&gt;&amp;nbsp;&lt;img alt="" src="http://www.25175.com/200609/25175/25175_upload/2010_08/100818121532863.jpg" /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当我们输入用户帐户与密码后，并把&amp;#8220;记住我的密码&amp;#8221;打上勾，点确定。那么我们的凭据(即这个用户帐户与密码)被存储了，以后再访问的时候就无须再输入。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&lt;strong&gt;安全上下文&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 安全上下文（Security context）是指在一个系统中有效的安全属性或规则。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面我们来看SQLSERVER2000服务的两种登录方式：本地系统帐户和域用户帐户&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&lt;strong&gt;本地系统帐户：&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 该帐户是对本地计算机具有管理员权限的预定义本地帐户。在本地系统帐户的安全上下文中运行的服务向远程服务器提供本地计算机的凭据。在本地系统帐户的安全上下文中运行的服务不能建立身份验证会话，因为本地系统帐户不属于域中的 Everyone 组。因此，使用该帐户的服务只能通过空会话(没有凭据)来访问网络资源。(这个访问指的是为了完成某项任务服务的自动访问，和我们的连接SQL服务器不一概念)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&lt;strong&gt;域用户帐户：&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;u&gt;使用专用域用户帐户作为登录帐户&lt;/u&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 域用户帐户是指在 Active Directory 目录服务中创建的用户帐户。该帐户是域中 Authenticated Users 组的成员。在域用户帐户的安全上下文中运行的服务向远程服务器提供域用户帐户的 Kerberos 票证。在域用户帐户的安全上下文中运行的服务可以访问经过身份验证的用户或特定用户帐户有权访问的远程服务器上的资源。&lt;br /&gt;&lt;br /&gt;&lt;u&gt;使用本地用户帐户作为登录帐户&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本地用户帐户是指在本地计算机上创建的Windows用户帐户。在本地用户帐户的安全上下文中运行的服务向远程服务器提供本地用户帐户的访问标记。如果在远程服务器上配置了匹配用户名和密码，则使用本地用户帐户的服务将能够访问同名帐户有权访问的远程服务器上的资源。虽然此方案行之有效，但是维护这些单独的帐户并保持帐户密码同步将增加管理开销。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;如果你没有加入域，但又需要连接到网络资源，那么可以使用本地用户帐户作为登录帐户。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;由此可见使用域用户帐户可以使用凭据来访问远程计算机，并使用相应的资源。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例如SQLSERVER服务，当它进行以下操作时，是需要访问远程计算机的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8226;&amp;nbsp;远程过程调用。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;#8226;&amp;nbsp;复制。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#8226;&amp;nbsp;备份到网络驱动器。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8226;&amp;nbsp;涉及远程数据源的异类联接。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;#8226;&amp;nbsp;SQL Server 代理邮件功能和 SQL 邮件。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在这几种情况下是无法不使用凭证去访问远程计算机，并使用其资源的。所以必须得把登录类型改为&amp;#8220;域用户帐户&amp;#8221;，并输入在远程计算机上配置好的，存在的&amp;#8220;用户名&amp;#8221;和&amp;#8220;密码&amp;#8221;。&lt;br /&gt;&lt;br /&gt;如果只是装在本机进行开发或学习，完全没必要使用域用户帐户登录模式，因为有时候因为切换不同用户而导致服务不能启动。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&lt;strong&gt;修改SQLSERVER服务的登录类型&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 服务的登录类型是随时可以改变的。可以需要的时候通过以下两种方法修改SQLSERVER服务的登录类型。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&lt;u&gt;1．&amp;nbsp;通过企业管理器修改&lt;br /&gt;&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 右击SQLSERVER服务器---&amp;#8220;属性&amp;#8221;---&amp;#8220;安全性&amp;#8221;下的&amp;#8220;启动服务帐户&amp;#8221;&lt;br /&gt;&amp;nbsp;&lt;img alt="" src="http://www.25175.com/200609/25175/25175_upload/2010_08/100818121532864.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;2．通过服务修改&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;#8220;控制面板&amp;#8221;---&amp;#8220;服务&amp;#8221;----&amp;#8220;MSSQLSERVER&amp;#8221;，右击---&amp;#8220;属性&amp;#8221;---&amp;#8220;登录&amp;#8221;&lt;br /&gt;&amp;nbsp;&lt;img alt="" src="http://www.25175.com/200609/25175/25175_upload/2010_08/100818121532865.jpg" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 8pt"&gt;&amp;nbsp;装SQLSERVER时遇到的一些问题&lt;br /&gt;1.在安装时出现提示"command line option syntax error!type command /? for help"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这是因为你可能把SQLSERVER的安装文件放在了中文目录下，可以你它改为英文目录即可。每一级目录都不能含有中文。&lt;br /&gt;2.出现提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重启计算机"&lt;br /&gt;&amp;nbsp; 打开注册表编辑器(或在命令行输入:regedit)，在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目，并删除它。然后进行安装。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;PS:&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;Local System/Network Service/Local Service权限介绍&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.Local&amp;nbsp;&amp;nbsp; System (本地系统):&lt;/strong&gt;&lt;br /&gt;该账户具有相当高的权限。&lt;br /&gt;首先，该账户也隶属于本地Administrators&amp;nbsp;&amp;nbsp; 用户组，因此所有本地Administrators用户能够进行的操作该账户也能够进行，&lt;br /&gt;其次，该账户还能够控制文件的权限（NTFS&amp;nbsp;&amp;nbsp; 文件系统）和注册表权限，甚至占据所有者权限来取得访问资格。&lt;br /&gt;如果机器处于域中，那么运行于Local&amp;nbsp;&amp;nbsp; System&amp;nbsp;&amp;nbsp; 账户下的服务还可以使用机器账户在同一个森林中得到其他机器的自动认证，&lt;br /&gt;最后一点就是运行于Local&amp;nbsp;&amp;nbsp; System&amp;nbsp;&amp;nbsp; 下的进程能够使用空会话（null&amp;nbsp;&amp;nbsp; session）去访问网络资源。&lt;br /&gt;而且，其他一些Windows 用户模式下的核心组件也运行于该账户下，例如system32\Smss.exe 等。&lt;br /&gt;需要注意的是，运行于此账户下的进程使用的是HKEY_USERS\.Default 账户配置，因此它不能够访问其他账户的配置。&lt;/p&gt;&lt;p&gt;举例来说，以LocalSystem账户运行的服务主要有：WindowsUpdate&amp;nbsp;&amp;nbsp; Client、&amp;nbsp;&amp;nbsp; Clipbook、Com+、DHCP&amp;nbsp;&amp;nbsp; Client、Messenger&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Service、Task&amp;nbsp;&amp;nbsp; Scheduler、Server&amp;nbsp;&amp;nbsp; Service、Workstation&amp;nbsp;&amp;nbsp; Service，还有Windows&amp;nbsp;&amp;nbsp; Installer。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.Network&amp;nbsp;&amp;nbsp; Service(网路服务)：&lt;br /&gt;&lt;/strong&gt;该账户也是为了使用机器账户在网络上的其他计算机上认证而设定的。但是他没有Local&amp;nbsp;&amp;nbsp; System&amp;nbsp;&amp;nbsp; 那么多的权限。&lt;br /&gt;它能够以计算机的名义访问网络资源。以这个账户运行的服务会根据实际环境把访问凭据提交给远程的计算机。&lt;br /&gt;运行于此账户下的进程使用网络账户配置文件HKEY_USERS\S-1-5-20和Documents and Settings\NetworkService。 &lt;br /&gt;举例来说，以Network&amp;nbsp;&amp;nbsp; Service账户运行的服务主要有：Distributed&amp;nbsp;&amp;nbsp; Transaction&amp;nbsp;&amp;nbsp; Coordinator、DNS&amp;nbsp;&amp;nbsp; Client、&lt;/p&gt;&lt;p&gt;Performance&amp;nbsp;&amp;nbsp; Logs&amp;nbsp;&amp;nbsp; and&amp;nbsp;&amp;nbsp; Alerts，还有RPC&amp;nbsp;&amp;nbsp; Locator。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.Local&amp;nbsp;&amp;nbsp; Service(本地服务):&lt;/strong&gt;&lt;br /&gt;Local&amp;nbsp;&amp;nbsp; Service账户是预设的拥有最小权限的本地账户，并在网络凭证中具有匿名的身份。&lt;br /&gt;运行于此账户下的进程和运行于Network&amp;nbsp;&amp;nbsp; Service&amp;nbsp;&amp;nbsp; 账户下的进程的区别&lt;br /&gt;在于运行于Local&amp;nbsp;&amp;nbsp; Service&amp;nbsp;&amp;nbsp; 账户下的进程只能访问允许匿名访问的网络资源。&lt;br /&gt;运行于Local&amp;nbsp;&amp;nbsp; Service&amp;nbsp;&amp;nbsp; 下的账户使用的配置文件是HKU\S-1-5-19&amp;nbsp;&amp;nbsp; 和Documents&amp;nbsp;&amp;nbsp; and&amp;nbsp;&amp;nbsp; Settings\LocalService。&lt;/p&gt;&lt;p&gt;举例来说，以Local&amp;nbsp;&amp;nbsp; Service账户运行的服务主要有：Alerter、Remote&amp;nbsp;&amp;nbsp; Registry、Smart&amp;nbsp;&amp;nbsp; Card、SSDP，还有WebClient。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong&gt;&lt;font color="#ff0000"&gt;Local System/Network Service/Local Service权限列表&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;span style="font-size: 8pt"&gt;1、&lt;/span&gt;&lt;font size="2"&gt;&lt;span style="font-size: 8pt"&gt;本地系统:&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt"&gt;内置帐户，该帐户具有较高的访问权限级别。如果工作进程标识作为&amp;#8220;本地系统&amp;#8221;帐户运行，则该工作进程具有整个系统的完全访问权限&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-size: 8pt"&gt;2、网络服务&lt;/strong&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;font size="2"&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt"&gt;内置帐户，该帐户的系统访问权限比&amp;#8220;本地系统&amp;#8221;帐户少，但仍能通过网络与计算机帐户的凭据进行交互。对于 IIS 6.0，建议以&amp;#8220;网络服务&amp;#8221;帐户的身份运行为应用程序池定义的工作进程标识。默认情况下，该工作进程标识以&amp;#8220;网络服务&amp;#8221;帐户的身份运行。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt"&gt;默认的用户权限:&lt;/span&gt;&lt;/p&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;替换进程级令牌 (SeAssignPrimaryTokenPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;调整进程的内存配额 (SeIncreaseQuotaPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;生成安全审核 (SeAuditPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;忽略遍历检查 (SeChangeNotifyPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;从网络访问此计算机 (SeNetworkLogonRight) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;作为批处理作业登录 (SeBatchLogonRight) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;作为服务登录 (SeInteractiveLogonRight) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;允许本地登录 (SeInteractiveLogonRight)&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-size: 8pt"&gt;3、本地服务&lt;/strong&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-size: 8pt"&gt;内置帐户，该帐户的计算机访问权限比&amp;#8220;网络服务&amp;#8221;帐户少，并且该帐户的用户权限仅限于本地计算机。如果工作进程不需要访问所在服务器之外的地方，则可以使用&amp;#8220;本地服务&amp;#8221;帐户。 默认用户权限：&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;替换进程级令牌 (SeAssignPrimaryTokenPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;调整进程的内存配额 (SeIncreaseQuotaPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;生成安全审核 (SeAuditPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;忽略遍历检查 (SeChangeNotifyPrivilege) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;从网络访问此计算机 (SeNetworkLogonRight) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 8pt"&gt;作为批处理作业登录 (SeBatchLogonRight)&lt;/span&gt;&lt;/font&gt; &lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/2354300.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2012/02/16/2354300.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2012/02/15/2352747.html</id><title type="text">SQL字符串的分组聚合(ZT)</title><summary type="text">本文转载于T-Sql：字符串分组聚合，也许你还有更简单的办法？ 今天在看订阅的RSS的时候，看到这么一个问题：T-Sql中如何对分组的信息进行聚合，并以逗号连接字符；也就是对一个表中的某个字段进行分组，然后对另一个字段聚合，如果表达得不太清楚，请看下面的表。 原表：ParentChildCharlesWilliamCharlesHarryAnnePeterAnneZaraAndrewBeatriceAndrewEugenie处理后的结果： ParentChildrenCharlesWilliam,HarryAnnePeter,ZaraAndrewEugenie,Beatrice 貌似很简...</summary><published>2012-02-15T07:41:00Z</published><updated>2012-02-15T07:41:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2012/02/15/2352747.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2012/02/15/2352747.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本文转载于&lt;a class="singleposttitle" id="cb_post_title_url" href="http://www.cnblogs.com/luluping/archive/2009/07/24/1530576.html"&gt;&lt;font color="#223355"&gt;T-Sql：字符串分组聚合，也许你还有更简单的办法？&lt;/font&gt;&lt;/a&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 今天在看订阅的RSS的时候，看到这么一个问题：T-Sql中如何对分组的信息进行聚合，并以逗号连接字符；也就是对一个表中的某个字段进行分组，然后对另一个字段聚合，如果表达得不太清楚，请看下面的表。 &lt;/p&gt;&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;&amp;nbsp;原表：&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Parent&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Child&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Charles&lt;/td&gt;&lt;td&gt;William&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Charles&lt;/td&gt;&lt;td&gt;Harry&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Anne&lt;/td&gt;&lt;td&gt;Peter&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Anne&lt;/td&gt;&lt;td&gt;Zara&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Andrew&lt;/td&gt;&lt;td&gt;Beatrice&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Andrew&lt;/td&gt;&lt;td&gt;Eugenie&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;处理后的结果： &amp;nbsp;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Parent&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Children&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Charles&lt;/td&gt;&lt;td&gt;William,Harry&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Anne&lt;/td&gt;&lt;td&gt;Peter,Zara&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Andrew&lt;/td&gt;&lt;td&gt;Eugenie,Beatrice&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 貌似很简单，以我的思考，先写一个聚合函数，然后再查询语句里面调用这个聚合函数；实际上还有更简单的办法，这是作者给出的解决办法，没有用到自定义聚合函数，他用的是FOR XML PATH(&amp;#8216;&amp;#8217;)这样的处理方式，感觉真是爽&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 900px"&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;t&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Charles&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;parent,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;William&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;child&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;union&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Charles&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Harry&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;union&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Anne&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Peter&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;union&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Anne&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Zara&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;union&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Andrew&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Beatrice&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;union&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Andrew&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Eugenie&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;parent,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;STUFF&lt;/span&gt;&lt;span style="color: #000000"&gt;(&amp;nbsp;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #808080"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;child&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;t&amp;nbsp;a&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b.parent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;a.parent&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;XML&amp;nbsp;PATH(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;''&lt;/span&gt;&lt;span style="color: #000000"&gt;)),&lt;/span&gt;&lt;span style="font-weight: bold; color: #800000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;,&lt;/span&gt;&lt;span style="font-weight: bold; color: #800000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;''&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&amp;nbsp;children&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;t&amp;nbsp;b&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;GROUP&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;BY&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;parent&lt;/span&gt; &lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果你还有其他的解决办法，希望你也能给出你的答案， 多多益善&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;考虑到不熟悉STUFF()这个函数，故根据这个思路自己写了另外的方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;&amp;nbsp;parent,&lt;span style="color: #808080"&gt;right&lt;/span&gt;(list,&lt;span style="color: #ff00ff"&gt;len&lt;/span&gt;(list)&lt;span style="color: #808080"&gt;-&lt;/span&gt;&lt;span style="font-weight: bold; color: #800000"&gt;1&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;&lt;br /&gt;(&lt;br /&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&amp;nbsp;parent,&lt;br /&gt;(&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #808080"&gt;+&lt;/span&gt;&amp;nbsp;children&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&amp;nbsp;t a&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt;&amp;nbsp;a.parent&lt;span style="color: #808080"&gt;=&lt;/span&gt;b.parent&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt;&amp;nbsp;XML&amp;nbsp;PATH(&lt;span style="color: #ff0000"&gt;''&lt;/span&gt;))&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;list&lt;br /&gt;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;t b&lt;br /&gt;&lt;span style="color: #0000ff"&gt;group&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;by&lt;/span&gt;&amp;nbsp;parent&lt;br /&gt;)&amp;nbsp;x&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;script type="text/javascript"&gt;if ($ != jQuery) {$ = jQuery.noConflict();}var isLogined = false;var cb_blogId = 34197;var cb_entryId = 1530576;var cb_blogApp = "luluping";var cb_blogUserGuid = "232f420b-63cf-dd11-9e4d-001cf0cd104b";var cb_entryCreatedDate = '2009/7/24 22:34:00';&lt;/script&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;最终查询出来的结果集和使用上面的Stuff函数是一样的.&lt;/p&gt;&lt;p&gt;另外补充一下关于Stuff函数的用法：&lt;/p&gt;&lt;p&gt;&lt;table style="table-layout: fixed; width: 100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div class="cnt" id="blog_text"&gt;&lt;p&gt;/*&lt;br /&gt;用法描述：&lt;br /&gt;Stuff(expression1_Str,startIndex,lengthInt,expression2_Str)函数共有四个参数，其功能是将expression1_Str中自startIndex位置起删除lengthInt个字符，然后将expression2插入到expression1_Str中的startIndex位置。&lt;br /&gt;*/&lt;/p&gt;&lt;p&gt;select 'abcdefg'&lt;br /&gt;select STUFF('abcdefg',1,0,'1234') --结果为'1234abcdefg'&lt;br /&gt;select STUFF('abcdefg',1,1,'1234') --结果为'1234bcdefg'&lt;br /&gt;select STUFF('abcdefg',2,1,'1234') --结果为'a1234cdefg'&lt;br /&gt;select STUFF('abcdefg',2,2,'1234') --结果为'a1234defg'&lt;/p&gt;&lt;p&gt;--一般的程序设计语言和Sql语言一样，都把字符串当作字符数组处理，但一个差别在于，大多数程序设计语言的数组下标起始位为0，而Sql Server中为1，由于惯性思维，常常把一般程序设计语言中的0起始位带至SQL编程中。&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/2352747.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2012/02/15/2352747.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2012/02/15/Update_Delete_Join.html</id><title type="text">SQL中使用update inner join和delete inner join (ZT)</title><summary type="text">SQL中使用update inner join和delete inner join</summary><published>2012-02-15T03:24:00Z</published><updated>2012-02-15T03:24:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2012/02/15/Update_Delete_Join.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2012/02/15/Update_Delete_Join.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本文转载于&lt;a class="singleposttitle" id="cb_post_title_url" href="http://www.cnblogs.com/luluping/archive/2009/05/21/1486549.html"&gt;&lt;font color="#223355"&gt;SQL中使用update inner join和delete inner join&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red"&gt;因项目中在处理数据的时候，需要用到update连接的语句，故需要用到update inner join的语法，这里转载一下，便于以后查找，感谢原作者。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Update XXX set XXX where 这种写法大家肯定都知道，才发现update和delete居然支持inner join的update方式，太神奇了。分享段示例代码：&lt;/p&gt;&lt;div id="cnblogs_post_body"&gt;&lt;div&gt;&lt;div class="syntaxhighlighter  sql ie" id="highlighter_74655"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;table cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="sql keyword"&gt;&lt;font color="#0000ff"&gt;update&lt;/font&gt;&lt;/code&gt; &lt;code class="sql plain"&gt;tb_User &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="sql keyword"&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/code&gt; &lt;code class="sql plain"&gt;pass=&lt;/code&gt;&lt;code class="sql string"&gt;&lt;font color="#0000ff"&gt;''&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="sql keyword"&gt;&lt;font color="#0000ff"&gt;from&lt;/font&gt;&lt;/code&gt; &lt;code class="sql plain"&gt;tb_User usr &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="sql keyword"&gt;&lt;font color="#0000ff"&gt;inner&lt;/font&gt;&lt;/code&gt; &lt;code class="sql color1"&gt;&lt;font color="#808080"&gt;join&lt;/font&gt;&lt;/code&gt; &lt;code class="sql plain"&gt;tb_Address addr &lt;/code&gt;&lt;code class="sql keyword"&gt;&lt;font color="#0000ff"&gt;on&lt;/font&gt;&lt;/code&gt; &lt;code class="sql plain"&gt;usr.nAddressFK = addr.nAddressID &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="sql keyword"&gt;&lt;font color="#0000ff"&gt;where&lt;/font&gt;&lt;/code&gt; &lt;code class="sql plain"&gt;usr.id=123&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;update的格式是&lt;/p&gt;&lt;p&gt;update t1 set t1.name=&amp;#8217;Liu&amp;#8217;&lt;strong&gt;&lt;span style="color: rgb(0,0,255)"&gt; from t1&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;inner join t2 on t1.id = t2.tid&lt;/p&gt;&lt;p&gt;delete 语句也是类似&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;delete from t1 &lt;font color="#0000ff"&gt;&lt;strong&gt;from t1&lt;/strong&gt;&lt;/font&gt; inner join t2 on t1.id = t2.tid&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;注意&lt;strong&gt;&lt;span style="color: rgb(0,0,255)"&gt;蓝色&lt;/span&gt;&lt;/strong&gt;部分。&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;script type="text/javascript"&gt;if ($ != jQuery) {$ = jQuery.noConflict();}var isLogined = false;var cb_blogId = 34197;var cb_entryId = 1486549;var cb_blogApp = "luluping";var cb_blogUserGuid = "232f420b-63cf-dd11-9e4d-001cf0cd104b";var cb_entryCreatedDate = '2009/5/21 18:14:00';&lt;/script&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/2352305.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2012/02/15/Update_Delete_Join.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2011/05/25/ComboBox_AddItemWay.html</id><title type="text">C# ComboBox（DropDownList）数据绑定后，怎样再添加选项(ZT)</title><summary type="text">本文转载于：http://hi.baidu.com/yangyangye2008/blog/item/1775770215a22782d53f7c18.html两者大同小异，之说comBoBox吧，我们知道数据绑定控件被绑定之后是无法再在里面添加数据的，因为这是后的DataSource是无法修改的！不管是先再comBoBox之前使用其属性Items下的Add方法添加都会被后来的DisplayMember覆盖，①这样是不行的：comboBox1.Items.Add("--选择所有--");this.comboBox1.DataSource = EmployerSet;this</summary><published>2011-05-25T01:57:00Z</published><updated>2011-05-25T01:57:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2011/05/25/ComboBox_AddItemWay.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2011/05/25/ComboBox_AddItemWay.html"/><content type="html">&lt;div id="app-share-content"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;本文转载于：&lt;a href="http://hi.baidu.com/yangyangye2008/blog/item/1775770215a22782d53f7c18.html"&gt;http://hi.baidu.com/yangyangye2008/blog/item/1775770215a22782d53f7c18.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;两者大同小异，之说&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;comBoBox&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;吧，我们知道数据绑定控件被绑定之后是无法再在里面添加数据的，因为这是后的&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;DataSource&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;是无法修改的！不管是先再&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;comBoBox&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;之前使用其属性&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;Items&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;下的&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;Add&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;方法添加都会被后来的&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;DisplayMember&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;覆盖，&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&amp;#9312;这样是不行的：&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;comboBox1.Items.Add("--&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;选择所有&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;--");&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DataSource = EmployerSet;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DisplayMember = "EmployeesTable.FirstName";&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;这种错误时先添加一项殊不知，会被后来的覆盖掉！&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&amp;#9313;另外可能有人想的是：&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DataSource = EmployerSet;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DisplayMember = "EmployeesTable.FirstName";&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;comboBox1.Items.Insert(0,"--&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;选择所有&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;--");&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;这一种是最普遍的错误，这时候错误会出现在红色位置：设置&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt; DataSource &lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;属性后无法修改项集合。&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;怎么解决了，在长期的经历中我发现还是有方法可行的，第二种最佳，是昨天做项目的时候发现的：&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;第一种方法，想修改绑定的数据源之后再绑定，代码如下：&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;DataTable dt = EmployerSet.Tables["EmployeesTable"];&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;DataRow dr = dt.NewRow();&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;dr["FirstName"] = "--&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;选择所有&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;--";&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;dt.Rows.InsertAt(dr, 0);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DataSource = dt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DisplayMember = "FirstName";&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;方法二：&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;采用了数据源的管理对象&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;BindingContext&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;，先将当前项的值修改之后再赋予呈现成员&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: green; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DataSource = EmployerSet;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;DataRowView rowV = (DataRowView)this.BindingContext[EmployerSet, "EmployeesTable"].Current;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;rowV["FirstName"] = "--&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;选择所有&lt;/span&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;--";&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color: #006600; font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;this.comboBox1.DisplayMember = "EmployeesTable.FirstName";&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;你可以测试发现其实&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt; rowV["FirstName"]&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;原本的值就是&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;font face="Times New Roman"&gt;EmployeesTable.FirstName&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;中的第一个值，只是后来被修改了，接着赋予其呈现成员，这里之所以修改数据源会成功，我自己的认为是使用到了数据的管理对象，就好像是管理员可以修改一样而别人无法修改！&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/2056301.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2011/05/25/ComboBox_AddItemWay.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2011/01/25/IISHttp_500Error.html</id><title type="text">项目维护之WinXP IIS中HTTP500的来龙去脉</title><summary type="text">唉，又是一次相当费力费时的系统维护，为了便于总结和思考，故对这次系统维护进行记录笔记！</summary><published>2011-01-25T04:23:00Z</published><updated>2011-01-25T04:23:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2011/01/25/IISHttp_500Error.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2011/01/25/IISHttp_500Error.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 唉，又是一次相当费力费时的系统维护，为了便于总结和思考，故对这次系统维护进行记录笔记！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong style="color: red"&gt;一、问题的起因&lt;/strong&gt;&lt;span style="color: red"&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 再等几天就是春节了，然而在年前的一周内，对客户的系统进行了再一次维护(&lt;a id="ctl01_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/Charles2008/archive/2010/08/09/Monopolism_SoftWare.html"&gt;&lt;font color="#223355"&gt;&lt;span style="font-size: 12pt"&gt;你见到过垄断主义的软件吗？&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;)。在对客户的系统维护的过程中，需要对PDA的系统进行升级使用，故客户的电脑上需要安装IIS的组件和Microsoft SQL Server 2000 Windows CE Edition 2.0，然后按照该Windows CE Edition Server Tool的时候需要安装SQL Server 2000的SP4，因此需要对现有的Microsoft SQL Server 2000的数据库打上SP4，然而出现了一个文件，在升级到SP4的过程中，需要知道SA的秘密，可惜的是我没有办法知道SA的秘密(&lt;a id="ctl01_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/Charles2008/archive/2010/08/09/Monopolism_SoftWare.html"&gt;&lt;font color="#223355"&gt;你见到过垄断主义的软件吗？&lt;/font&gt;&lt;/a&gt; )，而且是不能更改SA的秘密，因此想到了一个办法，重新安装SQL Server 2000，安装SQL Server 2000后立即打上SP4的补丁(安装完毕后再安装其他的系统软件)。&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: red; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;strong&gt;二、问题的经过:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: red; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 带着这样的思考，我着手重装SQL Server 2000，出乎意料的是，在卸载SQL Server 2000发生了未知的错误，我通过在注册表中强制的卸载了SQL Server 2000的注册信息后，试着重新安装，但是我再次安装的时候已经有一个默认的实例，我不能再重新安装(修复SQL2000默认的实例也不能成功)。因&lt;/p&gt;&lt;p&gt;因为软件只能从默认的实例中获取数据，故不能安装成自定义的实例名称)。实在是麻烦，我安装卸载多次都不能成功，最后没有办法的办法，我只有给客户重新安装操作系统了。郁闷的是，客户的电脑光驱不能正常的读取我自带的Window XP硬装版，最后通过找安装电脑的专业人员对系统进行了重新安装(其实是Ghost还原)。OK,系统终于成功安装了，安装成功后，我立即安装IIS，成功安装完毕，接着我安装SQL Server 2000后，立即安装了SP4都没有问题，可奇怪的是，我在安装SQL Server 2000 Window CE Edition2.0(server tool)的时候，安装完毕后，并且配置IIS虚拟目录后，发现指定的网页是不能正常打开。（不能打开表示电脑的IIS的配置不正确）。&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: red; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;strong&gt;三、问题的思考:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: red; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我又重新试了几次，都发现不能正常打开网页，我开始有点怀疑是IIS的配置不当，我又重新安装了IIS，并且用aspnet_regiis -i就行了修复。唉，最后还是不行，给我一个莫名其妙的错误：Http 500服务器错误，我访问&lt;a href="http://localhost/"&gt;http://localhost/&lt;/a&gt;也不能打开，这样我就想到了服务器的IIS配置应该是存在问题的，否则&lt;a href="http://localhost/"&gt;http://localhost/&lt;/a&gt;怎么可能不能打开呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我有点怀疑是不是这系统是Ghost还原出来的，是不是某些组件没有自动启动起来，导致IIS不能正常运行呢？带着这个怀疑，我到网络上去找了一下，结果还真的发现是这个问题，问题终于被我找到了，而且网络上也说明了解决的方法，接着我根据网络上的方法，还真的把这个IIS的问题给解决了！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="background-color: yellow"&gt;参照网络资源&lt;/span&gt;)简单的说按以下步骤进行:(&lt;a id="ctl01_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/diction/archive/2007/10/27/939805.html"&gt;XP中IIS&amp;#8220;http500&amp;#8221;错误的终极解决方法&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;1.在控制面板-&amp;gt;管理工具-&amp;gt;服务 中确认"Distributed Transaction Coordinator"服务有没有启动,没有启动就启动它,并设置成自动.&lt;/p&gt;&lt;p&gt;2.运行 \Inetpub\AdminScripts 脚本文件夹中的 synciwam.vbs&lt;/p&gt;&lt;p&gt;3.在命令行状态下输入以下命令(注意大小写):cd %windir%\system32\inetsrv&lt;br /&gt;rundll32 wamreg.dll, CreateIISPackage&lt;br /&gt;regsvr32 asptxn.dll&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: 宋体; color: red; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;strong&gt;四、问题的总结：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最后把IIS的问题解决后，后面软件的安装及调试都如鱼得水，非常的顺利。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;唉，这次的项目维护真是花时间而且也花精力，不过幸运的是，最后还是把问题给解决了！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;fieldset style="font-family: Arial; color: #003333"&gt;&lt;p&gt;&lt;legend&gt;版权说明&lt;/legend&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 本文属学习笔记，欢迎转载且注明文章出处，其版权归作者和博客园共有。&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; 作&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;者：Charles Chen&lt;/p&gt;&lt;p&gt;&amp;nbsp;文章出处：&lt;a href="http://charles2008.cnblogs.com/" target="_blank"&gt;http://charles2008.cnblogs.com/&lt;/a&gt; &amp;nbsp;或&amp;nbsp; &lt;a href="http://www.cnblogs.com/" target="_blank"&gt;http://www.cnblogs.com/&lt;/a&gt; &lt;/p&gt;&lt;/fieldset&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/1944460.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2011/01/25/IISHttp_500Error.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2010/12/15/MyTransactionStudy.html</id><title type="text">一次项目维护案例而对事务学习的笔记</title><summary type="text">这几天对SQL中的事务进行复习，来自于对客户项目维护引起的思考！先说说项目维护中遇到的问题：我们公司开发的软件项目，它建立在第三方公司开发项目(你见到过垄断主义的软件吗？)之上，数据库是直接的依赖关系，它偶尔出现死机的现象？</summary><published>2010-12-15T05:57:00Z</published><updated>2010-12-15T05:57:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2010/12/15/MyTransactionStudy.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2010/12/15/MyTransactionStudy.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Tahoma; font-size: 18pt"&gt; 这几天对SQL中的事务进行复习，来自于对客户项目维护引起的思考！先说说项目维护中遇到的&lt;/span&gt;&lt;strong style="font-family: Tahoma; color: red; font-size: 18pt"&gt;问题&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 18pt"&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 18pt"&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 18pt"&gt;我们公司开发的软件项目，它建立在第三方公司开发项目&lt;strong&gt;(&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; color: #333399; font-size: 18pt"&gt;&lt;a title="你见到过垄断主义的软件吗？" href="http://www.cnblogs.com/Charles2008/archive/2010/08/09/Monopolism_SoftWare.html" target="_blank"&gt;&lt;font size="5"&gt;&lt;strong&gt;你见到过垄断主义的软件吗？&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 18pt"&gt;之上，数据库是直接的依赖关系，它偶尔&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 18pt"&gt;出现死机的现象？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red; font-size: 18pt"&gt;&lt;strong&gt;问题描述&lt;/strong&gt;&lt;/span&gt;：&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 14pt"&gt;客户在使用我们的公司开发的软件系统的过程中偶尔出现死机的现象，然而又不能找到死机的操作流程是怎样的，而且软件死机后通过重启电脑后又能正常的运行？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; font-size: 18pt"&gt;重现死机的过程&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;针对客户提出的这种现象我到客户现场去查找具体的原因，因为我们开发的软件系统是建立在第三方的系统之上，因此这给查找死机的原因带来了难度！而且客户提出的死机不是必然，这也给查找问题带来了困难。唉，不知是什么原因，我每次去客户那边都发现我们的软件系统都能正常的工作，不会出现死机的现象？可为什么客户在使用的过程中出现呢？最后只有告诉客户说：如果再出现死机的现象，请不要操作，看哈是不是系统反应慢，软件没有反应过来呢？最后由于这个死机问题没有重现，因此我这边也没有及时的去解决。（虽然客户多次发现，但是客户给我的反馈很不让我理解，当引起死机的时候，客户也不知道怎么操作流程导致的，也许客户自己通过重启电脑能解决暂时忽略了死机的重要性）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;记得后来有一次，我正在客户现场负责其他的事情，忽然客户在使用我们的软件工作中终于又一次出现死机了,我当时很惊讶，的确当时整个屏幕快变白了，更本无法动弹(死机了)，我试着重新启动软件看能不能解决问题，最后还是不行，难道非要重启不可吗？我心里这样怀疑着。这个时候大概过了几分钟，软件终于反应过来了，给了我一个很吃惊的提示：&lt;/span&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/charles2008/error.jpg" width="360" height="101" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;这个时候我看到客户正在使用第三方的软件系统(&lt;/span&gt;&lt;span style="background-color: yellow; font-family: Tahoma; font-size: 14pt"&gt;前面我提到我们软件的数据来源都基于这个系统&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;)，我开始怀疑是不是第三方的软件系统对我们的系统造成的呢？接着我把第三方的软件系统完全关闭了，然后再一次运行我们的系统，结果发现可以运行了。唉，终于可以不用重启解决死机现象了，接着我有试了几次，发现如果使用第三方软件系统指定的功能模块的条件下才会让我们的软件系统出现死机的现象，这也证明了为什么这种死机的现象不容易发现。唉，终于叹了口气，把我们死机的现象给重现了！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: #ff0000; font-size: 18pt"&gt;查找死机的原因&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;功夫不负有心人，重现死机的过程找到了，也知道了用户是怎么操作导致我们的软件系统出现死机的过程，但是要解决这个问题的话，首先弄清楚出现死机的真正原因:究竟是由于什么引起的？然后我借助于SQL里面的事件探查器(&lt;/span&gt;&lt;a id="ctl01_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/Charles2008/archive/2010/09/25/Sql_Profiler.html" target="_blank"&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;&lt;strong&gt;SQL事件探查器，你使用了吗？&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt; )，最后终于找到了引起死机的真正原因:在使用第三方系统指定的功能模块后，对某一个张表的更新和查询作为一个事务操作并没有做提交(Commited)的动作，这种表上就建立了一个排他锁(X)，这个时候我们公司开发的的软件系统去读取那张表后，会有一个共享锁(S)。然而排他锁(X)和共享锁(S)是不兼容的，故只有等那事务(排他锁)释放了资源后，才能获取到数据，因此导致的结果是我们的软件系统去获取那张表的数据时候就一直处于等待状态(由于直接用UI线程去获取数据，故在UI主线程上就死机了)，当等待一段时间后，系统连接数据库超时，故程序抛出异常，弹出上面提示的对话框来。为了进一步验证，在第三方系统事务未提交(UnCommited)下，我又在SQL查询分析器中运行读取那张表的SQL语句，结果出现下面的情况(如下图所示)，然而当第三方的软件系统关闭后，会有Commited动作，故我们的软件系统又能正常运行了，这样也进一步验证了我的判断结果。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="width: 824px; height: 224px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/charles2008/锁定.png" width="824" height="224" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000; font-size: 18pt"&gt;&lt;strong&gt;解决问题&lt;/strong&gt;&lt;/span&gt;：&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;找到了问题的原因，剩下的就是怎么解决了，因为我们没有办法控制第三方的软件，故只能在我们自己的软件系统修改。首先容易想到的是我们在获取那张表的时候不发生共享锁，采用with nolock关键字或者采用Read uncommited就可以解决了。最后通过试验，我们的软件系统在SELECT数据的时候，采用SELECT Field FROM TABLE WITH NOLOCK语法就能把死机的解决了。后来我又仔细分析了，针对当前系统的业务逻辑，对数据的准确性并不那样严格，可以读取还没有Commited的记录，故完全可以采用这种方式从本质上解决，而且这样也提高了查询效率，真是一举两得啊！&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; color: red; font-size: 18pt"&gt;&lt;strong&gt;引起思考&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;问题就这样很快的解决了，我们的软件系统也能正常的使用了，而且到目前为止还未发生死机的现象。这同时也说明了在软件测试的过程中，只怕找不到问题，没有解决不了问题的。因本人有做笔记的习惯，故针对这次项目的维护对事务进行了巩固和复习，方面以后查找和学习，也同时和朋友们一起来分享分享:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Tahoma; font-size: 14pt"&gt;下面是事务的一些基础知识，记录下来和朋友们分享一下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 14pt"&gt;&lt;strong&gt;一、事务定义：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;事务是有一系列操作序列构成的程序执行单元，这些操作要么都做，要么都不做，是一个不可分割的工作单元。例如：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;银行转帐：事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;从&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;A&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;帐号转帐&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;50&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;元到&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;B&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;帐号。(&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;其中&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Read(X)&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：从数据库传送数据项&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;X&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;到事务的工作区，Write(X):&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;从事务的工作区中将数据项&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;X&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;写入到数据库&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Read(A)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;A=A-50;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Write(A);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Read(B);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;B=B+50;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Write(B);&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; font-size: 14pt"&gt;二、&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 14pt"&gt;SQL&lt;span style="font-family: 宋体"&gt;中事务的定义：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;事务以&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Begin transaction&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;开始，以&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Commit transaction&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;或&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Rollback transaction&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;结束。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Commit transaction&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;表示提交，事务正常结束。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Rollback transaction&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;表示事务非正常结束，撤销事务已做的操作，回滚到事务开始时状态。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;CommitWork(Rollback work)&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;后不跟事务名称。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; font-size: 14pt"&gt;三、事务特性&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 14pt"&gt;(ACID)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;原子性&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：事务中包含的所有操作要么都做，要么都不做，原子性由数据库中的&lt;span style="font-family: Tahoma; color: red; font-size: 12pt"&gt;恢复机制&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;实现的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;一致性&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：事务的隔离执行必须保证数据库的一致性，事务开始前，数据库处于一致性的状态，，事务结束后，数据库必须仍然处于一致性的状态。数据库的一致性状态由&lt;span style="font-family: Tahoma; color: red; font-size: 12pt"&gt;用户&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;来负责的，也是由数据库的&lt;/span&gt;&lt;span style="font-family: Tahoma; color: red; font-size: 12pt"&gt;恢复机制&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;和&lt;/span&gt;&lt;span style="font-family: Tahoma; color: red; font-size: 12pt"&gt;并发控制机制&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;实现的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;隔离性&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：系统必须保证事务不受其他并发执行事务的影响。隔离性通过&lt;span style="font-family: Tahoma; color: red; font-size: 12pt"&gt;并发控制机制&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;实现的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;永久性&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：一个事务一旦提交后，它对数据库的影响必须是永久的。系统发生故障不能改变事务的持久性。持久性通过&lt;span style="font-family: Tahoma; color: red; font-size: 12pt"&gt;恢复机制&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;实现的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 14pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;strong&gt;四、事务生命周期图&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/charles2008/事务生命周期图.png" width="513" height="422" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 14pt"&gt;&lt;strong&gt;五、事务执行模式：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;显示事务：以&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Begin Transaction&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;开始，以&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Commit&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;或&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Rollback&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;结束。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;隐含事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;事务自动开始，知道遇到&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Commit&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;或者&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Rollback&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;对结束。语法：SET IMPLICIT_TRANSACTIONS ON&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;自动事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;每个事务操作语句作为一个事务。&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Update Table Set Score=Score+101&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 14pt"&gt;&lt;strong&gt;六、事务模型：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;平面事务：一层结构&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Begin Transaction Commit，&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;缺点是不能部分回滚。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;嵌套事务：内部事务的提交并不释放资源或使其修改成永久修改，只有在提交了外部事务，数据的修改才具有永久性，而且资源才会释放。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;保存点：批量工作可以设置一个保存点，一旦碰到意外的情况，可以回滚到最近的保存点，下次启动就可以在这个保存点接着往下执行，可以最大限制保存已经完成的工作。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;分布式事务：牵涉到网络上不同的计算机节点的数据操作。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; font-size: 14pt"&gt;七、事务调度&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-size: 14pt"&gt;:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;事务的执行顺序成为一个调度，表示事务的指令在系统中执行的时间顺序。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;一组事务的调度必须保证：&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;1.&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;包含了所有事务的操作指令&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;2.&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;一个事务中指令的顺序必须保持不变。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;并行&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;VS&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;&lt;strong&gt;串行&lt;/strong&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;基本比较：并行事务可能会破坏数据库的一致性，串行事务效率低。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;并行的优点：一个事务由不同的步骤组成，所涉及的系统资源也不同，这些步骤可以并行执行，以提高系统的吞吐量。&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;(&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;目前的数据库都是采用并行的调度&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;)&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 14pt"&gt;&lt;strong&gt;八、事务隔离性级别：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;当用户对数据库并发访问时，为了确保事务的完整性和数据库的一致性，需要使用&lt;strong&gt;锁定&lt;/strong&gt;，这是实现数据库并发控制的主要手段，锁定可以防止用户读取正在由其他用户更改的数据，并可以防止多个用户同时更改相同数据。如果不使用锁定，则数据库中的数据可能在逻辑上不正确，并且对数据库的查询可能会产生意想不到的结果，具体的来说，锁可以防止一下情况：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; color: #99cc00; font-size: 12pt"&gt;丢失修改&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：两个事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T1&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;和&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;读入同一数据并修改，&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T1&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;提交的结果破坏了&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;提交的结果，导致&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T1&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;的修改丢失。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; color: #99cc00; font-size: 12pt"&gt;脏读&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T1&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;修改某一个数据，并将其写回，事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;读取同一数据后，&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;由于某种原因被撤销，这是&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T1&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;已经修改的数据恢复原值，&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;读到的数据与数据库中的数据不一致，则&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;读到的数据就是脏数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; color: #99cc00; font-size: 12pt"&gt;不可重复读&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;读取某一个数据后，事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T1&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;对其做了修改，当&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;再次读取该数据时候，得到的与前次不同的值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Tahoma; color: #99cc00; font-size: 12pt"&gt;幻想读&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;按一定条件读取了某些数据后，事务&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T1&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;插入了一些满足这些条件的数据，当&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;T2&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;再次按相同条件读取数据时候，发现多了一些记录。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-size: 12pt"&gt;SQL&lt;span style="font-family: 宋体"&gt;中隔离性级别的定义：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;&lt;u&gt;Serializable&lt;/u&gt;:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;一个调度的执行必须等价于一个串行调度的结果。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;&lt;u&gt;Repeatable read&lt;/u&gt;:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;只允许读取已提交的记录，并要求一个事务对同一记录的两次读取之间，其他的事务不能对该记录进行更新。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;&lt;u&gt;Read committed&lt;/u&gt;:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;只允许读取已经提交的记录，但不要求重复读。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;&lt;u&gt;Read uncommitted&lt;/u&gt;:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;允许读取未提交的记录。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;级别从高到低，发生数据不一致的几率低，但是封锁的强度越大，导致系统并发度越小。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;不同的隔离性的级别下发生不一致的现象：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;隔离性级别&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;不一致的现象&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;Read uncommitted&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;读脏数据，不能重复读，幻想读&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;Read committed&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;不能重复读，幻想读&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;Repeatable read:&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;幻想读&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;Serializable&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="284"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;实际的数据库中都是通过封锁机制来实现的&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Read uncommitted:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;不发出任何锁。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Read committed:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;发出一个共享锁&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Repeatable read:&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;两次读取之间锁是一致保持的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;Serializable&lt;/span&gt;&lt;span style="font-family: Tahoma; font-size: 12pt"&gt;：不但对现有数据的锁封锁，而且是根据事务的查询条件封锁。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&amp;nbsp;&lt;/p&gt;&lt;fieldset style="font-family: Arial; color: #003333"&gt;&lt;p&gt;&lt;legend&gt;版权说明&lt;/legend&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 本文属学习笔记，欢迎转载且注明文章出处，其版权归作者和博客园共有。&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; 作&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;者：Charles Chen&lt;/p&gt;&lt;p&gt;&amp;nbsp;文章出处：&lt;a href="http://charles2008.cnblogs.com/" target="_blank"&gt;&lt;font color="#1d58d1"&gt;http://charles2008.cnblogs.com/&lt;/font&gt;&lt;/a&gt; &amp;nbsp;或&amp;nbsp; &lt;a href="http://www.cnblogs.com/" target="_blank"&gt;&lt;font color="#1d58d1"&gt;http://www.cnblogs.com/&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;/fieldset&gt; &lt;p&gt;&lt;/span&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/Charles2008/aggbug/1906657.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2010/12/15/MyTransactionStudy.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2010/12/13/Design_Pattern.html</id><title type="text">温故面向对象设计模式与原则的心得</title><summary type="text">设计模式的要点：设计模式(Design pattern)的鼻祖来至于建筑学领域。建筑学定义的模式是：每个模式描述了一个在我们周围不断重复发生的问题，以及该问题的解决方案的核心。然后在软件设计里面，从建筑学那边借鉴过来，软件设计模式描述了在软件设计过程中某一类常见问题的一般性解决方案。通过建筑学和软件设计的不同领域，其实也能看出有很强的类比性。通过对比可以看出，软件设计模式描述了常见问题的一般性解决方案。其实我们知道在软件设计过程中，设计软件其实有很多的陷阱，你可以拿到工具和语言可以做各种各样的事情，解决各种各样的问题。</summary><published>2010-12-13T05:53:00Z</published><updated>2010-12-13T05:53:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2010/12/13/Design_Pattern.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2010/12/13/Design_Pattern.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这段时间一直都在思考怎么样的设计才算得上是面向对象的设计，我们应该怎样学习和搞清楚面向对象的设计模式。下面就针对自己对设计模式的理解和参考其他视频资料、学习资料基础上的学习做一个学习笔记，加深对设计模式的理解和运用，提升自己面向对象的抽象思维。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;　设计模式的要点：设计模式(Design pattern)的鼻祖来至于建筑学领域。&lt;/p&gt;&lt;p&gt;&lt;span style="color: red"&gt;&lt;strong&gt;建筑学定义的模式是：每个模式描述了一个在我们周围不断重复发生的问题，以及该问题的解决方案的核心。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;然后在软件设计里面，从建筑学那边借鉴过来，&lt;strong style="color: red"&gt;软件设计模式描述了在软件设计过程中某一类常见问题的一般性解决方案&lt;/strong&gt;。通过建筑学和软件设计的不同领域，其实也能看出有很强的类比性。通过对比可以看出，软件设计模式描述了常见问题的一般性解决方案。其实我们知道在软件设计过程中，设计软件其实有很多的陷阱，你可以拿到工具和语言可以做各种各样的事情，解决各种各样的问题。&lt;/p&gt;&lt;p&gt;我理解的是&lt;strong&gt;软件设计模式的初衷是通过设计模式去惯性的进行软件设计，碰到一些问题根据我们的经验去选择好的方式去做&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;然而&lt;strong&gt;面向对象的设计模式描述了在面向对象的设计过程中，特定常见下，类与相互通信的对象之间常见的组织关系。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GoF23中设计模式的理解：这本书《&lt;em&gt;&lt;strong&gt;设计模式：可复用性面向对象软件的基础&lt;/strong&gt;&lt;/em&gt;》中描述了23中经典的面向对象设计模式，同时也建立了模式在软件设计中的地位。然后人们通常说的设计模式都隐含的表达是"面向对象的设计模式",但这并不意味着设计模式就等于面向对象的设计模式，其实也意味着GoF23中设计模式并非表示了所有的面向对象的设计模式，除了GoF23中设计模式以外，还有更多的面向对象的设计模式。GoF23种设计模式是经典的模式，它是学习面向对象设计模式的基础，也是起点，而非终点，但是它能够深化我们对面向对象的认识。&lt;/p&gt;&lt;p&gt;面向对象设计模式解决的是：&lt;strong&gt;类与相互通信的对象之间的组织关系，如角色、职责、协作等几个方面&lt;/strong&gt;。一般来说只要成为模式的我们都应该是认为比较好的，所谓面向对象的设计模式是可以满足那些：应对变化，提高复用的设计。敏捷软件开发有一句很重要的话是：源代码就是设计，这其实也是我们不断对软件认识发现的。从早期的软件开发过程来看，大家都一直想把软件设计工程化，像建筑师画好图纸，交给施工单位，在99%的情况下都可以盖的很好。按照这个设计，大家可以根据自己的经验来看，很多工程问题，大致可以分成两个阶段：工程设计阶段和工程实现阶段。其实我们想在软件工程也希望能达到这种模式。但是后来不得不软件太复杂了："比如架构师或者系统分析员做了设计，交给程序员就会做的很好"，这其实是不可能的，这不是说架构师和程序员都不称职，而主要的原因是：软件是变化的。所以敏捷软件开发提出的：源代码就是设计。如果我们把程序员编程的工作也来看成设计的话，我们就可以弄清楚这些关系。这句话的理解对我们是很有帮助的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 另外我们也可以从另外一个角度来理解：我们学习任何一个设计模式，可以说不用设计模式同样可以把软件设计的很好，运行的很正常，但是软件有一个特点：它的变化，复杂的可变性。它一方面是来自于客户需求方面的变动，另一方面也来自于技术方面的变动，方法面面的变动作用力导致软件设计过程中不断的变，因此我们使用面向对象的设计的目的就是管理需求的变化，我们不怕变化，但是我们可以把变化给软件的影响降低。&lt;/p&gt;&lt;p&gt;另外面向对象的设计模式描述的是软件设计，因此它是独立于编程语言的，但是面向对象设计模式的最终实现仍然要使用面向对象的编程语言来体现。因此掌握面向对象的设计模式的前提是首先掌握面向对象。而且我们理解的面向对象和设计模式所要求的面向对象的能力是有差距的，你能够懂语言机制，比如多态，重载，虚函数的重写等，但是你对面向对象理解不深入，你只能看懂代码结构，对设计的一个理念层理解的不深入。导致的结果是：你见到这个模式你认识，你写这个模式也能写出来了，但是在具体的工程实践中，你就会发现这个模式对你没有任何好处，或者用了和没有没什么区别。因此设计模式不可以照搬照用，它是建立在面向对象纯熟，深入的理解的基础上经验性认识的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 编程语言表现面向对象：面向对象的三大机制：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;封装&lt;/strong&gt;：因此内部实现。（和外部隔离，外部接口稳定，内部的实现可以随着版本的升级而改变，但是外部的接口是稳定的）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;继承&lt;/strong&gt;：复用现有代码。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;多态&lt;/strong&gt;：改写对象行为。&lt;/p&gt;&lt;p&gt;PS:&lt;/p&gt;&lt;p&gt;1、使用面向对象的编程语言可以推动我们以面向对象的思维思考软件设计结构，从而强化面向对象的编程范式。&lt;/p&gt;&lt;p&gt;2、面向对象的编程语言认识到的面向对象并不是面向对象的全部，甚至只是表面的。理解了面向对象的三大机制，其实只是在语言层面上理解了面向对象，或者说是在实现层面上理解了面向对象，理解了面向对象是如何在语言上实现的。其实面向对象的一个根本问题是首先是设计，有了设计才有实现，有了一个好的面向对象的设计才会做一个好的面向对象的实现，换言之，理解面向对象的三大机制并不必然理解面向对象的设计，而正确的面向对象的设计，才能导向对面向对象的三大机制有比较好的使用。&lt;/p&gt;&lt;p&gt;面向对象的编程语言没有回答面向对象的根本性问题：&lt;em&gt;我们为什么要使用面向对象？我们应该怎样使用三大机制来实现好的面向对象？我们应该遵循什么样的基本原则？&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;几条软件设计原则：&lt;br /&gt;&lt;strong&gt;单一职责原则&lt;/strong&gt;（SRP）：一个类应该仅有一个引起它变化的原因。&lt;br /&gt;&lt;strong&gt;开放封闭原则&lt;/strong&gt;(OCP)：类模块应是可扩展的，但是不可修改(对扩展开发，对更改封闭)&lt;br /&gt;&lt;strong&gt;Liskov替换原则&lt;/strong&gt;(LSP)：子类必须能够替换他们的基类。&lt;br /&gt;&lt;strong&gt;依赖倒置原则&lt;/strong&gt;(DIP)：高层模式不应该依赖于地址模式，二者都应该依赖于抽象。抽象不应该依赖于实现细节，实现细节应该依赖于抽象。&lt;br /&gt;&lt;strong&gt;接口隔离原则&lt;/strong&gt;(ISP)：不应该强迫客户程序依赖于他们不用的方法。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;三大基本面向对象设计模式原则：&lt;strong&gt;针对接口编程，而不是针对实现编程。优先使用对象组合，而不是类继承。封装变化点。&lt;/strong&gt;&lt;br /&gt;使用&lt;strong&gt;重构&lt;/strong&gt;得到模式。敏捷软件开发实践提倡的Refactoring to Patterns是目前普遍公认的最好的使用设计模式的方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;fieldset style="font-family: Arial; color: #003333"&gt;&lt;p&gt;&lt;legend&gt;版权说明&lt;/legend&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 本文属学习笔记，欢迎转载且注明文章出处，其版权归作者和博客园共有。&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; 作&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;者：Charles Chen&lt;/p&gt;&lt;p&gt;&amp;nbsp;文章出处：&lt;a href="http://charles2008.cnblogs.com/" target="_blank"&gt;&lt;font color="#1d58d1"&gt;http://charles2008.cnblogs.com/&lt;/font&gt;&lt;/a&gt; &amp;nbsp;或&amp;nbsp; &lt;a href="http://www.cnblogs.com/" target="_blank"&gt;&lt;font color="#1d58d1"&gt;http://www.cnblogs.com/&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;/fieldset&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/1904434.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2010/12/13/Design_Pattern.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Charles2008/archive/2010/12/10/Demo_O_State.html</id><title type="text">通过Demo来温故状态(State)设计模式</title><summary type="text">记得曾经学习State设计模式的时候，记录了学习笔记.NET下的状态(State)模式 ------行为型模式 ，而最近一段时间我借助于项目的重构时间温习了关于行为型的模式----State(状态)模式。</summary><published>2010-12-10T07:10:00Z</published><updated>2010-12-10T07:10:00Z</updated><author><name>Charles Chen</name><uri>http://www.cnblogs.com/Charles2008/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Charles2008/archive/2010/12/10/Demo_O_State.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Charles2008/archive/2010/12/10/Demo_O_State.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 记得曾经学习State设计模式的时候，记录了学习笔记&lt;a id="ctl03_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/Charles2008/archive/2009/03/16/1413835.html"&gt;.NET下的状态(State)模式 ------行为型模式&lt;/a&gt; ，而最近一段时间我借助于项目的重构时间温习了关于行为型的模式----State(状态)模式。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于State设计模式的要点和代码结构在&lt;a id="ctl03_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/Charles2008/archive/2009/03/16/1413835.html"&gt;&lt;font color="#223355"&gt;.NET下的状态(State)模式 ------行为型模式&lt;/font&gt;&lt;/a&gt;一文中已经有比较的清晰的说明，这里我就通过一个Demo来从另一个方面介绍关于State模式的分析。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 案例Demo:这样的一个场景：有一个关于PDA设备的在押人员点名的管理系统，在点名的过程中，在押人员有不同的状态(在所，不在所，外出就医，外出探亲等)，不同的在押状态在PDA上显示的方式和点名的行为完全不同。&lt;/p&gt;&lt;p&gt;通常的方式，你会想到可以根据Prisoner(在押人员)的CurrentStatus属性来判断用户的状态来表现不同的行为。类似于下面的代码结构：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('f01a2984-c689-46fc-a562-bfa069de61c6')"&gt;&lt;img style="display: none" id="code_img_closed_f01a2984-c689-46fc-a562-bfa069de61c6" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /&gt;&lt;img id="code_img_opened_f01a2984-c689-46fc-a562-bfa069de61c6" class="code_img_opened" onclick="cnblogs_code_hide('f01a2984-c689-46fc-a562-bfa069de61c6',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &lt;div id="cnblogs_code_open_f01a2984-c689-46fc-a562-bfa069de61c6"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Process(Prisoner&amp;nbsp;p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;不同状态有不同的行为&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(p.CurrentStatus)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;在所状态&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;不在所状态&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;外出就医&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;出外探亲&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;default&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这样的设计本没什么错，通过If Else语句或者Switch语句在程序运行时候根据对象的状态来表现不同的行为。但是对象的状态和对象的行为的依赖关系就是一个紧耦合的关系，而且主逻辑承担了在押人员状态的的判断和表现行为的复杂逻辑，给模块的可维护性带来了挑战？&lt;/p&gt;&lt;p&gt;另外如果随着系统需求的细化，我们可能要增加在押人员的其他状态，而这些状态所表现的行为有不同，发生了这样的变化我们是不是要修改这块主逻辑呢？&lt;/p&gt;&lt;p&gt;因此我们引入State设计模式，通过将对象和对象的状态进行分离，把对象状态的转换以及有不同状态产生的行为交给具体的状态类去实现，这样的话就能比较好的解决上述遇到的问题。&lt;/p&gt;&lt;p&gt;类图如下所示：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 'Times New Roman','serif'; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt" lang="EN-US"&gt;&lt;v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/charles2008/Demo_StateDesign.png" width="768" height="557" /&gt;&lt;/v:shapetype&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'Times New Roman','serif'; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt" lang="EN-US"&gt;&lt;v:shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"&gt;Context类如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('1973a992-78a2-4dd8-8bdb-35f3de2d7a4e')"&gt;&lt;img style="display: none" id="code_img_closed_1973a992-78a2-4dd8-8bdb-35f3de2d7a4e" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /&gt;&lt;img id="code_img_opened_1973a992-78a2-4dd8-8bdb-35f3de2d7a4e" class="code_img_opened" onclick="cnblogs_code_hide('1973a992-78a2-4dd8-8bdb-35f3de2d7a4e',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &lt;div id="cnblogs_code_open_1973a992-78a2-4dd8-8bdb-35f3de2d7a4e"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Context&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Prisoner&amp;nbsp;p;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PrisonerState&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;p.CurrentStatus;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;State&amp;nbsp;m_Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;State&amp;nbsp;Current&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_Current;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;m_Current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;value;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Context(Prisoner&amp;nbsp;p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;p;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_Current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;InGuardState();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Process()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_Current.Process(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;Prisoner类如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('d8f5d675-4daa-46de-a4b9-e89127119475')"&gt;&lt;img style="display: none" id="code_img_closed_d8f5d675-4daa-46de-a4b9-e89127119475" class="code_img_closed" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /&gt;&lt;img id="code_img_opened_d8f5d675-4daa-46de-a4b9-e89127119475" class="code_img_opened" onclick="cnblogs_code_hide('d8f5d675-4daa-46de-a4b9-e89127119475',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &lt;div id="cnblogs_code_open_d8f5d675-4daa-46de-a4b9-e89127119475"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;在押人员&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Prisoner&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_Name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;在押人员姓名&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_Name;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;m_Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;value;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_Sex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;在押人员性别&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Sex&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_Sex;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;m_Sex&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;value;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_CurrentStatus;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;出所状态(在所:0，不在所:1，外出就医:2，出外探亲:3...)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CurrentStatus&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_CurrentStatus;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;m_CurrentStatus&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;value;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;State抽象类：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;State&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Process(Context&amp;nbsp;p);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在所状态类：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('812b558d-7356-448f-a9c5-7533c73813b1')"&gt;&lt;img style="display: none" id="code_img_closed_812b558d-7356-448f-a9c5-7533c73813b1" class="code_img_closed" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /&gt;&lt;img id="code_img_opened_812b558d-7356-448f-a9c5-7533c73813b1" class="code_img_opened" onclick="cnblogs_code_hide('812b558d-7356-448f-a9c5-7533c73813b1',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_812b558d-7356-448f-a9c5-7533c73813b1"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;InGuardState:State&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Process(Context&amp;nbsp;c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(c.PrisonerState&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;在押人员状态是在所！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.Current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;OutGuardState();&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;不在所&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.Process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;不在所状态类：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('b76b52bf-dd9f-4fca-981f-75b13d08de89')"&gt;&lt;img style="display: none" id="code_img_closed_b76b52bf-dd9f-4fca-981f-75b13d08de89" class="code_img_closed" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /&gt;&lt;img id="code_img_opened_b76b52bf-dd9f-4fca-981f-75b13d08de89" class="code_img_opened" onclick="cnblogs_code_hide('b76b52bf-dd9f-4fca-981f-75b13d08de89',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_b76b52bf-dd9f-4fca-981f-75b13d08de89"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;OutGuardState:State&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Process(Context&amp;nbsp;c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(c.PrisonerState&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;在押人员状态是不在所！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.Current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;OutDoctorState();&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;外出就医&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.Process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;外出就医状态：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('e3854481-cec8-4b1f-9141-7c43e3cbcce4')"&gt;&lt;img style="display: none" id="code_img_closed_e3854481-cec8-4b1f-9141-7c43e3cbcce4" class="code_img_closed" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /&gt;&lt;img id="code_img_opened_e3854481-cec8-4b1f-9141-7c43e3cbcce4" class="code_img_opened" onclick="cnblogs_code_hide('e3854481-cec8-4b1f-9141-7c43e3cbcce4',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_e3854481-cec8-4b1f-9141-7c43e3cbcce4"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;OutDoctorState&amp;nbsp;:&amp;nbsp;State&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Process(Context&amp;nbsp;c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(c.PrisonerState&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;在押人员状态是外出就医！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.Current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;OutHomeState();&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;外出探亲&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.Process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;外出探亲状态：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('0fbfc908-9764-47d9-9593-f48f55804433')"&gt;&lt;img style="display: none" id="code_img_closed_0fbfc908-9764-47d9-9593-f48f55804433" class="code_img_closed" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /&gt;&lt;img id="code_img_opened_0fbfc908-9764-47d9-9593-f48f55804433" class="code_img_opened" onclick="cnblogs_code_hide('0fbfc908-9764-47d9-9593-f48f55804433',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_0fbfc908-9764-47d9-9593-f48f55804433"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;OutHomeState:State&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Process(Context&amp;nbsp;c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(c.PrisonerState&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;在押人员状态是外出探亲！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;在押人员状态错误!&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;客户端调用：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('eebe7dbb-7a77-47cd-bfa2-3708eeb1af58')"&gt;&lt;img style="display: none" id="code_img_closed_eebe7dbb-7a77-47cd-bfa2-3708eeb1af58" class="code_img_closed" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"  alt="" /&gt;&lt;img id="code_img_opened_eebe7dbb-7a77-47cd-bfa2-3708eeb1af58" class="code_img_opened" onclick="cnblogs_code_hide('eebe7dbb-7a77-47cd-bfa2-3708eeb1af58',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_eebe7dbb-7a77-47cd-bfa2-3708eeb1af58"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Main(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Prisoner&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Prisoner();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Context&amp;nbsp;process&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Context(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.CurrentStatus&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;process.Process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.CurrentStatus&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;process.Process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.CurrentStatus&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;process.Process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;要点：为Prisoner的CurrrentStatus操作是在各个具体的状态中进行的，在这里可以看到需要说明一下的是：这种状态的转换在真实的环境下是有序列的。（但Demo中表现并不明显，这种需要强调一下）。&lt;/p&gt;&lt;p&gt;再次补充说明一下状态和策略模式的区别：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;前者的行为实行方式是有条件决定的，并且应当不在客户端干预的情况下自己迁移到合适的状态，而后者的行为实行方式是有客户端选择，并且能随时替换。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;fieldset style="font-family: Arial; color: #003333"&gt;&lt;p&gt;&lt;legend&gt;版权说明&lt;/legend&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 本文属学习笔记，欢迎转载且注明文章出处，其版权归作者和博客园共有。&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; 作&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;者：Charles Chen&lt;/p&gt;&lt;p&gt;&amp;nbsp;文章出处：&lt;a href="http://charles2008.cnblogs.com/" target="_blank"&gt;&lt;font color="#1d58d1"&gt;http://charles2008.cnblogs.com/&lt;/font&gt;&lt;/a&gt; &amp;nbsp;或&amp;nbsp; &lt;a href="http://www.cnblogs.com/" target="_blank"&gt;&lt;font color="#1d58d1"&gt;http://www.cnblogs.com/&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;/fieldset&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;div id="EntryTag"&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/v:shapetype&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Charles2008/aggbug/1902287.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Charles2008/archive/2010/12/10/Demo_O_State.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
