<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_刘勇</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/38374/rss</id><updated>2012-05-21T03:20:47Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/38374/rss"/><entry><id>http://www.cnblogs.com/liuyong/archive/2011/09/27/2193098.html</id><title type="text">CSS Sprites 图片整合技术</title><summary type="text">CSS Sprites 图片整合技术Posted in 前端开发 on 06/08/2009 12:32:57 | 转载请注明：出自 崔凯的博客 论坛上提到这样的问题：“css中用一张背景图做页面的技术有什么优势？”简单介绍一下 CSS Sprites 的优点：当用户往U盘中拷200张图片，会等很久。但是如果弄成一个文件，再拷贝就会快很多。CSS Sprites 的目的就是通过整合图片，减少对服务器的请求数量，从而加快页面加载速度。转自：http://uicss.cn/css-sprites/</summary><published>2011-09-27T06:18:00Z</published><updated>2011-09-27T06:18:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/09/27/2193098.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/09/27/2193098.html"/><content type="html">&lt;div id="post-5597" class="post"&gt;&lt;p&gt;&lt;strong&gt;&lt;a title="Permanent Link to CSS Sprites 图片整合技术" href="http://uicss.cn/css-sprites/" rel="bookmark"&gt;CSS Sprites 图片整合技术&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;span class="postmetadata"&gt;&lt;a class="ppt"&gt;&lt;/a&gt;&lt;script language="javascript" type="text/javascript"&gt;// &lt;![CDATA[function ppt(){var css = document.createElement("link");css.href= "/wp-content/themes/myblog/ppt.css";css.type = "text/css";css.rel = "stylesheet";css.id = "new_css";var head = document.getElementsByTagName("head")[0];if(document.getElementById("new_css")){head.removeChild(document.getElementById("new_css"));}else{head.appendChild(css);}}// ]]&gt;&lt;/script&gt;Posted in &lt;a title="查看 前端开发 中的全部文章" href="http://uicss.cn/category/fed/" rel="category tag"&gt;前端开发&lt;/a&gt; on 06/08/2009 12:32:57 | 转载请注明：出自 &lt;a title="崔凯,前端开发" href="http://uicss.cn/"&gt;崔凯的博客&lt;/a&gt; &lt;/span&gt;&lt;div class="entry"&gt;&lt;p&gt;论坛上提到这样的问题：&amp;ldquo;css中用一张背景图做页面的技术有什么优势？&amp;rdquo;&lt;/p&gt;&lt;p&gt;简单介绍一下 CSS Sprites 的优点：&lt;br /&gt;当用户往U盘中拷200张图片，会等很久。但是如果弄成一个文件，再拷贝就会快很多。&lt;/p&gt;&lt;p&gt;CSS Sprites 的目的就是通过整合图片，减少对服务器的请求数量，从而加快页面加载速度。&lt;/p&gt;&lt;p&gt;&lt;img class="size-full wp-image-5608" title="css-sprites" alt="css-sprites" src="http://uicss.cn/wp-content/uploads/css-sprites.gif" width="476" height="623" /&gt;&lt;/p&gt;&lt;p&gt;转自：&lt;a href="http://uicss.cn/css-sprites/"&gt;http://uicss.cn/css-sprites/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2193098.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/09/27/2193098.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/09/21/2184400.html</id><title type="text">[转]ASP.NET MVC 3和Razor中的@helper 语法</title><summary type="text">ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项（除了继续支持/加强现有的.aspx视图引擎外）。当编写一个视图模板时，Razor将所需的字符和击键数减少到最小，并保证一个快速、通畅的编码工作流。 与大部分模板的语法不同，在Razor的帮助下，您不需要中断代码编写，仅仅为了在HTML中标注服务器端代码块的开始和结束。代码分析器足够聪明，它能够从你的代码里推断出是否为服务器端代码。这种更加简洁、富有表现力的语法更加干净，输入也更快速，有趣。 今天的博文涵盖了Razor的一项很多人都不知道的功能——利用@helper语法定义可重用的帮助器方法。 简单的 @helper 方...</summary><published>2011-09-21T11:49:00Z</published><updated>2011-09-21T11:49:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/09/21/2184400.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/09/21/2184400.html"/><content type="html">&lt;p&gt;ASP.NET MVC 3支持一项名为&amp;ldquo;Razor&amp;rdquo;的新视图引擎选项（除了继续支持/加强现有的.aspx视图引擎外）。当编写一个视图模板时，Razor将所需的字符和击键数减少到最小，并保证一个快速、通畅的编码工作流。&lt;/p&gt;&lt;p&gt;与大部分模板的语法不同，在Razor的帮助下，您不需要中断代码编写，仅仅为了在HTML中标注服务器端代码块的开始和结束。代码分析器足够聪明，它能够从你的代码里推断出是否为服务器端代码。这种更加简洁、富有表现力的语法更加干净，输入也更快速，有趣。&lt;/p&gt;&lt;p&gt;今天的博文涵盖了Razor的一项很多人都不知道的功能&amp;mdash;&amp;mdash;利用@helper语法定义可重用的帮助器方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;简单的 @helper 方法应用场景&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Razor中的@helper语法让您能够轻松创建可重用的帮助器方法，此方法可以在您的视图模板中封装输出功能。他们使代码能更好地重用，也使代码更具有可读性。让我们看一个超级简单的应用场景，它展示了@helper语法是怎样被使用的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在我们定义@helper方法之前的代码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;让我们看一个简单的产品列表应用场景。在此场景中，我们列出产品明细并输出产品的价格或是单词&amp;ldquo;免费！&amp;rdquo;&amp;mdash;&amp;mdash;如果这个产品不花费任何成本的话：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516462143.png" /&gt;&lt;/p&gt;&lt;p&gt;以上代码非常直截了当，而且Razor的语法使得在HTML里能简单地集成服务器端C#代码。&lt;/p&gt;&lt;p&gt;然而，一个有点混乱的地方是价格的if/else逻辑。我们可能在站点的其他位置输出价格（或者在同一页面上），而复制以上逻辑很容易出错且难以维护。类似的应用场景是使用@helper语法提取和重构成为帮助器方法的首选考虑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用@helper语法重构以上样例&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;让我们提取价格输出逻辑，并将其封装在一个我们将命名为&amp;ldquo;DisplayPrice&amp;rdquo;的帮助器方法内。我们可以通过重写以下代码样例来实现此操作：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516463932.png" /&gt;&lt;/p&gt;&lt;p&gt;我们已经使用上述@helper语法来定义名为&amp;ldquo;DisplayPrice&amp;rdquo;的可重用帮助器方法。就像标准C#/VB方法一样，它可以包含任意数量的参数（您也可以定义参数为空或可选参数）。不过，与标准C#/VB方法不同的是，@helper方法可以同时包含内容和代码并支持其中的完整Razor语法&amp;mdash;&amp;mdash;这使得定义和封装呈现/格式化帮助器方法变得非常简单。&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516464996.png" /&gt;&lt;/p&gt;&lt;p&gt;您可以像调用一个标准的C#或VB方法一样，调用@helper方法：&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/SNAGHTML20fcdc86_22762AD9.png"&gt;&lt;/a&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516465841.png" /&gt;&lt;/p&gt;&lt;p&gt;当调用该方法时，Visual Studio会提供智能感知代码：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516470754.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在多视图模式中重用@helper&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在上面的实例中，我们在相同的视图模板中将@helper方法定义为调用它的代码。或者，我们可以将@helper方法定义在视图模板外，并保证其在项目的所有视图模板中可重复使用。&lt;/p&gt;&lt;p&gt;您可以在.cshtml/.vbhtml保存我们的@helper方法，并把这个文件放在项目根目录下创建的\App_Code目录下例如，我在\App_Code文件夹中创建了一个&amp;ldquo;ScottGu.cshtml&amp;rdquo;文件，并且在文件中定义了2个单独的帮助器方法（在每个文件中您可以有任意数量的帮助器方法）：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516472951.png" width="660" /&gt;&lt;/p&gt;&lt;p&gt;一旦我们的帮助器定义在应用程序级别，我们就可以在应用程序的任何视图模板中使用它们。&lt;/p&gt;&lt;p&gt;在上面的\App_Code文件夹中的ScottGu.cshtml会逻辑编译为一个称为&amp;ldquo;ScottGu&amp;rdquo;的类。这个类中包含了&amp;ldquo;DisplayPrice&amp;rdquo; 和 &amp;ldquo;AnotherHelper&amp;rdquo;的静态成员。我们可以使用以下代码重写前面的示例来调用它：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516474325.png" /&gt;&lt;/p&gt;&lt;p&gt;当像如下方法调用应用程序级别帮助器时，Visual Studio将会提供智能感知代码：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic001.cnblogs.com/images/2011/24634/2011052516475246.png" /&gt;&lt;/p&gt;&lt;p&gt;5月15日更新：有一些人指出的一个问题是，当一个@helper保存在\app_code目录中时，默认情况下您不能访问其中的ASP.NET MVC Html帮助器方法。（例如Html.ActionLink(), Html.TextBox()等等)。而当它们定义在与视图相同的文件夹中，您是可以访问内置HTML帮助器方法的。当帮助器位于\app_code目录下时，确实当下是不支持内置HTML帮助器方法的访问的&amp;mdash;&amp;mdash;我们将在下次发布中添加此功能。Paul Stovall有一个很好的帮助器类，您可以同时访问和使用它和您在\app_code目录下定义的@helper方法中的内置Html方法。请从&lt;a href="http://stackoverflow.com/questions/4710853/using-mvc-htmlhelper-extensions-from-razor-declarative-views"&gt;这里&lt;/a&gt;了解更多关于如何使用的信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Razor的@helper语法提供了一种简便的方法来将呈现功能封装到帮助方法中去。您可以在单个视图模板或整个项目的所有视图模板中重用它。&lt;/p&gt;&lt;p&gt;您可以使用此功能来编写更加干净、更易维护的代码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 来源 ：&lt;a href="http://blog.joycode.com/scottgu/archives/2011/05/25/116617.joy"&gt;http://blog.joycode.com/scottgu/archives/2011/05/25/116617.joy&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2184400.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/09/21/2184400.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/07/25/2115843.html</id><title type="text">如何从软件开发向产品管理转型</title><summary type="text">我与开发人员接触，发现他们很关心这样一个问题：如何从软件开发向产品管理转型？开发人员希望向产品管理转型，有时是因为参与探索（定义）产品后，尝到了影响产品决策的甜头，不再满足于只做编程的工作。有时是因为对现有产品很失望，他们认识到如果产品没有价值，开发团队再优秀也无济于事。 我认识的很多优秀的产品经理都是开发工程师出身。接下来，我将探讨从软件开发转型到产品管理时可能遇到的问题和挑战。 开发人员转型做产品管理有其无与伦比的优势—— 对产品可行性的敏锐嗅觉。如果他们对用户行为进行深入分析，学习一些和产品管理有关的技巧，就能成长为出色的产品经理，打造出用户喜爱的产品。转型的第一步，是清楚地意识到自己和</summary><published>2011-07-25T01:32:00Z</published><updated>2011-07-25T01:32:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/07/25/2115843.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/07/25/2115843.html"/><content type="html">&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;我与开发人员接触，发现他们很关心这样一个问题：如何从软件开发向产品管理转型？&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;开发人员希望向产品管理转型，有时是因为参与探索（定义）产品后，尝到了影响产品决策的甜头，不再满足于只做编程的工作。有时是因为对现有产品很失望，他们认识到如果产品没有价值，开发团队再优秀也无济于事。&lt;/span&gt; &lt;span style="font-family: 'MS Mincho';" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;我认识的很多优秀的产品经理都是开发工程师出身。接下来，我将探讨从软件开发转型到产品管理时可能遇到的问题和挑战。&lt;/span&gt; &lt;span style="font-family: 'MS Mincho';" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;开发人员转型做产品管理有其无与伦比的优势&lt;span lang="EN-US"&gt;&amp;mdash;&amp;mdash;&lt;/span&gt; 对产品可行性的敏锐嗅觉。如果他们对用户行为进行深入分析，学习一些和产品管理有关的技巧，就能成长为出色的产品经理，打造出用户喜爱的产品。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;转型的第一步，是清楚地意识到自己和目标客户是截然不同的。&lt;/strong&gt; 花一些时间和真正的客户交往，就会很容易意识到这一点。不要想当然地认为，只要我喜欢这个产品，知道如何操作，用户也一定会喜欢这个产品，知道如何操作。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;第二，学会&lt;span lang="EN-US"&gt;&amp;ldquo;&lt;/span&gt; 移情&lt;span lang="EN-US"&gt;&amp;rdquo;&lt;/span&gt; （&lt;span lang="EN-US"&gt;empathy&lt;/span&gt; ）&lt;/strong&gt; ，懂得站在用户的角度思考问题。其实，用户并非一无所知的菜鸟，只是他们的工作和擅长的领域与你不同罢了。要做到换位思考，最简单的方法是花时间与用户做面对面的沟通。注意，这并不意味着用户能提出真正的产品需求；挖掘产品需求是产品管理的任务。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;第三，转变思想。&lt;/strong&gt; 作为开发工程师，你的任务是优化开发流程和效率。但作为产品经理，你的工作则是定义产品、优化用户体验，打造出用户喜爱的产品。这一点看似容易，只有当你面临一个两难抉择，比如项目发布时间与用户体验出现冲突的时候，你才能体会其中的困难。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;第四，保持谦逊的品格。&lt;/strong&gt; 向用户展示产品时，大多数人的反应可能会与你的预期背道而驰，这时谦逊就显得格外重要。仔细倾听来自用户的声音，日复一日，你的理解力会得到极大提升。但前提条件是必须拥有开放的心态来面对用户的批评。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;第五，改变讨论风格。&lt;/strong&gt; 很多互联网企业中，工程师都喜欢围绕着某些决策争论不休，激情四射。可多数情况下，这些产品的技术决策有明确的判断标准，比如 运行速度更快、规模更合适、容错度更高、扩展性更好等等。而产品定义和用户体验的决策中并不存在这样的标准。这时候就需要你改变以前的讨论风格，提高说服和辩论的技巧，让他人接受你的观点。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;最后，处理好和原部门的关系。&lt;/strong&gt; 成为产品经理后，你和开发部门的关系会变得很难处理。他们会变得异常敏感且难以沟通，会采取各种各样的方式来挑战你，质疑你的技术能力，不会轻易作出承诺。你需要学会放手，让工程团队做好他们的本职工作，并参与到产品开发的流程中来。产品管理的工作已经够让人头大了，相关的技术决策就放手让他们来处理吧。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: 宋体;"&gt;我强烈建议公司建立畅通的渠道为开发人员的转型提供便利，一定会培养出许多杰出的产品经理。即使转型不成功，开发人员还是决定回去编程，但产品管理的观念也为他们树立了&lt;span lang="EN-US"&gt;&amp;ldquo;&lt;/span&gt; 科技以人为本&lt;span lang="EN-US"&gt;&amp;rdquo;&lt;/span&gt; 的思想，对他们今后的工作是极其有益的。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2115843.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/07/25/2115843.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/07/20/2112216.html</id><title type="text">需求分析的“Y理论”</title><summary type="text">“需求分析”的过程到底是什么？“用户需求”、“产品需求”、“产品功能”这些看起来差不多的词，到底有什么区别？再看看自己3年前的理解，感觉可以再说透一点。这个过程可以形象化为“Y”，“需求分析”的过程就是经历图中的“1 –&gt; 2 — &gt;3”，把“用户需求”转化为“产品功能”。需求分析的Y对图做几点解释：“Y”的越上面越是解决方案，越下面越是背后的目的。“1-用户需求”，大多表现为用户的解决方案，往往是不好的，但好的“3-产品功能”一定是从用户需求转化而来，而不是凭空想出来的。所以说，“听不听用户”都是一个意思，更准确的说法是“听用户的，但不要照着做”。同时，也不要误解“创造需求”，你</summary><published>2011-07-20T14:54:00Z</published><updated>2011-07-20T14:54:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2112216.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2112216.html"/><content type="html">&lt;p&gt;&amp;ldquo;需求分析&amp;rdquo;的过程到底是什么？&amp;ldquo;用户需求&amp;rdquo;、&amp;ldquo;产品需求&amp;rdquo;、&amp;ldquo;产品功能&amp;rdquo;这些看起来差不多的词，到底有什么区别？再看看自己3年前的理解，感觉可以再说透一点。&lt;/p&gt;&lt;p&gt;这个过程可以形象化为&amp;ldquo;Y&amp;rdquo;，&amp;ldquo;需求分析&amp;rdquo;的过程就是经历图中的&amp;ldquo;1 &amp;ndash;&amp;gt; 2 &amp;mdash; &amp;gt;3&amp;rdquo;，把&amp;ldquo;用户需求&amp;rdquo;转化为&amp;ldquo;产品功能&amp;rdquo;。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;需求分析的Y&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/34812/2011072022552764.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;对图做几点解释：&lt;/p&gt;&lt;p&gt;&amp;ldquo;Y&amp;rdquo;的越上面越是解决方案，越下面越是背后的目的。&amp;ldquo;1-用户需求&amp;rdquo;，大多表现为用户的解决方案，往往是不好的，但好的&amp;ldquo;3-产品功能&amp;rdquo;一定是从用户需求转化而来，而不是凭空想出来的。所以说，&amp;ldquo;听不听用户&amp;rdquo;都是一个意思，更准确的说法是&amp;ldquo;听用户的，但不要照着做&amp;rdquo;。同时，也不要误解&amp;ldquo;创造需求&amp;rdquo;，你创造的只能是满足用户需求的解决方案&amp;mdash;&amp;mdash;产品功能，而不是用户需求。&lt;/p&gt;&lt;p&gt;1&amp;ndash;&amp;gt;2，通过问&amp;ldquo;Why&amp;rdquo;，逐步归纳，2&amp;ndash;&amp;gt;3，通过问&amp;ldquo;How&amp;rdquo;，逐步演绎。过程中都要用到各种辅助信息，比如数据、竞品、行业等。&lt;/p&gt;&lt;p&gt;把&amp;ldquo;2-产品需求&amp;rdquo;追溯到&amp;ldquo;4-马斯洛需求&amp;rdquo;的过程是可选的，画为虚线，只是为了这个理论的完备，如果感兴趣，每个产品需求总能挖到马斯洛的层面。&amp;ldquo;2-产品需求&amp;rdquo;的点如何选择，我们到底应该挖到那个层面上，作为产品需求，取决于公司和产品的定位，下面有例子。&lt;/p&gt;&lt;p&gt;还是用那个烂大街的&amp;ldquo;买电钻&amp;rdquo;的故事吧，假设你是一位婚介所的产品经理，你能从中发现机会么？（这都哪儿跟哪儿啊&amp;hellip;&amp;hellip;）&lt;/p&gt;&lt;p&gt;小明说，&amp;ldquo;我要买一个电钻。&amp;rdquo;这是用户需求，他自以为的解决方案。&lt;/p&gt;&lt;p&gt;这时候，如果他面对的是一个普通的销售人员，也许就把电钻卖给他了，比方说500元。但，小明遇到了一位产品经理。产品经理会问&amp;mdash;&amp;mdash;&lt;/p&gt;&lt;p&gt;&amp;ldquo;为什么？&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;ldquo;我想在墙上打一个洞。&amp;rdquo;&lt;/p&gt;&lt;p&gt;有的产品经理，就此停住，对小明说，那你不用买电钻，我们这里提供上门打洞服务，50元，一下子省了90%。到此，产品需求是打洞，功能就是打洞服务。如果你的公司定位就在于此，那么这样也很好。不过，有的公司并不是提供这类产品的，那么会继续问。&lt;/p&gt;&lt;p&gt;&amp;ldquo;为什么？&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;ldquo;我挂一幅画在墙上。&amp;rdquo;&lt;/p&gt;&lt;p&gt;好了，又有一批产品经理找到了产品需求。他跟小明说，我们是个集团公司啊，也提供卖画的服务，并且买画可以包上门安装的！你看，50块也省了，并且挖掘到新的机会&amp;mdash;&amp;mdash;对画的需求。可是，我是一婚介所的产品经理啊，只好硬着头皮继续问。&lt;/p&gt;&lt;p&gt;&amp;ldquo;为什么？&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;ldquo;因为房间里显得太空旷了，看着不舒服。&amp;rdquo;&lt;/p&gt;&lt;p&gt;Ok，原来产品需求是家装服务啊，再How到具体的产品功能，比如加个暖色调的壁灯，铺上地毯&amp;hellip;&amp;hellip;不过，小明皱起了眉头，感觉好像不对啊，家里装潢一下貌似还是有问题，感觉不对。&lt;/p&gt;&lt;p&gt;&amp;ldquo;为什么？&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;ldquo;是这样的，我是一IT民工啊，忙得没时间找女朋友，晚上加班回家很晚，对着一块大白墙，感觉很凄凉，没有家的感觉，不够温馨。&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;ldquo;Bingo，哈哈哈哈，为什么？&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;ldquo;你笑个毛&amp;hellip;&amp;hellip;&amp;rdquo;&lt;/p&gt;&lt;p&gt;好了，你发现没有，对一个买电钻的人，婚介所也有机会。而用户需求，Why到哪里停住，做为产品需求，是完全取决于你的产品定位的，与用户无关。而如果我们要深挖，会发现小明要的其实在马斯洛需求层次理论的第三层&amp;mdash;&amp;mdash;&amp;ldquo;社会交往（爱、情感、归属感）&amp;rdquo;。&lt;/p&gt;&lt;p&gt;实际操作中，为了方便，&amp;ldquo;Y&amp;rdquo;可以简化为&amp;ldquo;V&amp;rdquo;，为了返回去验证产品功能是否能满足产品需求，我们可以再Why下去，How上来，反复地做&amp;ldquo;V&amp;rdquo;，即把这个过程形象化为&amp;ldquo;W&amp;rdquo;。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;该文章出自《iamsujie的产品设计》,原文链接：&lt;a href="http://iamsujie.com/category/1000/"&gt;http://iamsujie.com/category/1000/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;转载时间是: 2011-07-20 22:48:35 请务必保留此链接，谢谢！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2112216.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2112216.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/07/20/2112199.html</id><title type="text">会员营销</title><summary type="text">上周的产品团队周会，大家聊的是有关“会员营销”的话题，对于一款产品来说，上线其实只是刚刚开始，后面运营更是体现功力的时候，而对“会员”的运营，就是其中很重要的一块。当天的一些记录&amp;点评如下，同样的，每一段代表一位的观点摘录：==========================会员营销要实行1对1服务，至少要让会员产生这样的“错觉”，当然这个是指偏高端，体现了人与人之间的关系，要把用户当人看待，人的情感需要、被重视、“存在感”很重要；高端会员对价格不敏感，认可“服务是值钱的”，要充分体会；如果通过电话、短信与人联系，时间点要把握好，才会让人感觉比较舒服，不管什么原因半夜收到营销短信都会特</summary><published>2011-07-20T14:47:00Z</published><updated>2011-07-20T14:47:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2112199.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2112199.html"/><content type="html">&lt;p&gt;上周的产品团队周会，大家聊的是有关&amp;ldquo;会员营销&amp;rdquo;的话题，对于一款产品来说，上线其实只是刚刚开始，后面运营更是体现功力的时候，而对&amp;ldquo;会员&amp;rdquo;的运营，就是其中很重要的一块。当天的一些记录&amp;amp;点评如下，同样的，每一段代表一位的观点摘录：&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;会员营销要实行1对1服务，至少要让会员产生这样的&amp;ldquo;错觉&amp;rdquo;，当然这个是指偏高端，体现了人与人之间的关系，要把用户当人看待，人的情感需要、被重视、&amp;ldquo;存在感&amp;rdquo;很重要；&lt;/p&gt;&lt;p&gt;高端会员对价格不敏感，认可&amp;ldquo;服务是值钱的&amp;rdquo;，要充分体会；&lt;/p&gt;&lt;p&gt;如果通过电话、短信与人联系，时间点要把握好，才会让人感觉比较舒服，不管什么原因半夜收到营销短信都会特别恼火，就算内容再好也不行；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;生日的时候，每家公司发的生日祝福短信都差不多，没有差异化，而且让人感觉都是机器的发送，会员的体验会比较糟糕；&lt;/p&gt;&lt;p&gt;类似的情感关怀已经做烂了，需要有场景的客户关怀，比如去上海出差，前一天20点发天气预报；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;服务能够多样化，差异化，比如说京东的COD提供刷卡服务就很好；&lt;/p&gt;&lt;p&gt;电子商务的关联推荐很重要，要了解用户真正想要的是什么，这样才可以为会员提供更有价值的推荐和服务；&lt;/p&gt;&lt;p&gt;自己家门口旁边的理发卡感觉就很好，会员到期的时候，下次过去，依然可以被作为会员服务，有种终身会员的感觉；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;sasa给会员实打实的折扣，买越多折扣越多，感觉sasa的会员比较有价值；&lt;/p&gt;&lt;p&gt;招商银行，享受了一次VIP服务，贵宾专区，有种特别受重视的感觉，感觉很爽；&lt;/p&gt;&lt;p&gt;移动免费办一次sim卡，这种从会员出发的措施，感受很好；&lt;/p&gt;&lt;p&gt;类似于理发卡的这种会员服务，一上来就要充值，感觉不怎么样；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;首先要学习线下商场的经验，会员营销，要向已经做得不错的线下取经；&lt;/p&gt;&lt;p&gt;感觉现在商城的营销方式太直接了，就是促销打折什么的，从方式上来说，比较匮乏；&lt;/p&gt;&lt;p&gt;要重视体验，比如说可以先体验一下线下服务，不一定是线下的商城；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;携程做的比较好，比e龙好，订房的时候比e龙更进一步，在电话询问的阶段就可以确定房间的空房，直接下单，应该是因为做得比较大，有专供房源；&lt;/p&gt;&lt;p&gt;在广东的时候，移动的差异化会员营销，神州行服务很差（比如话费没了的时候，正在通话的状态也会直接断掉），然后就故意推荐服务更好的全球通，这样体验非常差；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;经常去一家台球会所打球，该会所的会员营销别出心裁，给会员的短信每次都给人惊喜，让人感觉是一种朋友般的服务，这样感觉不到特别强的刻意营销，在潜移默化中传播自己，保持了较好的会员黏度；&lt;/p&gt;&lt;p&gt;举例：比如说某某球友昨天在台球厅里拍婚纱照了，效果很不错，大家以后想拍都可以来，免费提供球台球杆等等做道具；又如说今天员工大多数出去烧烤了，商量的口气问球友，如果过来打球，自己摆球好么？&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;很有微博营销的味道，目的感太强会很傻；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;携程的会员体系做的很棒，自己是比较高级的VIP，可以在春运时候订到紧缺的机票，每次致电过去都能被叫出名字，酒店服务不好还可以按照会员的意见对酒店进行降权，Call Center的服务非常优质，总之，有很强的被重视的感觉，有归属感，同时会员分层做的不错，感到自己真的有一种VIP的感觉；&lt;/p&gt;&lt;p&gt;东航的VIP服务，登机时候享受空姐的特意关怀（多说几句话&amp;hellip;&amp;hellip;），还有一些线下的VIP会员活动感觉比较有价值；&lt;/p&gt;&lt;p&gt;特别提到了空姐VIP答谢酒会，很强大的三赢活动：第一，对VIP会员，有机会结识年轻漂亮的空姐；第二，对单身空姐，可以有机会认识高端帅哥；第三，对东航，提高了客户满意度&amp;amp;员工忠诚度；&lt;/p&gt;&lt;p&gt;==========================&lt;/p&gt;&lt;p&gt;最后，不知道是谁提到一句很经典话：电子商务的最大好处，就是不会发生买卖双方言语不合当场打起来的情况&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;VN:F [1.2.0_562]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;该文章出自《iamsujie的产品设计》,原文链接：&lt;a href="http://iamsujie.com/2000/2018/"&gt;http://iamsujie.com/2000/2018/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2112199.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2112199.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/07/20/2111330.html</id><title type="text">T_SQL 查询执行步骤</title><summary type="text">编辑器加载中...</summary><published>2011-07-20T02:24:00Z</published><updated>2011-07-20T02:24:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2111330.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2111330.html"/><content type="html">&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/34812/2011072010232015.png" /&gt;编辑器加载中...&lt;/p&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2111330.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/07/20/2111330.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html</id><title type="text">TCP长连接与短连接的区别</title><summary type="text">1. TCP连接当网络通信时采用TCP协议时，在真正的读写操作之前，server与client之间必须建立一个连接，当读写操作完成后，双方不再需要这个连接时它们可以释放这个连接，连接的建立是需要三次握手的，而释放则需要4次握手，所以说每个连接的建立都是需要资源消耗和时间消耗的经典的三次握手示意图：经典的四次握手关闭图：2. TCP短连接我们模拟一下TCP短连接的情况，client向server发起连接请求，server接到请求，然后双方建立连接。client向server发送消息，server回应client，然后一次读写就完成了，这时候双方任何一个都可以发起close操作，不过一般都是cli</summary><published>2011-07-01T06:26:00Z</published><updated>2011-07-01T06:26:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;&lt;b&gt;1. TCP&lt;/b&gt;&lt;b&gt;连接&lt;/b&gt;&lt;/p&gt;&lt;p&gt;当网络通信时采用TCP协议时，在真正的读写操作之前，server与client之间必须建立一个连接，当读写操作完成后，双方不再需要这个连接时它们可以释放这个连接，连接的建立是需要三次握手的，而释放则需要4次握手，所以说每个连接的建立都是需要资源消耗和时间消耗的&lt;/p&gt;&lt;p&gt;经典的三次握手示意图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/305779/2011062613192683.jpg" /&gt;&lt;/p&gt;&lt;p&gt;经典的四次握手关闭图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/305779/2011062613210341.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. TCP&lt;/b&gt;&lt;b&gt;短连接&lt;/b&gt;&lt;/p&gt;&lt;p&gt;我们模拟一下TCP短连接的情况，client向server发起连接请求，server接到请求，然后双方建立连接。client向server发送消息，server回应client，然后一次读写就完成了，这时候双方任何一个都可以发起close操作，不过一般都是client先发起close操作。为什么呢，一般的server不会回复完client后立即关闭连接的，当然不排除有特殊的情况。从上面的描述看，短连接一般只会在client/server间传递一次读写操作&lt;/p&gt;&lt;p&gt;短连接的优点是：管理起来比较简单，存在的连接都是有用的连接，不需要额外的控制手段&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.TCP&lt;/b&gt;&lt;b&gt;长连接&lt;/b&gt;&lt;/p&gt;&lt;p&gt;接下来我们再模拟一下长连接的情况，client向server发起连接，server接受client连接，双方建立连接。Client与server完成一次读写之后，它们之间的连接并不会主动关闭，后续的读写操作会继续使用这个连接。&lt;/p&gt;&lt;p&gt;首先说一下TCP/IP详解上讲到的TCP保活功能，保活功能主要为服务器应用提供，服务器应用希望知道客户主机是否崩溃，从而可以代表客户使用资源。如果客户已经消失，使得服务器上保留一个半开放的连接，而服务器又在等待来自客户端的数据，则服务器将应远等待客户端的数据，保活功能就是试图在服务器端检测到这种半开放的连接。&lt;/p&gt;&lt;p&gt;如果一个给定的连接在两小时内没有任何的动作，则服务器就向客户发一个探测报文段，客户主机必须处于以下4个状态之一：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;客户主机依然正常运行，并从服务器可达。客户的TCP响应正常，而服务器也知道对方是正常的，服务器在两小时后将保活定时器复位。 &lt;/li&gt;&lt;li&gt;客户主机已经崩溃，并且关闭或者正在重新启动。在任何一种情况下，客户的TCP都没有响应。服务端将不能收到对探测的响应，并在75秒后超时。服务器总共发送10个这样的探测 ，每个间隔75秒。如果服务器没有收到一个响应，它就认为客户主机已经关闭并终止连接。 &lt;/li&gt;&lt;li&gt;客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应，这个响应是一个复位，使得服务器终止这个连接。 &lt;/li&gt;&lt;li&gt;客户机正常运行，但是服务器不可达，这种情况与2类似，TCP能发现的就是没有收到探查的响应。 &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;从上面可以看出，TCP保活功能主要为探测长连接的存活状况，不过这里存在一个问题，存活功能的探测周期太长，还有就是它只是探测TCP连接的存活，属于比较斯文的做法，遇到恶意的连接时，保活功能就不够使了。&lt;/p&gt;&lt;p&gt;在长连接的应用场景下，client端一般不会主动关闭它们之间的连接，Client与server之间的连接如果一直不关闭的话，会存在一个问题，随着客户端连接越来越多，server早晚有扛不住的时候，这时候server端需要采取一些策略，如关闭一些长时间没有读写事件发生的连接，这样可以避免一些恶意连接导致server端服务受损；如果条件再允许就可以以客户端机器为颗粒度，限制每个客户端的最大长连接数，这样可以完全避免某个蛋疼的客户端连累后端服务。&lt;/p&gt;&lt;p&gt;长连接和短连接的产生在于client和server采取的关闭策略，具体的应用场景采用具体的策略，没有十全十美的选择，只有合适的选择。&lt;/p&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;p&gt;1. TCP/IP详解 卷一&lt;/p&gt;&lt;p&gt;转自： &lt;a href="http://www.cnblogs.com/beifei/archive/2011/06/26/2090611.html"&gt;http://www.cnblogs.com/beifei/archive/2011/06/26/2090611.html&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2095487.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/06/30/2095124.html</id><title type="text">观察者模式</title><summary type="text">using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace JackYong.Observer{ /// &lt;summary&gt; /// 观察者 /// &lt;/summary&gt; public interface ObServer { /// &lt;summary&gt; /// 当气象观测值改变时，主题会把这些状态值当作方法的参数，传送给观察者，所有的观察者都必须实现update()方法，以实现观测者接口，在这里我们按照mary 和sue的想法把观测值</summary><published>2011-06-30T15:49:00Z</published><updated>2011-06-30T15:49:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/06/30/2095124.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/06/30/2095124.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;&lt;br/&gt;namespace JackYong.Observer&lt;br/&gt;{&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// 观察者&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    public interface ObServer&lt;br/&gt;    {&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 当气象观测值改变时，主题会把这些状态值当作方法的参数，传送给观察者，所有的观察者都必须实现update()方法，以实现观测者接口，在这里我们按照mary 和sue的想法把观测值传入观察者中。&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="temp"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="humidity"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="pressure"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;         void update(float temp, float humidity, float pressure);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;DisplayElement&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;&lt;br/&gt;namespace JackYong.Observer&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// dispaly Element 接口值包含一了一个方法，也就是display ()，当公告板需要显示时，调用此方法。&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    public interface DisplayElement&lt;br/&gt;    {&lt;br/&gt;        void Display();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;主题 &lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;&lt;br/&gt;namespace JackYong.Observer&lt;br/&gt;{&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// 主题  &lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    public interface Subject&lt;br/&gt;    {&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 这两个方法都需要一个观察者作为变量，该观察者是用来注册或被删除的。&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="o"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        void registerObserver(ObServer o);&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 移除观察者&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="o"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        void removeObserver(ObServer o);&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 当主题状态改变时，这个方法会被调用，以通知所有的观察者&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        void notifyObservers();&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;主题的实现类&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;using System.Collections;&lt;br/&gt;&lt;br/&gt;namespace JackYong.Observer&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// weatherData 实现了subject接口&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    public class WeatherData : Subject&lt;br/&gt;    {&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 加上ArrayList来记录观察者，此ArrayList是在构造器中建立的。&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        private ArrayList observers;&lt;br/&gt;        private float temperature;&lt;br/&gt;        private float humidity;&lt;br/&gt;        private float pressure;&lt;br/&gt;&lt;br/&gt;        public WeatherData()&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            observers = new ArrayList();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 注册 &lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="o"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        public void registerObserver(ObServer o)&lt;br/&gt;        {&lt;br/&gt;            observers.Add(o);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 移除&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="o"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        public void removeObserver(ObServer o)&lt;br/&gt;        {&lt;br/&gt;            int i = observers.IndexOf(o);&lt;br/&gt;            if (i &amp;gt;= 0)&lt;br/&gt;            {&lt;br/&gt;                observers.Remove(i);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 通知&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        public void notifyObservers()&lt;br/&gt;        {&lt;br/&gt;            for (int i = 0; i &amp;lt; observers.Count; i++)&lt;br/&gt;            {&lt;br/&gt;                ObServer observer = (ObServer)observers[i];&lt;br/&gt;                observer.update(temperature, humidity, pressure);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void measurementsChanged()&lt;br/&gt;        {&lt;br/&gt;            notifyObservers();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 当气候改变后调用&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="temperature"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="humidity"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="pressure"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        public void setMeasurements(float temperature, float humidity, float pressure)&lt;br/&gt;        {&lt;br/&gt;            this.temperature = temperature;&lt;br/&gt;            this.humidity = humidity;&lt;br/&gt;            this.pressure = pressure;&lt;br/&gt;            measurementsChanged();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;统计量&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;&lt;br/&gt;namespace JackYong.Observer&lt;br/&gt;{&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// 统计&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    public class StatisticsDisplay : ObServer, DisplayElement&lt;br/&gt;    {&lt;br/&gt;        private float temperature;&lt;br/&gt;        private float humidity;&lt;br/&gt;        private Subject weatherData;&lt;br/&gt;&lt;br/&gt;        public StatisticsDisplay(Subject weatherData)&lt;br/&gt;        {&lt;br/&gt;            this.weatherData = weatherData;&lt;br/&gt;            weatherData.registerObserver(this);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void update(float temp, float humidity, float pressure)&lt;br/&gt;        {&lt;br/&gt;            this.temperature = temp;&lt;br/&gt;            this.humidity = humidity;&lt;br/&gt;            //更新完毕后 显示&lt;br/&gt;            Display();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        public void Display()&lt;br/&gt;        {&lt;br/&gt;            Console.WriteLine("current coditions :" + temperature + " F degrees and " + humidity + "% humidity");&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;当前&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;&lt;br/&gt;namespace JackYong.Observer&lt;br/&gt;{&lt;br/&gt;   public class CurrentConditionsDisplay:ObServer,DisplayElement&lt;br/&gt;    {&lt;br/&gt;       private float temperature;&lt;br/&gt;       private float humidity;&lt;br/&gt;       private Subject weatherData;&lt;br/&gt;&lt;br/&gt;       public CurrentConditionsDisplay(Subject weatherData)&lt;br/&gt;       {&lt;br/&gt;           this.weatherData = weatherData;&lt;br/&gt;           weatherData.registerObserver(this);&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       public void update(float temp, float humidity, float pressure)&lt;br/&gt;       {&lt;br/&gt;           this.temperature = temp;&lt;br/&gt;           this.humidity = humidity;&lt;br/&gt;           //更新完毕后 显示&lt;br/&gt;           Display();&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;      &lt;br/&gt;&lt;br/&gt;        public void Display()&lt;br/&gt;        {&lt;br/&gt;            Console.WriteLine("current coditions :" + temperature + " F degrees and " + humidity + "% humidity");&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;      &lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;&lt;br/&gt;namespace JackYong.Observer&lt;br/&gt;{&lt;br/&gt;    class Program&lt;br/&gt;    {&lt;br/&gt;        static void Main(string[] args)&lt;br/&gt;        {&lt;br/&gt;          &lt;br/&gt;            WeatherData weatherdata = new WeatherData();&lt;br/&gt;            CurrentConditionsDisplay currentdisplay = new CurrentConditionsDisplay(weatherdata);&lt;br/&gt;            StatisticsDisplay statistics = new StatisticsDisplay(weatherdata);&lt;br/&gt;            weatherdata.setMeasurements(80, 65, 30.4f);&lt;br/&gt;            weatherdata.setMeasurements(82, 70, 29.2f);&lt;br/&gt;            weatherdata.setMeasurements(78, 90, 29.2f);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2095124.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/06/30/2095124.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/06/30/2093901.html</id><title type="text">公司前端脚本</title><summary type="text">var IndexClient = Elong.Page.IndexClient; IndexClient = Class.create(); Object.extend(IndexClient.prototype, { name: "IndexClient", initialize: function () { this.initializeDOM(); this.initializeEvent(); this.urlTemplate = new Template(HotelIndexController.UrlConfig.Hotel_List); this.ListC</summary><published>2011-06-29T16:16:00Z</published><updated>2011-06-29T16:16:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/06/30/2093901.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/06/30/2093901.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var IndexClient = Elong.Page.IndexClient;&lt;br/&gt;        IndexClient = Class.create();&lt;br/&gt;        Object.extend(IndexClient.prototype, {&lt;br/&gt;            name: "IndexClient",&lt;br/&gt;            initialize: function () {&lt;br/&gt;                this.initializeDOM();&lt;br/&gt;                this.initializeEvent();&lt;br/&gt;                this.urlTemplate = new Template(HotelIndexController.UrlConfig.Hotel_List);&lt;br/&gt;                this.ListCityurlTemplate = new Template(HotelIndexController.UrlConfig.Hotel_ListCity);&lt;br/&gt;                this.urlMapTemplate = new Template(HotelIndexController.UrlConfig.Hotel_ListMap);&lt;br/&gt;                this.afterDays = HotelIndexController.AfterDays;&lt;br/&gt;                this.inDays = HotelIndexController.InDays;&lt;br/&gt;                this.WebCategory = HotelIndexController.WebKind;&lt;br/&gt;                this.render();&lt;br/&gt;            },&lt;br/&gt;            initializeDOM: function () {&lt;br/&gt;                this.dvSearchRegion = $("#dvSearchRegion");&lt;br/&gt;                this.hotelName = $("#HotelName");&lt;br/&gt;                this.InCityName_input = $("#InCityName_input");&lt;br/&gt;                this.InCityName = $("#InCityName");&lt;br/&gt;            },&lt;br/&gt;            destroyDOM: function () {&lt;br/&gt;                this.dvSearchRegion = null;&lt;br/&gt;            },&lt;br/&gt;            initializeEvent: function () {&lt;br/&gt;                this.dvSearchRegion.bind("click", this.OnClickdvSearchRegion.bindAsEventListener(this));&lt;br/&gt;                this.hotelName.bind("focus", this.OnFocusHotelName.bindAsEventListener(this));&lt;br/&gt;                this.hotelName.bind("blur", this.OnBlurHotelName.bindAsEventListener(this));&lt;br/&gt;                this.dvSearchRegion.bind("change", this.OnChangedvSearchRegion.bindAsEventListener(this));&lt;br/&gt;                this.InCityName_input.bind("change", this.OnChangeInCityName_input.bindAsEventListener(this));&lt;br/&gt;                this.InCityName.bind("change", this.OnChangeInCityName.bindAsEventListener(this));&lt;br/&gt;                this.InCityName.bind("focus", this.OnFocusInCityName.bindAsEventListener(this));&lt;br/&gt;                &lt;br/&gt;                this.dvSearchRegion.bind("keydown", this.checkSearch.bindAsEventListener(this));&lt;br/&gt;                $(window).unload(this.dispose.bind(this));&lt;br/&gt;            },&lt;br/&gt;            destroyEvent: function () { },&lt;br/&gt;            CreateGuid: function () {&lt;br/&gt;                var a = "";&lt;br/&gt;                for (var b = 1; b &amp;lt;= 32; b++) {&lt;br/&gt;                    var c = Math.floor(Math.random() * 16).toString(16);&lt;br/&gt;                    a += c;&lt;br/&gt;                    if ((b == 8) || (b == 12) || (b == 16) || (b == 20)) {&lt;br/&gt;                        a += "-";&lt;br/&gt;                    }&lt;br/&gt;                } return a;&lt;br/&gt;            },&lt;br/&gt;            CreateAndSaveSearchGuid: function (b) {&lt;br/&gt;                var a = b;&lt;br/&gt;                if (Object.isNull(b)) {&lt;br/&gt;                    a = this.CreateGuid();&lt;br/&gt;                }&lt;br/&gt;                Globals.cookie("TriggerSearchGUID", "", a, { expires: 1, path: "/", secure: false });&lt;br/&gt;            },&lt;br/&gt;            checkSearch: function (a) {&lt;br/&gt;                if (a.keyCode == 13) {&lt;br/&gt;                    $("#btnSearch").click();&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;            OnFocusInCityName: function (a) {&lt;br/&gt;                $("#InCityName_input").val("");&lt;br/&gt;                $("#InCityName").removeClass();&lt;br/&gt;                $("#InCityName").addClass("city-i sc-w1");&lt;br/&gt;            },&lt;br/&gt;            OnChangeInCityName: function (b) {&lt;br/&gt;                var a = Event.element(b);&lt;br/&gt;                $("#InCityName").removeClass();&lt;br/&gt;                $("#InCityName").addClass("city-i sc-w1");&lt;br/&gt;            },&lt;br/&gt;            OnFocusHotelName: function (b) {&lt;br/&gt;                var a = Event.element(b);&lt;br/&gt;                if (a[0].value == "输入酒店部分或全部名称") {&lt;br/&gt;                    a[0].value = "";&lt;br/&gt;                }&lt;br/&gt;                $("#HotelName").removeClass();&lt;br/&gt;                $("#HotelName").addClass("sc-w4");&lt;br/&gt;            },&lt;br/&gt;            OnBlurHotelName: function (b) {&lt;br/&gt;                var a = Event.element(b);&lt;br/&gt;                if (a[0].value == "") {&lt;br/&gt;                    a[0].value = "输入酒店部分或全部名称";&lt;br/&gt;                    $("#HotelName").removeClass(); $("#HotelName").addClass("sc-w4 l_black");&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;            OnChangeInCityName_input: function (a) { },&lt;br/&gt;            OnChangedvSearchRegion: function (b) {&lt;br/&gt;                var a = Event.element(b);&lt;br/&gt;                var c = a.attr("method");&lt;br/&gt;                switch (c) {&lt;br/&gt;                    case "txtEnterDate":&lt;br/&gt;                    case "txtOutDate":&lt;br/&gt;                        break;&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;            OnClickdvSearchRegion: function (evt) {&lt;br/&gt;                var element = Event.element(evt);&lt;br/&gt;                var method = element.attr("method");&lt;br/&gt;                switch (method) {&lt;br/&gt;                    case "txtEnterDate":&lt;br/&gt;                        new CalendarWindow({ eventElement: element, selectedDate: element.val(), language: "cn",&lt;br/&gt;                            onSelected: function (date) {&lt;br/&gt;                                element.val(date);&lt;br/&gt;                                $("#CheckOutDate").click();&lt;br/&gt;                                $("#CheckInDate").removeClass();&lt;br/&gt;                                $("#CheckInDate").addClass("time-i sc-w");&lt;br/&gt;                            } .bind(this)&lt;br/&gt;                        });&lt;br/&gt;                        break;&lt;br/&gt;                    case "txtOutDate":&lt;br/&gt;                        var edate = validator.convertDate($("#CheckInDate").val());&lt;br/&gt;                        edate = new Date(edate.setHours(24));&lt;br/&gt;                        edate = validator.reFormatDateString(edate.getFullYear() + "-" + (edate.getMonth() + 1) + "-" + edate.getDate());&lt;br/&gt;                        new CalendarWindow({ eventElement: element, selectedDate: validator.reFormatDateString(edate), language: "cn",&lt;br/&gt;                            enabledFrom: validator.reFormatDateString(edate),&lt;br/&gt;                            onSelected: function (date) {&lt;br/&gt;                                element.val(date);&lt;br/&gt;                                $("#CheckOutDate").removeClass();&lt;br/&gt;                                $("#CheckOutDate").addClass("time-i sc-w");&lt;br/&gt;                            } .bind(this)&lt;br/&gt;                        });&lt;br/&gt;                        break;&lt;br/&gt;                    case "lnkGo2Map":&lt;br/&gt;                        if (!this.searchValid()) {&lt;br/&gt;                            return false;&lt;br/&gt;                        } if ($("#InCityName").get(0).City == null) {&lt;br/&gt;                            $error($("#InCityName"), "没有匹配的城市。");&lt;br/&gt;                            return false;&lt;br/&gt;                        }&lt;br/&gt;                        var cityName = $("#InCityName").get(0).City.CityNameCn;&lt;br/&gt;                        var cityId = $("#InCityName").get(0).City.CityId;&lt;br/&gt;                        var cityNameEn = $("#InCityName").get(0).City.CityNameEn;&lt;br/&gt;                        var checkInDate = $("#CheckInDate")[0].value;&lt;br/&gt;                        var checkOutDate = $("#CheckOutDate")[0].value;&lt;br/&gt;                        var star = $("#Star").val();&lt;br/&gt;                        var price = $("#Price").val();&lt;br/&gt;                        var hotelName = $("#HotelName").val();&lt;br/&gt;                        var arrPrice = price.split(",");&lt;br/&gt;                        var LowPrice = arrPrice[0];&lt;br/&gt;                        var HighPrice = arrPrice[1];&lt;br/&gt;                        if (cityId == "")&lt;br/&gt;                        { $error($("#InCityName"), "没有匹配的城市。"); return false; }&lt;br/&gt;                        var url = this.urlMapTemplate.eval({ cityid: cityId, starlevel: star, lowprice: LowPrice, highprice: HighPrice, startlat: 0, startlng: 0, areaid: 0, endlat: 0, endlng: 0, distance: 5, language: HotelIndexController.Language.toLowerCase(), hotelsort: 1, brandid: 0, pageindex: 1 });&lt;br/&gt;                        this.CreateAndSaveSearchGuid(null); Globals.cookie("ShHotel", "", { InDate: checkInDate, OutDate: checkOutDate, CityNameCN: cityName, CityNameEN: cityNameEn, CityID: cityId }); var hotelStr = ""; hotelStr = hotelStr + "raCityName|" + cityName + ","; hotelStr = hotelStr + "CheckInDate|" + checkInDate + ","; hotelStr = hotelStr + "CheckOutDate|" + checkOutDate; try { this.writeHotelCookie("elong_hotel_cookie", hotelStr, 1); } catch (e) { } if (HotelIndexController.WebCategory != "Online") { $("#lnkGo2Map")[0].href = url; } break; case "Price": $("#Price").css({ color: "#000" }); break; case "Star": $("#Star").css({ color: "#000" }); break; case "btnSearch": if (!this.searchValid()) { return false; } if ($("#InCityName").get(0).City == null) { $error($("#InCityName"), "没有匹配的城市。"); return false; } var cityName = $("#InCityName").get(0).City.CityNameCn; var cityNameEn = $("#InCityName").get(0).City.CityNameEn; var cityId = $("#InCityName").get(0).City.CityId; var checkInDate = $("#CheckInDate")[0].value; var checkOutDate = $("#CheckOutDate")[0].value; var star = $("#Star").val(); var price = $("#Price").val(); var hotelName = $("#HotelName").val(); var arrPrice = price.split(","); var LowPrice = arrPrice[0]; var HighPrice = arrPrice[1]; if (cityId == "") { $error($("#InCityName"), "没有匹配的城市。"); return false; } Globals.cookie("ShHotel", "", { InDate: checkInDate, OutDate: checkOutDate, CityNameCN: cityName, CityNameEN: cityNameEn, CityID: cityId }); this.WaitingProcess(); var url = this.urlTemplate.eval({ language: HotelIndexController.Language.toLowerCase(), cityid: cityId }); if (star != "-1") { url += (url.indexOf("?") != -1 ? "&amp;amp;" : "?") + "starlevel=" + star; } if (HighPrice != "0") { url += (url.indexOf("?") != -1 ? "&amp;amp;" : "?") + "highprice=" + HighPrice; } if (LowPrice != "0") { url += (url.indexOf("?") != -1 ? "&amp;amp;" : "?") + "lowprice=" + LowPrice; } if (HotelIndexController.WebCategory == "Online") { url += (url.indexOf("?") != -1 ? "&amp;amp;" : "?") + "hotelsort=2"; } if (hotelName != "输入酒店部分或全部名称") { url += (url.indexOf("?") != -1 ? "&amp;amp;" : "?") + "q=" + encodeURIComponent(hotelName) + "&amp;amp;qt=9"; } if (window.location.host == "big5.elong.com") { url = "http://big5.elong.com/gate/big5/hotel.elong.com" + url; url += url.indexOf("?") != -1 ? "&amp;amp;isbig5=true" : "?isbig5=true"; } $("#ConditionForm").attr("action", url); $("#ConditionForm").submit(); break;&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;            FindCity: function (cityname, citytype) {&lt;br/&gt;                var cityData; eval("cityData = " + citytype + ";");&lt;br/&gt;                var resultCN = Globals.searchObj("CityNameCn", cityname, cityData);&lt;br/&gt;                if (resultCN.length &amp;gt; 0 &amp;amp;&amp;amp; resultCN[0] != null) {&lt;br/&gt;                    return decodeURIComponent(resultCN[0].CityId);&lt;br/&gt;                }&lt;br/&gt;                var resultEN = Globals.searchObj("CityNameEn", cityname, cityData);&lt;br/&gt;                if (resultEN.length &amp;gt; 0 &amp;amp;&amp;amp; resultEN[0] != null) {&lt;br/&gt;                    return decodeURIComponent(resultEN[0].CityId);&lt;br/&gt;                } return "";&lt;br/&gt;            },&lt;br/&gt;            WaitingProcess: function (a) {&lt;br/&gt;                document.getElementById("divSearch").style.display = "block";&lt;br/&gt;                document.getElementById("ulSearch").style.display = "none";&lt;br/&gt;            },&lt;br/&gt;            daysBetween: function (b, c) {&lt;br/&gt;                var e = b.substring(5, b.lastIndexOf("-"));&lt;br/&gt;                var d = b.substring(b.length, b.lastIndexOf("-") + 1);&lt;br/&gt;                var f = b.substring(0, b.indexOf("-"));&lt;br/&gt;                var h = c.substring(5, c.lastIndexOf("-")); var g = c.substring(c.length, c.lastIndexOf("-") + 1); var i = c.substring(0, c.indexOf("-")); var a = ((Date.parse(e + "/" + d + "/" + f) - Date.parse(h + "/" + g + "/" + i)) / 86400000); return Math.abs(a);&lt;br/&gt;            },&lt;br/&gt;            render: function () {&lt;br/&gt;                var b = Globals.cookie("ShHotel");&lt;br/&gt;                if (b != null &amp;amp;&amp;amp; b != "") {&lt;br/&gt;                    if (Globals.cookie("ShHotel", "CityNameCN") != "" &amp;amp;&amp;amp; b.indexOf("CityNameCN") &amp;gt; 0) {&lt;br/&gt;                        $("#InCityName").val(Globals.cookie("ShHotel", "CityNameCN"));&lt;br/&gt;                        $("#InCityName").attr("cityid", Globals.cookie("ShHotel", "CityID"));&lt;br/&gt;                        $("#InCityName").attr("cityname", Globals.cookie("ShHotel", "CityNameEN"));&lt;br/&gt;                    }&lt;br/&gt;                } else {&lt;br/&gt;                    $("#InCityName").val("北京");&lt;br/&gt;                    $("#InCityName").attr("cityid", "0101");&lt;br/&gt;                    $("#InCityName").attr("cityname", "beijing");&lt;br/&gt;                }&lt;br/&gt;                var a = new CityWindow({ eventElement: $("#InCityName"), cityType: "hotel", lang: "cn", resultNextId: "CheckInDate", onSelect: function (d, c) { } }); &lt;br/&gt;                if (HotelIndexController.Language != "EN") { this.hotelName.HotelSuggest("http://hotel.elong.com/suggest.html", { matchSubset: false, formatItem: function (c) { return c; }, scroll: true, scrollHeight: 300, max: 10, mouseDownOnSelect: true, dataType: "jsonp", delay: 200, submitId: $("#btnSearch"), isSubmit: true, extraParams: { EnCode: "UTF", CityId: function () { return $("#InCityName").get(0).City.CityId; } } }); }&lt;br/&gt;            },&lt;br/&gt;            onCityNameChange: function () { },&lt;br/&gt;            searchValid: function () {&lt;br/&gt;                if (!validator.valid($("#InCityName").val(), "notEmpty &amp;amp; nonSpecialSign")) {&lt;br/&gt;                    $error($("#InCityName"), "请输入城市名称，且不可包含*&amp;amp;+等符号及阿拉伯数字。"); return false;&lt;br/&gt;                } if (!validator.valid($("#CheckInDate").val(), "notEmpty &amp;amp; date")) { $error($("#CheckInDate"), "请输入有效的入住日期。"); return false; }&lt;br/&gt;                if (!validator.valid($("#CheckOutDate").val(), "notEmpty &amp;amp; date")) { $error($("#CheckOutDate"), "请输入有效的离店日期。"); return false; }&lt;br/&gt;                var g = new Date(); var h = validator.reFormatDateString(g.getFullYear() + "-" + (g.getMonth() + 1) + "-" + g.getDate());&lt;br/&gt;                var i = $("#CheckInDate").val();&lt;br/&gt;                var f = $("#CheckOutDate").val();&lt;br/&gt;                var e = validator.reFormatDateString(i);&lt;br/&gt;                var d = validator.reFormatDateString(f);&lt;br/&gt;                if (e &amp;lt; h) {&lt;br/&gt;                    $error($("#CheckInDate"), "入住日期须晚于或者等于当天日期。");&lt;br/&gt;                    return false;&lt;br/&gt;                } if (d &amp;lt; h) { $error($("#CheckOutDate"), "离店日期须晚于或者等于当天日期。"); return false; }&lt;br/&gt;                      var c = validator.convertDate(e); c = new Date(c.setHours(24)); if (!validator.valid($("#CheckOutDate").val(), "notEmpty &amp;amp; dateRange", validator.getDateString(c), null)) { $error($("#CheckOutDate"), "离店日期须至少晚于入住日期1天。"); return false; } var a = this.daysBetween(e, validator.reFormatDateString(new Date().getFullYear() + "-" + (new Date().getMonth() + 1) + "-" + new Date().getDate())); if (a &amp;gt; this.afterDays) { $error($("#CheckInDate"), "如果您需要预订" + e + "的酒店，请致电：" + HotelIndexController.WebTelAndNo + "，我们会竭诚为您服务。"); return false; } var b = this.daysBetween(e, d); if (b &amp;gt; this.inDays) { $error($("#CheckOutDate"), "如果您需要在酒店入住" + this.inDays + "天以上，请致电：" + HotelIndexController.WebTelAndNo + "，我们会竭诚为您服务。"); return false; } return true; },&lt;br/&gt;            dispose: function () {&lt;br/&gt;                this.destroyEvent();&lt;br/&gt;                this.destroyDOM();&lt;br/&gt;            }&lt;br/&gt;        });&lt;br/&gt;        var client = null;&lt;br/&gt;        $ready(function () {&lt;br/&gt;            client = new IndexClient();&lt;br/&gt;        });&lt;br/&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2093901.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/06/30/2093901.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuyong/archive/2011/06/29/2093892.html</id><title type="text">转 SQL Server 备份和还原全攻略</title><summary type="text">一、知识点完全备份： 备份全部选中的文件夹，并不依赖文件的存档属性来确定备份那些文件。（在备份过程中，任何现有的标记都被清除，每个文件都被标记为已备份，换言之，清除存档属性）。完全备份也叫完整备份。差异备份： 差异备份是针对完全备份：备份上一次的完全备份后发生变化的所有文件。（差异备份过程中，只备份有标记的那些选中的文件和文件夹。它不清除标记，即：备份后不标记为已备份文件，换言之，不清除存档属性）。增量备份： 增量备份是针对于上一次备份（无论是哪种备份）：备份上一次备份后，所有发生变化的文件。（增量备份过程中，只备份有标记的选中的文件和文件夹，它清除标记，即：备份后标记文件，换言之，清除存档属</summary><published>2011-06-29T15:55:00Z</published><updated>2011-06-29T15:55:00Z</updated><author><name>jackyong</name><uri>http://www.cnblogs.com/liuyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuyong/archive/2011/06/29/2093892.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuyong/archive/2011/06/29/2093892.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;一、&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;知识点&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;完全备份： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;备份全部选中的文件夹，并不依赖文件的存档属性来确定备份那些文件。（在备份过程中，任何现有的标记都被清除，每个文件都被标记为已备份，换言之，清除存档属性）。完全备份也叫完整备份。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;差异备份： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;差异备份是针对完全备份：备份上一次的完全备份后发生变化的所有文件。（差异备份过程中，只备份有标记的那些选中的文件和文件夹。它不清除标记，即：备份后不标记为已备份文件，换言之，不清除存档属性）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;增量备份： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;增量备份是针对于上一次备份（无论是哪种备份）：备份上一次备份后，所有发生变化的文件。（增量备份过程中，只备份有标记的选中的文件和文件夹，它清除标记，即：备份后标记文件，换言之，清除存档属性。）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;事务日志备份： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;在特定事务日志备份之前执行的完整数据库备份和上次差异备份（如果有）。在完整数据库备份之后执行的所有事务日志备份或在特定事务日志备份之前执行的差异备份（如果您还原了差异备份）。如果你设置了恢复模式为【简单】，你将无法使用【事务日志】备份。SQL Server 2000 和 SQL Server 2005： 创建事务日志备份，您必须使用完整恢复或大容量日志记录恢复模型。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;部分备份： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;通过指定 READ_WRITE_FILEGROUPS 创建的备份称为&amp;ldquo;部分备份&amp;rdquo;。在简单恢复模式下，只允许对只读文件组执行文件组备份。还原的数据备份类型：数据库备份、部分备份或文件备份。对于数据库备份或部分备份，日志备份序列必须从数据库备份或部分备份的结尾处开始延续。对于一组文件备份，日志备份序列必须从整组文件备份的开头开始延续。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;文件备份： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;&amp;ldquo;文件备份&amp;rdquo;包含一个或多个文件（或文件组）中的所有数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;日志链： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;连续的日志备份序列称为&amp;ldquo;日志链&amp;rdquo;。日志链从数据库的完整备份开始。通常，仅当第一次备份数据库时，或者将恢复模式从简单恢复模式切换到完整恢复模式或大容量日志恢复模式之后，才会开始一个新的日志链。除非在创建完整数据库备份时选择覆盖现有备份集，否则现有的日志链将保持不变。在该日志链保持不变的情况下，便可从媒体集中的任何完整数据库备份还原数据库，然后再还原相应恢复点之前的所有后续日志备份。&lt;strong&gt;恢复点&lt;/strong&gt;可以是上次日志备份的结尾，也可以是任何日志备份中的特定恢复点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;一个备份方案例子： &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;某个站点在星期天晚上执行完整数据库备份。在白天每隔 4 小时制作一个事务日志备份集，并用当天的备份重写头一天的备份。每晚则进行差异备份。如果数据库的某个数据磁盘在星期四上午 9:12 出现故障，则该站点可以：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;1)&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;备份当前事务日志；（已经出现故障了，如何备份当前事务日志？）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;2)&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原从星期天晚上开始的数据库备份；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;3)&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原从星期三晚上开始的差异备份，将数据库前滚到这一时刻；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;4)&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原从早上 4 点到 8 点的事务日志备份，以将数据库前滚到早上 8 点；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;5)&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原故障之后的日志备份。这将使数据库前滚到故障发生的那一刻。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;二、&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原步骤&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;创建一个叫TestBackup的数据库，创建一张叫Table1的表，这个时候进行一次完整备份，备份文件为：TestBackupDB-full.bak；接着创建表Table2后进行差异备份，备份文件为：TestBackupDB-diff.bak；接着创建表Table3后进行事务日志备份（如果数据库设置了恢复模式为【简单】，那么在备份类型选项中将看不到【事务日志】），备份文件为：TestBackupDB-log.bak；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;创建一个叫TestBackup2的数据库，用于测试TestBackup数据库的备份文件的还原。 &lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img height="275" width="216" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup1.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图1：创建库结构）&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup2.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图2：备份类型）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;下面我们就可以对三个备份文件：TestBackupDB-full.bak、TestBackupDB-diff.bak、TestBackupDB-log.bak进行还原：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;步骤1：&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原完整备份文件TestBackupDB-full.bak，选项如图4、图5所示，还原成功后数据列表就会如图6所示，这是因为恢复状态选项：&lt;strong&gt;不对数据库执行任何操作，不回滚未提交的事务。可以还原其他事务日志。(RESTORE WITH NORECOVERY)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img height="185" width="456" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup3_0.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图3：进入SSMS还原）&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img height="278" width="476" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup3_1.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图4：还原常规）&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img height="490" width="612" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup4.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图5：还原选项）&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup5.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图6：完整备份还原）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;步骤2：&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原差异备份文件TestBackupDB-diff.bak，操作如步骤1所示，这个时候的数据库还是跟图6的状态一样的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; background: #d9d9d9;"&gt;步骤3：&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;还原事务日志备份文件TestBackupDB-log.bak，如图7进入事务日志的还原操作界面；看图8的选项中有指定事务的时间进行还原（还原过程中的恢复状态都是默认为RESTORE WITH RECOVERY，所以这里没有提及这个选项）。还原后的TestBackup2数据库，还原之后的数据库TestBackup2如图9所示。&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img height="185" width="455" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup7.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图7：进入事务日志）&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img height="436" width="644" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup8.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图8：事务日志）&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;img height="213" width="211" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Backup9.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图9：还原后的数据库）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;三、&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;升级&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;通常来说文章写到这里就应该结束了，但是很幸运，再给你介绍一下如何在对表进行分区后的还原操作，从上面的操作来看只包括了mdf和ldf文件，但如果多了几个ndf文件，这些还原又一样吗？所以我称这部分的内容为升级。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;情景一：如果本来就有对应的分区文件的，只要在还原的时候修改【还原为】的文件名就可以进行还原了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;情景二：如果刚刚新建了分区文件组和文件，这个时候接着还原备份就会出现图10的错误（不知道是不是在SQL Server 2005的问题）；要解决这个问题有两个方法，第一个：重启数据库服务再还原；第二个：设置数据库的【限制访问】设置为【Single】；&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center; text-indent: 21pt;"&gt;&lt;span face="微软雅黑, sans-serif" class="Apple" style="font-family: 微软雅黑, sans-serif;"&gt;&lt;div align="center"&gt;&lt;img height="165" width="605" src="http://images.cnblogs.com/cnblogs_com/gaizai/%E5%A4%87%E4%BB%BD%E8%BF%98%E5%8E%9F/Partition2.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center" style="text-align: center; text-indent: 21pt;"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;（图10：错误）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;四、&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;参考文献&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://topic.csdn.net/u/20081219/09/58d66bd7-7688-47cc-8892-d4b4304cb843.html"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;SQL SERVER&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;数据的差异备份如何还原&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms190440.aspx"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;&lt;span&gt;使用事务日志备份&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://space.itpub.net/?uid-16436858-action-viewspace-itemid-541412"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;SQL Server 2008&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;事务日志备份工作原理&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms190203.aspx"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;&lt;span&gt;有关从完整恢复模式或大容量日志恢复模式切换的注意事项&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://technet.microsoft.com/zh-cn/library/ms189621(SQL.90).aspx"&gt;&lt;span style="font-family: '微软雅黑','sans-serif';"&gt;&lt;span&gt;备份和还原操作指南主题&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="MySignature"&gt;&lt;p&gt;-------------------华丽分割线------------------- &lt;/p&gt;&lt;div&gt;作者：&lt;a target="_blank" href="http://gaizai.cnblogs.com/"&gt;听风吹雨&lt;/a&gt;&lt;/div&gt;&lt;div&gt;出处：&lt;a target="_blank" href="http://gaizai.cnblogs.com/"&gt;http://gaizai.cnblogs.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;版权：本文版权归作者和博客园共有&lt;/div&gt;&lt;div&gt;转载：欢迎转载，不过记得留下买路钱&lt;/div&gt;&lt;div&gt;Blog：&lt;a target="_blank" href="http://gaizai.i170.com/"&gt;http://gaizai.i170.com/&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;创建测试数据库&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;将测试数据库的恢复模式设置为FULL&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ALTER&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test &lt;br /&gt;&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; RECOVERY &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FULL&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;USE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;TABLE&lt;/span&gt;&lt;span style="color: #000000;"&gt; tb(id &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;,col &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;varchar&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;完整备份数据库&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;BACKUP&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;TO&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DISK&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;G:\Test.bak&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WITH&lt;/span&gt;&lt;span style="color: #000000;"&gt; FORMAT&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;对tb表插入第一条记录&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;INSERT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;INTO&lt;/span&gt;&lt;span style="color: #000000;"&gt; tb(id,col) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;VALUES&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&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: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;第一次差异备份&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;BACKUP&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;TO&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DISK&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;G:\Test_One_Dif.bak&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WITH&lt;/span&gt;&lt;span style="color: #000000;"&gt; FORMAT,DIFFERENTIAL&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;对tb表插入第二条记录&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;INSERT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;INTO&lt;/span&gt;&lt;span style="color: #000000;"&gt; tb(id,col) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;VALUES&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&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: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;第二次差异备份&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;BACKUP&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;TO&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DISK&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;G:\Test_Two_Dif.bak&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WITH&lt;/span&gt;&lt;span style="color: #000000;"&gt; FORMAT,DIFFERENTIAL&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;OK.现在直接还原.完整备份+第二次差异备份.看看第二条记录在不在.&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;USE&lt;/span&gt;&lt;span style="color: #000000;"&gt; tempdb&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;完整备份还原&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;RESTORE&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DISK&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;G:\Test.bak&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WITH&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;REPLACE&lt;/span&gt;&lt;span style="color: #000000;"&gt;,NORECOVERY&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;第二次差异备份还原&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;RESTORE&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DISK&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;G:\Test_Two_Dif.bak&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WITH&lt;/span&gt;&lt;span style="color: #000000;"&gt; RECOVERY&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;USE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; tb&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;USE&lt;/span&gt;&lt;span style="color: #000000;"&gt; tempdb&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;GO&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;删除测试数据库&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DROP&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DATABASE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/liuyong/aggbug/2093892.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuyong/archive/2011/06/29/2093892.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
