<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[柠檬居IT技术网]]></title>
  <subtitle type="html"><![CDATA[分享最前卫最时尚的技术！- http://www.nmju.net]]></subtitle>
  <id>http://www.nmju.net/</id>
  <link rel="alternate" type="text/html" href="http://www.nmju.net/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.nmju.net/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2008-10-08T11:33:30+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[最新URL重写可行性解决办法]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=3" label="C#/ASP.NET" /> 
	  <updated>2008-10-08T11:33:30+08:00</updated>
	  <published>2008-10-08T11:33:30+08:00</published>
		  <summary type="html"><![CDATA[<p><br />
<strong>使用组件的URL重写在前文已经说明过了，可以参阅下面的链接<br />
</strong><a href="http://www.nmju.net/article.asp?id=51"><strong>http://www.nmju.net/article.asp?id=51</strong></a></p>
<p><strong>如何隐藏重写后的真实路径，请参阅下文<br />
</strong><a href="http://www.nmju.net/article.asp?id=72"><strong>http://www.nmju.net/article.asp?id=72</strong></a></p>
<p>--------------------------------------------------------<br />
好，进入整体，这里我们介绍一种不依靠重写组件，而让我们的项目进行URl重写<br />
我的开发环境是VS2005_SP1<br />
首先，在应用程序中新建一个XML文件，文件内容为：文件名ReWriter.config<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;</p>
<p>&lt;ReWriterUrls&gt;</p>
<p>&lt;rule&gt;</p>
<p>&lt;old&gt;(.*)/News/(\d{4})/Default\.aspx&lt;/old&gt;</p>
<p>&lt;new&gt;../../Default.aspx?id=$2&amp;amp;type=$3&lt;/new&gt;</p>
<p>&lt;/rule&gt;</p>
<p>&lt;/ReWriterUrls&gt;</p>
<p>&nbsp;</p>
<p><br />
然后我们要在全局配置文件Global.asax里面加入下面两段代码：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp; //重写用<br />
&nbsp;&nbsp;&nbsp; void Application_BeginRequest(Object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string path = Server.MapPath(&quot;~/ReWriter.config&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XPath.XPathDocument myXPathDocument = new System.Xml.XPath.XPathDocument(path);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XPath.XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XPath.XPathNodeIterator myXPathNodeIterator = myXPathNavigator.Select(&quot;//rule&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Text.RegularExpressions.Regex oreg;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ReWriteUrl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (myXPathNodeIterator.MoveNext())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //oReg=new Regex(oNode.SelectSingleNode(&quot;url/text()&quot;).Value);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XPath.XPathNavigator nav2 = myXPathNodeIterator.Current.Clone();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string oldString = &quot;&quot;, newString = &quot;&quot;;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XPath.XPathNodeIterator it2 = nav2.Select(&quot;old&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (it2.MoveNext())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oldString = it2.Current.Value;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it2 = nav2.Select(&quot;new&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (it2.MoveNext())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newString = it2.Current.Value;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oldString != &quot;&quot; &amp;&amp; newString != &quot;&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不区分大小写<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oreg = new System.Text.RegularExpressions.Regex(oldString, RegexOptions.IgnoreCase);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //区分大小写<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; oreg = new System.Text.RegularExpressions.Regex(oldString);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oReg.IsMatch(Request.Url.ToString()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReWriteUrl = oreg.Replace(Request.Url.ToString(), newString);</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;&nbsp;&nbsp;&nbsp; #region --------------给重写后的页面取参数使用---------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oreg = new System.Text.RegularExpressions.Regex(@&quot;(\?)&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MatchCollection mc = oreg.Matches(ReWriteUrl);</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mc.Count &gt; 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReWriteUrl = System.Text.RegularExpressions.Regex.Replace(ReWriteUrl, @&quot;(.*\?.*)(\?)(.*)&quot;, &quot;$1&amp;$3&quot;);</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #region -------------- 另一种重命名后的解析方式（目前作废）----------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //static void Main(string[] args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string s = &quot;<a href="http://abc.com/test.aspx?a=1&amp;b=1&amp;c=1?d=1">http://abc.com/test.aspx?a=1&amp;b=1&amp;c=1?d=1</a>&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Regex reg = new Regex(@&quot;^(.+?)([\?][^\?]+)$&quot;, RegexOptions.IgnoreCase);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MatchCollection m = reg.Matches(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(m[0].Groups[1] + m[0].Groups[2].Value.Replace('?', '&amp;'));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpContext.Current.RewritePath(ReWriteUrl);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; void Application_EndRequest(Object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>-----------------------------------------------------------<br />
值得注意的一个地方是：<br />
<strong>&nbsp; oreg = new System.Text.RegularExpressions.Regex(@&quot;(\?)&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MatchCollection mc = oreg.Matches(ReWriteUrl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mc.Count &gt; 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReWriteUrl = System.Text.RegularExpressions.Regex.Replace(ReWriteUrl, @&quot;(.*\?.*)(\?)(.*)&quot;, &quot;$1&amp;$3&quot;);</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</strong><br />
----------------------------------------------------------<br />
这里需要说明一下<br />
假设，我有一个网址需要重写：<br />
<a href="http://nmju.net/test.aspx?a=a1&amp;b=b1&amp;c=c1">http://nmju.net/test.aspx?a=a1&amp;b=b1&amp;c=c1</a><br />
那么在规则设定过后，我重写的结果是：<br />
<a href="http://nmju.net/test_a1_b1_c1.aspx">http://nmju.net/test_a1_b1_c1.aspx</a><br />
而在程序操作过程中，我又需要加入一个参数，而这个参数是可有可无，或者是参数值已经被Server.UrlEncode()编码了的，那这个参数肯定无法存放在正则规则里面，也就是放在重写里面进行，而需要变成这样：<br />
<a href="http://nmju.net/test_a1_b1_c1.aspx?key=%a9c%c9%aa%cc">http://nmju.net/test_a1_b1_c1.aspx?key=%a9c%c9%aa%cc</a><br />
那么，当没有我最顶上突出注意的那一块程序的话，重写解析系统会把这个地址解析为：<br />
<a href="http://nmju.net/test.aspx?a=a1&amp;b=b1&amp;c=c1?key=%a9c%c9%aa%cc">http://nmju.net/test.aspx?a=a1&amp;b=b1&amp;c=c1?key=%a9c%c9%aa%cc</a><br />
两个问好肯定无法提取数据的<br />
所以才有了那一段二次分析的正则程序</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=104" /> 
	  <id>http://www.nmju.net/default.asp?id=104</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[从实施CMM-3再看CMM—CMM学习心得]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-10-05T18:22:08+08:00</updated>
	  <published>2008-10-05T18:22:08+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;<a onclick="javascript:tagshow(event, 'CMM');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">CMM</font></strong></u></a>三级认证；在进行基于CMM过程改进<a onclick="javascript:tagshow(event, '%B9%FD%B3%CC');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">过程</font></strong></u></a>中，自己对CMM有了一些心得、体会，总结如下希望大家指正。如果有意见请发邮件到: heqingemail@163.net<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>CMM是优雅的</strong><br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;CMM将<a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">管理</font></strong></u></a>理论和<a onclick="javascript:tagshow(event, '%C8%ED%BC%FE');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">软件</font></strong></u></a><a onclick="javascript:tagshow(event, '%CA%B5%BC%F9');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">实践</font></strong></u></a>紧密结合，但是整个结构又如此清晰完整；是一个完美的结构，这个结构是美的，是一种强大、庄重的理论美。<br />
&nbsp;&nbsp;&nbsp;&nbsp;这个完美的分段式结构在CMMI中继续采用，并且更加精致和完善。<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM的结构主要包括如下几部分。<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="16%" bgcolor="#c0c0c0"><b>
            <p align="center">结构</p>
            </b></td>
            <td class="hui14" valign="top" width="84%" bgcolor="#c0c0c0"><b>
            <p align="center">说明</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">等级</td>
            <td class="hui14" valign="top" width="84%">CMM划分为五个等级，描述了每个等级的组织过程特征，每个等级代表一种组织的过程能力等级；指明了组织级过程改进的整体策略（关注于那些过程域）</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">关键过程域</td>
            <td class="hui14" valign="top" width="84%"><clk></clk>每个等级包括几个过程域，说明了在一个等级中必要的过程；是一组学科或者逻辑上紧密联系的活动的集合</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">目标</td>
            <td class="hui14" valign="top" width="84%">每个过程域均有自己的目标，这些目标用于支持过程能力等级特征</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">关键实践</td>
            <td class="hui14" valign="top" width="84%">组成一个过程域的活动，从逻辑上描述了<a onclick="javascript:tagshow(event, '%CA%B5%CF%D6');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">实现</font></strong></u></a>这个过程域目标必须或者推荐执行的活动；属于具体的操作指导</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">公共特性</td>
            <td class="hui14" valign="top" width="84%">关键实践按照公共特性被组织起来，这些公共特性反映了过程有效执行的特征</td>
        </tr>
    </tbody>
</table>
<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;除第一级外，CMM的每一级是按完全相同的结构构成的。每一个成熟度等级都是通过一些(2&mdash;7个)关键过程域（KPA）描述的，每一个关键过程域都规定了一些目标，过程必须吻合这些目标以满足这个关键过程域。这些关键过程域规定了一些重要领域，机构应该关注以使它的过程向成熟等级发展。从整体来说软件能力成熟度级别从低到高的变化代表了企业的生产活动由高风险低效率到高<a onclick="javascript:tagshow(event, '%D6%CA%C1%BF');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">质量</font></strong></u></a>、高生产率的进展。 整个CMM模型通过等级、关键过程域、公共特性和过程改进理论联系起来；通过关键过程域、关键实践和具体实践联系起来，提供具体的说明和指导。<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面对CMM结构的各个组成部分分别进行说明。<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;CMM的等级划分</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;Crosby(克罗斯比)最早在《质量是免费》中提出了管理过程等级的划分，也是为五级。<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM基于全面质量管理的理论，参照当时软件工程的实践将过程能力划分为五个等级，用于评估一个软件组织的过程成熟度。<br />
&nbsp;&nbsp;&nbsp;&nbsp;每个成熟度等级说明了组织软件<a onclick="javascript:tagshow(event, '%BF%AA%B7%A2');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">开发</font></strong></u></a>过程的特征，如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="12%" bgcolor="#c0c0c0"><b>
            <p align="center">等级</p>
            </b></td>
            <td class="hui14" valign="top" width="88%" bgcolor="#c0c0c0"><b>
            <p align="center">等级特征</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级一</td>
            <td class="hui14" valign="top" width="88%"><clk></clk>没有一系列的准则来指导<a onclick="javascript:tagshow(event, '%CF%EE%C4%BF');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">项目</font></strong></u></a>的执行，一个项目的结果主要取决于依靠编程组和项目负责人的能力，因此，其结果是难于预料的</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级二</td>
            <td class="hui14" valign="top" width="88%">有纪律的，可以重复以前项目的成功经验，实现部分的可视性</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级三</td>
            <td class="hui14" valign="top" width="88%">项目活动是标准和一致的，不同项目采用相同的标准，从而保持稳定的<a onclick="javascript:tagshow(event, '%D0%D4%C4%DC');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">性能</font></strong></u></a></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级四</td>
            <td class="hui14" valign="top" width="88%">对过程建立了度量，性能只在一定范围内变动，从而可以进行有效的预测</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级五</td>
            <td class="hui14" valign="top" width="88%">为了提高过程能力不断进行改进活动，并可以度量其结果</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;过程能力描述如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="26%" bgcolor="#c0c0c0" height="31">
            <div align="center"><b>管理内容<br />
            能力等级</b></div>
            </td>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center"><a onclick="javascript:tagshow(event, '%CF%EE%C4%BF%B9%DC%C0%ED');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">项目管理</font></strong></u></a></p>
            </b></td>
            <td class="hui14" valign="top" width="21%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">组织过程管理</p>
            </b></td>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">定量管理</p>
            </b></td>
            <td class="hui14" valign="top" width="19%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">不断改进</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级一：初始</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="21%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级二：可重复</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级三：已定义</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级四：定量管理</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级五：不断改进</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="19%" bgcolor="#ff0000">　</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;关键过程域（KPA） SEI根据实践经验确认关键的软件工程领域，这些过程域作为软件生产活动的关键部分被选择出来，是评价和形成过程能力的主要方面。<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;可以将这些关键过程域归为三类：管理过程、组织过程、工程过程。其中管理过程包括项目管理的内容以及一些基础内容。<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="14%" bgcolor="#c0c0c0"><b>
            <p align="center">类别</p>
            </b></td>
            <td class="hui14" valign="top" width="86%" bgcolor="#c0c0c0"><b>
            <p align="center">过程域</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%" rowspan="2">
            <p align="center">管理过程</p>
            </td>
            <td class="hui14" valign="top" width="86%">项目管理：<a onclick="javascript:tagshow(event, '%D0%E8%C7%F3');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">需求</font></strong></u></a>管理、软件项目策划、软件项目跟踪和监督、软件子合同管理、<br />
            集成软件管理、组间协调、定量过程管理</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="86%">支持：软件<a onclick="javascript:tagshow(event, '%C5%E4%D6%C3%B9%DC%C0%ED');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">配置管理</font></strong></u></a>、软件质量保证</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">组织过程</td>
            <td class="hui14" valign="top" width="86%">
            <p>组织过程焦点、组织过程定义、培训大纲、定量过程管理</p>
            <p><clk></clk><a onclick="javascript:tagshow(event, '%BC%BC%CA%F5');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">技术</font></strong></u></a>变革管理、过程变更管理</p>
            </td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">工程过程</td>
            <td class="hui14" valign="top" width="86%">软件产品工程、同行评审、软件质量管理、缺陷预防</td>
        </tr>
    </tbody>
</table>
<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;目标</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;每个关键过程域包括两个或者四个的目标；这些目标用于描述这个关键过程域的意义和价值，是对过程进行评价和改进的标准；在某个等级上所有关键过程域的目标集合构成了这个等级的特征；每个目标均有一组关键实践用于实现这个目标，可以说目标是关键实践的选择依据，作为评估标准具有如下作用：<br />
目标用来确定一个机构或项目组是否有效地执行了该KPA<br />
&nbsp;&nbsp;&nbsp;&nbsp;目标概述了该KPA包括的关键实践（KP）<br />
&nbsp;&nbsp;&nbsp;&nbsp;在为适应关键实践而采取选择时，目标能用来确定这种适应是否有效<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>公共特性</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;五个公共特性：方针、能力、活动、测量、验证<br />
&nbsp;&nbsp;&nbsp;&nbsp;这是企业管理的五个主要环节；一个好的管理要建立大政&ldquo;方针&rdquo;的明确承诺和要求、要提供必要的资源和&ldquo;能力&rdquo;，这样才能进行必要的&ldquo;活动&rdquo;，要&ldquo;验证&rdquo;活动被执行（类似于QA），要对活动进行&ldquo;测量&rdquo;保证了解活动的情况和质量（类似于QC）。<br />
<br />
<img title="点击图片可在新窗口打开" height="424" src="http://www.testage.net/attachments/2008/03/31427_200803271133461.gif" width="551" style="cursor: pointer" alt="" /><br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="14%" bgcolor="#c0c0c0"><b>
            <p align="center">公共特性</p>
            </b></td>
            <td class="hui14" valign="top" width="15%" bgcolor="#c0c0c0"><b>
            <p align="center">中文</p>
            </b></td>
            <td class="hui14" valign="top" width="71%" bgcolor="#c0c0c0"><b>
            <p align="center">说明</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">CO</td>
            <td class="hui14" valign="top" width="15%">执行承诺</td>
            <td class="hui14" valign="top" width="71%">要怎样？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">AB</td>
            <td class="hui14" valign="top" width="15%">能力</td>
            <td class="hui14" valign="top" width="71%">能做到吗？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">AC</td>
            <td class="hui14" valign="top" width="15%">活动</td>
            <td class="hui14" valign="top" width="71%">做什么？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">VE</td>
            <td class="hui14" valign="top" width="15%">验证</td>
            <td class="hui14" valign="top" width="71%">做了没有？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">ME</td>
            <td class="hui14" valign="top" width="15%">测量</td>
            <td class="hui14" valign="top" width="71%">做的怎样？</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;这些公共特性反映了一个过程被执行的各种要素，关键实践按照这样分类非常有利于具体的<a onclick="javascript:tagshow(event, '%CA%B5%CA%A9');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">实施</font></strong></u></a>。 执行承诺：实施保证是企业为了建立和实施相应KPA所必须采取的行动，这些行动主要牵涉到企业范围的政策和高层管理的责任。<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;能力：实施能力描述为了使某软件过程得以始终如一地执行的必须在项目或企业中存在的先决条件，是企业实施KPA的前提条件。企业必须采取措施，在满足了这些条件后，才有可能执行KPA的实践活动。实施能力关注于<a onclick="javascript:tagshow(event, '%CF%EE%C4%BF%BC%C6%BB%AE');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">项目计划</font></strong></u></a>的实践；资源的配置；责任的布置与授权；以及各种有关的培训等，这些都是为了执行这个关键过程域的活动而对特定人以及作为整体的机构的能力开发起非常重要作用的事务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;活动：实现某个关键过程域所必需的岗位、活动（按照计划或按照规程活动）、产品等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;验证：监督管理过程的活动，一般包括高级管理者、项目经理、SQA的进度管理<br />
&nbsp;&nbsp;&nbsp;&nbsp;测量：说明这个过程活动的状态和质量的信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>关键实践 （KP）</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;在关键过程域的目标之下，有一组相关联的关键实践（Key Practices），这些关键实践是评价一个组织过程能力的某种指示器，可以基本等价的说明过程能力。<br />
&nbsp;&nbsp;&nbsp;&nbsp;一个过程域的所有关键实践按照公共特性组织起来；这些关键实践一般情况下是达到目标所必要的；因为CMM是作为评估标准出现的，所以是&ldquo;必要&rdquo;的才能保证评估的标准。子实践和说明中，罗列了较多的推荐的最佳实践。<br />
&nbsp;&nbsp;&nbsp;&nbsp;关键实践的几个特点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;描述了对有效执行和制度化该KPA起主要作用的从属活动和基础构造<br />
&nbsp;&nbsp;&nbsp;&nbsp;因为CMM是作为评估标准出现的，所以规定做什么，而不去规定如何实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;实现该KPA的目标所允许做的实践活动<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>基于过程模型(CMM)的改进</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>CMM模型的过程改进价值</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;过程改进是从全面质量管理理论中派生出来的；基础是建立稳定的过程、<a onclick="javascript:tagshow(event, '%B7%D6%CE%F6');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">分析</font></strong></u></a>过程、改进过程；目标是增进过程效率和过程质量；通过过程度量的手段（统计过程控制），来量化过程、进行控制，进行预测。<br />
CMM的<a onclick="javascript:tagshow(event, '%BF%F2%BC%DC');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">框架</font></strong></u></a>结构具有双重属性。一方面，它是描述性的模型，这点可以从它对那些当一个企业处于某一个特定的能力成熟度级别时所要求具备的必不可少的各种特性的描述看出。另一方面，它又是指示性的模型，这点可以从它以详细的实践活动来说明一个正在执行政府大规模软件合同的企业在处于某一个特定的能力成熟度级别时的特征的表达方式看出来。 CMM这种双重属性的目的是要有意的使它处于一个适当的抽象程度，从而避免不适当地限制一个企业如何去改进它的软件过程。CMM只描述软件过程改进要进行哪些方面的行动，要满足那些目标，但却不指定具体怎样去做。尽管软件机构可以用不同的方式实现CMM。但是要将CMM的提出的特性与软件开发中现有的过程联系起来是相当困难的。我们在使用CMM时必须牢记这个特点：CMM只指明要做什么，但不规定如何去做。因此我们可以选用我们认为最适当的办法去完成所要求做的事。<br />
过程模型集合了领域内必要实践、补充了最佳实践，并指明了改进的先后顺序。所以可以认为CMM对过程改进提供了足够的支持和帮助<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>过程改进路径说明</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;首先分析各个等级之间的差距和区别，然后明确向更高等级改进的主要方面，并结合CMM的关键过程域就可以得到过程改进的基本路径了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;过程能力描述如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="27%" bgcolor="#c0c0c0" height="31">
            <div align="center"><b>管理内容<br />
            能力等级</b></div>
            </td>
            <td class="hui14" valign="top" width="18%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">项目管理</p>
            </b></td>
            <td class="hui14" valign="top" width="20%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">组织过程管理</p>
            </b></td>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">定量管理</p>
            </b></td>
            <td class="hui14" valign="top" width="18%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">不断改进</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级一：初始</td>
            <td class="hui14" valign="top" width="18%">　</td>
            <td class="hui14" valign="top" width="20%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级二：可重复</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级三：已定义</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级四：定量管理</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级五：不断改进</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;从上图，可以发现各个等级之间的差距，差距汇总如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0"><b>
            <p align="center">路径</p>
            </b></td>
            <td class="hui14" valign="top" width="83%" bgcolor="#c0c0c0"><b>
            <p align="center">说明</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">一级到二级</td>
            <td class="hui14" valign="top" width="83%">加强项目管理，实施支持过程</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">二级到三级</td>
            <td class="hui14" valign="top" width="83%">根据项目管理的经验，建立、稳定组织标准过程</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">三级到四级</td>
            <td class="hui14" valign="top" width="83%">在标准过程基础上建立针对性的度量体系；度量、稳定过程性能</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">四级到五级</td>
            <td class="hui14" valign="top" width="83%">根据度量的结果进行不断的改进</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;可以看出为什么基于CMM的过程改进不能跨级进行，因为他们是依赖上一个等级的。尤其要避免的一种情况，就是跨域等级二，很多企业已开始就致力于组织级过程的建立，这个是比较危险的；软件生产主要还是一种项目，没有建立良好的项目管理基础，没有从项目中有效的积累经验，这样的改进容易失败。<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;广泛实施，成功<a onclick="javascript:tagshow(event, '%D3%A6%D3%C3');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">应用</font></strong></u></a></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;作为美国国防部（BOB）评估软件供应商的标准，作用显著。<br />
&nbsp;&nbsp;&nbsp;&nbsp;后来发现标准本身所明确的要求也是企业进行改进的良好指南。<br />
&nbsp;&nbsp;&nbsp;&nbsp;标准一旦可被确定，那么标准本身也就是进行改进的指南。<br />
&nbsp;&nbsp;&nbsp;&nbsp;作为过程改进的指南发挥更加广泛用途，影响深远。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>理解CMM需要注意以下问题</strong>　<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;它仅指明该做什么，而没有指明如何做，它不是<a onclick="javascript:tagshow(event, '%B7%BD%B7%A8');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">方法</font></strong></u></a>论，但我们在学习CMM时，可以从中学到分析问题的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;它仅指明该做的关键内容，仅描述软件过程的本质属性，而并非面面俱到。抓问题的主要方面的思想贯穿在整个CMM模型中<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;软件过程是指软件工程过程、软件管理过程和软件组织过程三者的有机结合。软件工程过程是我们理解的常规的软件的需求分析、<a onclick="javascript:tagshow(event, '%C9%E8%BC%C6');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">设计</font></strong></u></a>、编码、<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">测试</font></strong></u></a>等过程;软件管理过程是指为使软件工程过程顺利进行而实施的管理活动的集合。上述两个过程是以软件工程组为主的活动。软件组织的过程是企业级的对软件的组织活动,是以企业为主的活动<br />
&nbsp;&nbsp;&nbsp;&nbsp;它是从软件过程的角度考虑问题，而并非关注软件开发<a onclick="javascript:tagshow(event, '%B9%A4%BE%DF');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">工具</font></strong></u></a>,与框架软件生存周期无关，也与所采用的开发技术无关<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM为改善整个企业的软件过程提供了指南，而并非针对某个具体项目。CMM并不能保证在这个过程框架下，产品开发百分之百的成功。产品的成功是多种因素的组合，例如市场等因素<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM1.1是针对大型软件企业(500人以上)的，对小型的软件企业(50人以下)需要裁减<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM认为过程的不断改进基于许多小的、步骤的进化而不是革命性的创新<br />
&nbsp;&nbsp;&nbsp;&nbsp;基于CMM的过程改善投资力度大、周期长，而技术投资则可能在短期内有较快回报。单独依靠技术改进可能在短期内取得较快回报，但最终可能一无所获。<br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=103" /> 
	  <id>http://www.nmju.net/default.asp?id=103</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[关于SQL2005安装失败的一种可行性解决办法]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=8" label="DataBase" /> 
	  <updated>2008-09-27T23:47:50+08:00</updated>
	  <published>2008-09-27T23:47:50+08:00</published>
		  <summary type="html"><![CDATA[<div class="ArticleBlogText">
<div id="BlogArticleDetail" style="FONT-SIZE: 14px">
<p>1、在安装向导过程中，出现如下错误：<a href="http://yiliaocn.photo.hexun.com/27115854_d.html" target="_blank"><img alt="查看更多精彩图片" src="http://photo9.hexun.com/p/2007/1010/135579/b_648B3ECA07DD02E8CF7427880E429844.jpg" onload="var image=new Image();image.src=this.src;if(image.width&gt;0 &amp;&amp; image.height&gt;0){if(image.width&gt;=700){this.width=700;this.height=image.height*700/image.width;}}" border="0" /></a></p>
<p>{英文原意如下<br />When you install Microsoft SQL Server 2005, you receive the following error message: <br /><span style="FONT-SIZE: 10pt">There was an unexpected failure during the setup wizard. You may review the setup logs and/or click the help button for more information.}<br /></span><br />2、当我检查C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Summary.txt</p>
<p>Microsoft SQL Server 2005 9.00.1399.06 <br />============================== <br />OS Version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft Windows Server 2003 family, Enterprise Edition Service Pack 2 (Build 3790) <br />Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Wed Oct 10 08:34:17 2007 <br />&nbsp;<br />CSZ : 执行安装向导期间出错。有关详细信息，您可以查看安装日志和/或单击&ldquo;帮助&rdquo;按钮。 </p>
<p><br />&nbsp;SQL Server 安装程序失败。有关详细信息，请查看 %ProgramFiles%\Microsoft SQL Server\90\Setup Bootstrap\LOG\Summary.txt 中的安装日志文件。 </p>
<p><br />Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Wed Oct 10 08:42:32 2007</p>
<p><br />List of log files:<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_Core(Local).log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_Datastore.xml<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework 2.0.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_Core.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Summary.txt<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework 2.0 LangPack.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Upgrade Advisor.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Upgrade Advisor LangPack.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Windows Installer.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Windows Installer LangPack.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_Support.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_SCC.log<br />&nbsp;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_WI.log</p>
<p>3、当我检查到日志文件SQLSetup0001_CSZ_Core.log，发现在日志文件末尾有如下的错误提示：<br />{英文原意如下：<br />When you examine the SQLSetupNumber_ServerName_Core(local).log file at this point, you notice the following error message at the end of the log file: }</p>
<p>Running: InstallToolsAction.10 at: 2007/9/10 8:35:36<br />Error: Action &quot;InstallToolsAction.10&quot; threw an exception during execution.&nbsp; Error information reported during run:<br />Target collection includes the local machine.<br />Fatal Exception caught while installing package: &quot;10&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Error Code: 0x80070002 (2)<br />Windows Error Text: 系统找不到指定的文件。<br />&nbsp; Source File Name: sqlchaining\sqlprereqpackagemutator.cpp<br />Compiler Timestamp: Tue Aug&nbsp; 9 01:14:20 2005<br />&nbsp;&nbsp;&nbsp;&nbsp; Function Name: sqls::SqlPreReqPackageMutator::modifyRequest<br />Source Line Number: 196<br />---- Context -----------------------------------------------<br />sqls::InstallPackageAction::perform<br />WinException caught while installing package. : 1603<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Error Code: 0x80070643 (1603)<br />Windows Error Text: 安装时发生严重错误<br />&nbsp; Source File Name: packageengine\installpackageaction.cpp<br />Compiler Timestamp: Fri Jul&nbsp; 1 01:28:25 2005<br />&nbsp;&nbsp;&nbsp;&nbsp; Function Name: sqls::InstallPackageAction::perform<br />Source Line Number: 167<br />---- Context -----------------------------------------------<br />sqls::InstallPackageAction::perform<br />Error: Failed to add file :&quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework 2.0.log&quot; to cab file : &quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\SqlSetup0001.cab&quot; Error Code : 2<br />Error: Failed to add file :&quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework 2.0 LangPack.log&quot; to cab file : &quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\SqlSetup0001.cab&quot; Error Code : 2<br />Error: Failed to add file :&quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Upgrade Advisor.log&quot; to cab file : &quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\SqlSetup0001.cab&quot; Error Code : 2<br />Error: Failed to add file :&quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Upgrade Advisor LangPack.log&quot; to cab file : &quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\SqlSetup0001.cab&quot; Error Code : 2<br />Error: Failed to add file :&quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Windows Installer.log&quot; to cab file : &quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\SqlSetup0001.cab&quot; Error Code : 2<br />Error: Failed to add file :&quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Files\SQLSetup0001_CSZ_.NET Framework Windows Installer LangPack.log&quot; to cab file : &quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\SqlSetup0001.cab&quot; Error Code : 2<br />Running: UploadDrWatsonLogAction at: 2007/9/10 8:42:36<br />Message pump returning: 1603<br /><br />4、问题解决<br />在d:盘根目录下建立sqlserver2005Setup目录，再在d:\sqlserver2005Setup\下创建2个目录<br />\Servers<br />\Tools<br />如果是2个cd的安装程序，将cd1上的所有文件拷贝到Servers目录下，将cd2目录下的所有文件拷贝到Tools下；如果是一个dvd的安装程序，则分别把dvd上的Servers和Tools目录下的所有文件分别拷贝到d:\sqlserver2005Setup\Servers和d:\sqlserver2005Setup\Tools<br />再进行安装应该就没有问题。<br /><br />还有需要注意的问题<br />安装到上述错误的时候，SQL Server2005很多文件已经安装到硬盘上了，所有你重新安装的时候，可能会遇到<br />1、提示磁盘空间不够<br />目标磁盘中的空间不足，无法执行当前的 SQL Server 安装。若要继续，请释放磁盘空间以安装所选功能、为此次安装选择较少的功能或将所选功能安装到另一个驱动器中。<br /><br />2、安装仍然失败<br />所以建议你重新安装之前，到添加删除程序里把SQL Server2005卸载掉！<br /><br />上述问题是8月份我在一个客户那里搞了一个晚上都没有搞定，最后第二天早上在宾馆里上网到微软的网站上找到了答案，真是让人哭笑不得。<br /><br />微软网站上标题为：<br />Error message when you install SQL Server 2005: &quot;There was an unexpected failure during the setup wizard&quot;<br /><br />Article ID : 916760 <br />Last Review : May 9, 2006 <br />Revision : 2.0 <br />Bug #: 408784 (SQLBUDT)</p>
<p>&nbsp;</p>
<p>------------------------------------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;性能计数器问题，主要是卸载SQL2005，再重新安装的错误，这方面的文章在网上很多，网友可搜索一下。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;关于sql.cab找不到网上这样的疑问同样很多，但是没有明确的解答。这里说说我是怎么解决的。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;应该说这是MSDN&nbsp;&nbsp;SQL2005安装程序的一个bug（不是十分确定），在SQL2005安装目录有两个子目录，一个是Servers目录，一个是Tools目录，当初我只把Servers拷贝我硬盘上了，所以安装时如果选择了工作站组件、联机丛书和开发工具选项，安装到最后，就会提示你sql.cab找不到（或其它安装不成功的提示信息），其实安装sql时先不要选该项，这样就可以安装成功，最后安装Tools的setup程序，它就是仅安装该选项的安装包。<br /></p>
<p>-------------------------------------------------------------</p>
<p>假如，以上这种办法还是出现SQL.CAB找不到类似的错误，那么你可以在上面那个办法的基础上，打开TOOLS文件夹（有的可能是CD2文件夹），找到TOOLS\Setup\SqlRun_Tools.msi并，运行，然后按照正常的安装流程来，这样应该可以解决了</p>
<p>&nbsp;</p>
<p>题外话：我熬了好几个夜，把SQL2005装了删，删了装，终于装上了，真是辛苦啊~~。以上是我的安装解决办法的总结，有的是网站感觉比较有用的转载，有的是自己实际经历的过程的记录~~！</p>
</div>
</div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=101" /> 
	  <id>http://www.nmju.net/default.asp?id=101</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[数据库搜索优化简论]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=8" label="DataBase" /> 
	  <updated>2008-09-26T09:46:57+08:00</updated>
	  <published>2008-09-26T09:46:57+08:00</published>
		  <summary type="html"><![CDATA[<p><br />　　<br />　　很多人不知道SQL语句在SQL SERVER中是如何执行的，他们担心自己所写的SQL语句会被SQL SERVER误解。比如：<br />　　<br />　　select * from table1 where name=''zhangsan'' and tID &gt; 10000<br />　　和执行:<br />　　<br />　　select * from table1 where tID &gt; 10000 and name=''zhangsan''<br />　　<br />　　一些人不知道以上两条语句的执行效率是否一样，因为如果简单的从语句先后上看，这两个语句的确是不一样，如果tID是一个聚合索引，那么后一句仅仅从表的10000条以后的记录中查找就行了；而前一句则要先从全表中查找看有几个name=''zhangsan''的，而后再根据限制条件条件tID&gt;10000来提出查询结果。<br />　　<br />　　事实上，这样的担心是不必要的。SQL SERVER中有一个&ldquo;查询分析优化器&rdquo;，它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间，也就是说，它能实现自动优化。<br />　　<br />　　虽然查询优化器可以根据where子句自动的进行查询优化，但大家仍然有必要了解一下&ldquo;查询优化器&rdquo;的工作原理，如非这样，有时查询优化器就会不按照您的本意进行快速查询。<br />　　<br />　　在查询分析阶段，查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数（SARG），那么就称之为可优化的，并且可以利用索引快速获得所需数据。<br />　　<br />　　SARG的定义：用于限制搜索的一个操作，因为它通常是指一个特定的匹配，一个值得范围内的匹配或者两个以上条件的AND连接。形式如下：<br />　　<br />　　列名 操作符 &lt;常数 或 变量&gt;<br />　　<br />　　或<br />　　<br />　　&lt;常数 或 变量&gt; 操作符列名<br />　　列名可以出现在操作符的一边，而常数或变量出现在操作符的另一边。如：<br />　　<br />　　Name=&rsquo;张三&rsquo;<br />　　<br />　　价格&gt;5000<br />　　<br />　　5000&lt;价格<br />　　<br />　　Name=&rsquo;张三&rsquo; and 价格&gt;5000<br />　　<br />　　如果一个表达式不能满足SARG的形式，那它就无法限制搜索的范围了，也就是SQL SERVER必须对每一行都判断它是否满足Where子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。<br />　　<br />　　介绍完SARG后，我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验：<br />　　<br />　　1、Like语句是否属于SARG取决于所使用的通配符的类型<br />　　<br />　　如：name like &lsquo;张%&rsquo; ，这就属于SARG<br />　　<br />　　而：name like &lsquo;%张&rsquo; ,就不属于SARG。<br />　　原因是通配符%在字符串的开通使得索引无法使用。<br />　　<br />　　2、or 会引起全表扫描<br />　　Name=&rsquo;张三&rsquo; and 价格&gt;5000 符号SARG，而：Name=&rsquo;张三&rsquo; or 价格&gt;5000 则不符合SARG。使用or会引起全表扫描。<br />　　<br />　　3、非操作符、函数引起的不满足SARG形式的语句<br />　　不满足SARG形式的语句最典型的情况就是包括非操作符的语句，如：NOT、!=、&lt;&gt;、!&lt;、!&gt;、NOT EXISTS、NOT IN、NOT LIKE等，另外还有函数。下面就是几个不满足SARG形式的例子：<br />　　<br />　　ABS(价格)&lt;5000<br />　　<br />　　Name like &lsquo;%三&rsquo;<br />　　<br />　　有些表达式，如：<br />　　<br />　　Where 价格*2&gt;5000<br />　　<br />　　SQL SERVER也会认为是SARG，SQL SERVER会将此式转化为：<br />　　Where 价格&gt;2500/2<br />　　但我们不推荐这样使用，因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。<br />　　<br />　　4、IN 的作用相当与OR<br />　　<br />　　语句：<br />　　<br />　　Select * from table1 where tid in (2,3)<br />　　<br />　　和<br />　　<br />　　Select * from table1 where tid=2 or tid=3<br />　　是一样的，都会引起全表扫描，如果tid上有索引，其索引也会失效。<br />　　<br />　　5、尽量少用NOT<br />　　<br />　　6、exists 和 in 的执行效率是一样的<br />　　很多资料上都显示说，exists要比in的执行效率要高，同时应尽可能的用not exists来代替not in。但事实上，我试验了一下，发现二者无论是前面带不带not，二者之间的执行效率都是一样的。因为涉及子查询</p>
<p>　　7、用函数charindex()和前面加通配符%的LIKE执行效率一样<br />　　前面，我们谈到，如果在LIKE前面加上通配符%，那么将会引起全表扫描，所以其执行效率是低下的。但有的资料介绍说，用函数charindex()来代替LIKE速度会有大的提升，经我试验，发现这种说明也是错误的：<br />　　<br />　　<br />　　select gid,title,fariqi,reader from tgongwen<br />　　where charindex(''刑侦支队'',reader)&gt;0 and fariqi&gt;''2004-5-5''<br />　　用时：7秒，另外：扫描计数 4，逻辑读 7155 次，物理读 0 次，预读 0 次。<br />　　<br />　　select gid,title,fariqi,reader from tgongwen<br />　　where reader like ''%'' + ''刑侦支队'' + ''%'' and fariqi&gt;''2004-5-5''<br />　　用时：7秒，另外：扫描计数 4，逻辑读 7155 次，物理读 0 次，预读 0 次。<br />　　<br />　　8、union并不绝对比or的执行效率高<br />　　我们前面已经谈到了在where子句中使用or会引起全表扫描，一般的，我所见过的资料都是推荐这里用union来代替or。事实证明，这种说法对于大部分都是适用的。<br />　　<br />　　select gid,fariqi,neibuyonghu,reader,title from Tgongwen<br />　　where fariqi=''2004-9-16'' or gid&gt;9990000<br />　　用时：68秒。扫描计数 1，逻辑读 404008 次，物理读 283 次，预读 392163 次。<br />　　<br />　　select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''<br />　　union<br />　　select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid&gt;9990000<br />　　用时：9秒。扫描计数 8，逻辑读 67489 次，物理读 216 次，预读 7499 次。<br />　　<br />　　看来，用union在通常情况下比用or的效率要高的多。<br />　　<br />　　但经过试验，笔者发现如果or两边的查询列是一样的话，那么用union则反倒和用or的执行速度差很多，虽然这里union扫描的是索引，而or扫描的是全表。<br />　　<br />　　select gid,fariqi,neibuyonghu,reader,title from Tgongwen<br />　　where fariqi=''2004-9-16'' or fariqi=''2004-2-5''<br />　　用时：6423毫秒。扫描计数 2，逻辑读 14726 次，物理读 1 次，预读 7176 次。<br />　　<br />　　select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''<br />　　union<br />　　select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-2-5''<br />　　用时：11640毫秒。扫描计数 8，逻辑读 14806 次，物理读 108 次，预读 1144 次。<br />　　<br />　　9、字段提取要按照&ldquo;需多少、提多少&rdquo;的原则，避免&ldquo;select *&rdquo;<br />　　我们来做一个试验：<br />　　<br />　　select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc<br />　　用时：4673毫秒<br />　　<br />　　select top 10000 gid,fariqi,title from tgongwen order by gid desc<br />　　用时：1376毫秒<br />　　<br />　　select top 10000 gid,fariqi from tgongwen order by gid desc<br />　　用时：80毫秒<br />　　<br />　　由此看来，我们每少提取一个字段，数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。<br />　　<br />　　10、count(*)不比count(字段)慢<br />　　某些资料上说：用*会统计所有列，显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看：<br />　　<br />　　select count(*) from Tgongwen<br />　　用时：1500毫秒<br />　　<br />　　select count(gid) from Tgongwen<br />　　用时：1483毫秒<br />　　<br />　　select count(fariqi) from Tgongwen<br />　　用时：3140毫秒<br />　　<br />　　select count(title) from Tgongwen<br />　　用时：52050毫秒<br />　　<br />　　从以上可以看出，如果用count(*)和用count(主键)的速度是相当的，而count(*)却比其他任何除主键以外的字段汇总速度要快，而且字段越长，汇总的速度就越慢。我想，如果用count(*)， SQL SERVER可能会自动查找最小字段来汇总的。当然，如果您直接写count(主键)将会来的更直接些。<br />　　<br />　　11、order by按聚集索引列排序效率最高<br /></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=100" /> 
	  <id>http://www.nmju.net/default.asp?id=100</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[导出数据库中图片字段的数据变成图片文件]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=3" label="C#/ASP.NET" /> 
	  <updated>2008-09-24T09:01:56+08:00</updated>
	  <published>2008-09-24T09:01:56+08:00</published>
		  <summary type="html"><![CDATA[<p>最近遇到一个问题就是在一个ASP项目中，原作者是把图片放到数据库里面，而随着图片的日益增多，数据库不堪重负，所以需要把图片文件导出来，原先一直从ASP的角度考虑如何导出，不过后来一想，反正都是导出图片，就直接写成ASP.NET形式了，以下是那段代码，在此记录下，方便以后调用了！</p>
<p><br />&nbsp;&nbsp;&nbsp; private void GetAndWriteData()<br />&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Byte[] blob = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream fs = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #region ------------获取数据库数据-------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CData my = new CData();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet dset = new DataSet();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSql = &quot;select&nbsp;&nbsp; *&nbsp;&nbsp; from&nbsp;&nbsp; s_spic&nbsp; &quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dset = my.GetDataSet(strSql, 0, 0, &quot;img&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dset != null &amp;&amp; dset.Tables.Count &gt; 0 &amp;&amp; dset.Tables[0].Rows.Count &gt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (DataRow drow in dset.Tables[0].Rows)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blob = (Byte[])drow[&quot;pic&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs = new FileStream(Server.MapPath(&quot;/ProductPic/small/&quot;) + drow[&quot;id&quot;].ToString() + &quot;.jpg&quot;, FileMode.Create, FileAccess.Write);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Write(blob, 0, blob.Length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch { }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />&nbsp;&nbsp;&nbsp; }</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=99" /> 
	  <id>http://www.nmju.net/default.asp?id=99</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Windows Server 2003中的w3wp.exe进程大量占用cpu资源的各种问题解决方法]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=14" label="Server" /> 
	  <updated>2008-09-20T19:10:04+08:00</updated>
	  <published>2008-09-20T19:10:04+08:00</published>
		  <summary type="html"><![CDATA[Windows Server 2003中的w3wp.exe进程大量占用cpu资源的各种问题解决方法2007-04-
<p>24 14:43这几天服务器总是运行缓慢，远程登录后发现一个w3wp.exe的进程占用了100% </p>
<p>cpu</p>
<p>在Windows&nbsp;&nbsp; Server&nbsp;&nbsp; 2003中对于每一个Web应用，IIS&nbsp;&nbsp; 6.0都用一个独立的w3wp.exe</p>
<p>的实例来运行它。w3wp.exe也称为工作进程（每一个主机头都会有一个）</p>
<p>直接在任务管理器中结束进程是不起作用的，结束后不久它会执行启动，要想结束它可</p>
<p>以在IIS中找到相应的应用程序池停止相应的应用程序池工作。</p>
<p>这些都不是解决办法，它的根本问题是你的那个网站程序有问题，在找到问题以前可以</p>
<p>先打开IIS找到应用程序池先用右键属性中设置&ldquo;性能&rdquo;把其中的CPU设成大于60%关闭应</p>
<p>用程序池，把关闭时间和开启时间设短一些比如10秒，这样当您的网站程序大量占用系</p>
<p>统资源时IIS自动快速回收进程并且快速启动进程，您的网站暂时还可以将就着工作。</p>
<p>要解决根本问题还要从程序查起，您可以在IIS中的应用程序池中右键创建多个应用程序</p>
<p>池，然后在每个主机头中的文件家选项的底部将应用程序池对应道刚才建好的应用程序</p>
<p>池，然后一个一个关闭在任务管理器中看看是哪个程序占用的资源较大。</p>
<p>下面是一些网友的相关贴子也许对大家有帮助</p>
<p>朋友的WEB服务器一直运行正常，但这几天CPU占用率一直将近100%，遂去看个究竟。<br />服务器采用Windows&nbsp;&nbsp; 2003,&nbsp;&nbsp; 网站使用ASP+Access数据库,&nbsp;&nbsp; 查看进程列表发现</p>
<p>w3wp.exe&nbsp;&nbsp; 占用了70%以上的CPU，<br />查看WEB日志，站点访问量不大，查看TCP连接也不多。用net&nbsp;&nbsp; stop&nbsp;&nbsp; w3svc停掉WEB服</p>
<p>务，CPU占用立即正常，net&nbsp;&nbsp; start&nbsp;&nbsp; w3svc启动WEB后不久现象又出来了。停止所有虚</p>
<p>拟站点，新建一个虚拟站点发现并没有问题，怀疑是站点本身的代码问题。<br />检查首页代码，大致是如下结构：</p>
<p>粗看一下并没有问题，但就是这段代码造成了w3wp.exe占用大量CPU，难道是死循环？似</p>
<p>乎没有理由。在循环体内加入计数，发现确实是死循环，说明RS.EOF一直为false，加入</p>
<p>如下代码：</p>
<p>if&nbsp;&nbsp; RS.EOF&nbsp;&nbsp; =&nbsp;&nbsp; true&nbsp;&nbsp; then&nbsp;&nbsp; Response.Write&nbsp;&nbsp; &quot;EOF&nbsp;&nbsp; is&nbsp;&nbsp; true&quot;<br />if&nbsp;&nbsp; RS.EOF&nbsp;&nbsp; =&nbsp;&nbsp; false&nbsp;&nbsp; then&nbsp;&nbsp; Response.Write&nbsp;&nbsp; &quot;EOF&nbsp;&nbsp; is&nbsp;&nbsp; false&quot;</p>
<p>发现输出竟然是EOF&nbsp;&nbsp; is&nbsp;&nbsp; true&nbsp;&nbsp; EOF&nbsp;&nbsp; is&nbsp;&nbsp; false,&nbsp;&nbsp; 说明无法判断RS.EOF的值，</p>
<p>为何如此百思不得其解。检查数据库，发现库中并没有mytable表,&nbsp;&nbsp; 如果该表不存在，</p>
<p>RS.Open&nbsp;&nbsp; &quot;Select&nbsp;&nbsp; *&nbsp;&nbsp; FROM&nbsp;&nbsp; mytable&quot;,&nbsp;&nbsp; conn&nbsp;&nbsp; 就会出错，为何没有出错，很</p>
<p>有可能捕获的异常被忽略了。<br />检查包含文件conn.asp,&nbsp;&nbsp; 发现了异常处理代码：</p>
<p>On&nbsp;&nbsp; Error&nbsp;&nbsp; Resume&nbsp;&nbsp; Next</p>
<p>原来问题在此。</p>
<p>On&nbsp;&nbsp; Error&nbsp;&nbsp; Resume&nbsp;&nbsp; Next忽略了查询表时的失败以及后续的错误，造成进入死循环</p>
<p>。<br />那为何网站本来运行正常，现在却找不到mytable表了呢？仔细检查网站才发现&ldquo;有&lsquo;客</p>
<p>&rsquo;自远方来&rdquo;，上传了后门工具、删除了多张数据表，害我忙活了一天。</p>
<p>更多的内容大家还可以到：</p>
<p><a href="http://www.microsoft.com/china/technet/security/guidance/secmod93.mspx">http://www.microsoft.com/china/technet/security/guidance/secmod93.mspx</a></p>
<p>查找更详细的安全设置</p>
<p><br />windows2003&nbsp;&nbsp; iis6.0假死问题解决</p>
<p>这几天服务器总是运行缓慢，远程登录后发现一个w3wp.exe的进程占用了100%&nbsp;&nbsp; cpu。</p>
<p><br />问题的原因最终找到两个：</p>
<p>1.采用的jet&nbsp;&nbsp; 数据库连接方式存在问题：<a href="http://support.microsoft.com/?id=838306">http://support.microsoft.com/?id=838306</a></p>
<p>补丁下载：</p>
<p>chs:WindowsServer2003-KB838306-x86-chs.exe</p>
<p>enu:WindowsServer2003-KB838306-x86-enu.exe</p>
<p>2.将access数据库扩展名改为asp</p>
<p>下面是我的差错过程和解决方案：</p>
<p>搜索一下发现类似问题还真不少，那个w3wp的进程是iis6.0的应用程序池，网上的说法</p>
<p>有两种，一是因为asp或者asp.net代码中含有死循环引起的。但是服务器上这么多网站</p>
<p>，谁知道那个网站出了问题。二是由于上面的jet连接数据库方式的bug引起的，下载</p>
<p>838306的补丁，或者升级到sp1可以解决这个问题，但是打了这个补丁后，有些网站的问</p>
<p>题依然存在。</p>
<p><br />又去搜索，有人说将每个网站建立独立的应用程序池，应用程序池的安全性帐户设为本</p>
<p>地服务即可。方法如下:</p>
<p>首先新建应用程序池：</p>
<p>然后将网站的应用程序池指向刚才建立的应用程序池：</p>
<p>在建立完所有应用程序池后，统一修改应用程序池的属性：</p>
<p>将应用程序池安全帐户指定为本地服务：</p>
<p><br />设置完这些之后，问题依然存在，这样一个网站出现问题，不致影响其他网站，但是这</p>
<p>个网站仍然占用大量资源，导致其它网站响应缓慢。不过在任务管理器中出现了每个应</p>
<p>用程序池的进程，因此可以找到具体出问题的进程了。</p>
<p>下面是寻找出错网站的过程：要找到这个网站，必须把有问题的进程跟该网站的应用程</p>
<p>序池联系起来。首先设置任务管理器的查看方式，加入PID的显示：</p>
<p>然后再命令行运行iisapp&nbsp;&nbsp; -a，可以看到PID跟应用程序池的对应关系：</p>
<p><br />再去iis中看该应用程序池对应的网站，有问题的网站就找到了，剩下的就是这个网站代</p>
<p>码中的问题了。</p>
<p>在某位网站管理员的纠缠不休下，我终于无法忍受，帮他找错误-&nbsp;&nbsp; -&nbsp;&nbsp; 无数次配置iis</p>
<p>，网站程序也换了，该升级的也升级了，问题还是存在，黔驴技穷，把网站下载到本地</p>
<p>看看到底怎么回事。当我试图打开他的数据库的时候，问题出现了：</p>
<p>他的数据库是.asp的扩展名，要先修改为.mdb才能打开，但是当我点击要改名字的时候</p>
<p>，我的电脑没有响应了~！看来问题在这个数据库了。</p>
<p>用命令行rename之后，打开数据库，修复，似乎没有任何问题，但是再改为.asp时，又</p>
<p>出现了刚才的问题。哈~原来是.asp的扩展名在作怪。</p>
<p>但是我试着将其他的数据库改为.asp，没有问题。根本原因不得而知，望知情者告知。</p>
<p>最后，在iis中随便添加了一个isapi对应到mdb，造成mdb无法执行，防止下载，将所有</p>
<p>的.asp的数据库改回.mdb，问题解决<br /><br />(转)Windows Server 2003中的w3wp.exe进程大量占用cpu资源的各种问题解决方法 1：使用 MicrosoftJet 数据库引擎 Web 应用程序可能停止响应负载，造成假死：<br />&nbsp;&nbsp;&nbsp;&nbsp; 原因：发生此问题是因为 Jet 数据库引擎中存在缺陷。 Microsoft Windows Server 2003 上只会出现此问题。 在 Windows Server 2003, COM+ 更改频率 CoFreeUnusedLibraries 函数被调用。 此更改导致 Jet 驱动程序以初始化频繁。 此行为可能导致死锁条件。 <br />Web 服务器负载时最常出现此问题。 <br />补丁下载：<br />chs:WindowsServer2003-KB838306-x86-chs.exe<br />enu:WindowsServer2003-KB838306-x86-enu.exe<br />在IIS6下，经常出现w3wp.exe的内存及CPU占用不能及时释放，从而导致服务器响应速度很慢。</p>
<p>解决内存占用过多，可以做以下配置：<br />1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。<br />2、设置应用程序池的回收时间，默认为1720小时，可以根据情况修改。再设置当内存占用超过多少（如500M），就自动回收内存。</p>
<p>解决CPU占用过多：<br />1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。<br />2、设置应用程序池的CPU监视，不超过25%（服务器为4CPU），每分钟刷新，超过限制时关闭。</p>
<p>根据w3wp取得是那个一个应用程序池：<br />1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid<br />2、在命令提示符下运行iisapp -a。注意，第一次运行，会提示没有js支持，点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。（iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本，全名为iisapp.vbs，如果你和我一样，也禁止了Vbs默认关联程序，那么就需要手动到该目录，先择打开方式，然后选&ldquo;Microsoft (r) Windows Based Script Host&rdquo;来执行，就可以得到PID与应用程序池的对应关系。）<br />3、到iis中察看该应用程序池对应的网站，就ok了，做出上面的内存或CPU方面的限制，或检查程序有无死循环之类的问题。</p>
<p>&nbsp;</p>
<p>QUOTE:</p>
<p>环境：win2003server+IIs+ASP+MSSQL</p>
<p>现象：每隔一段时间（不定，有时几分钟，有时半小时）出现一次网站打开非常缓慢，甚至有时会出现超时打不开站点，此时查看服务器端的进程，CPU占用率达到100%，其中w3wp占用70~80%，SQL占用20~30%。所有服务器端的操作也变得缓慢。</p>
<p>初期解决方法：每次现象出现时，立即登录服务器直接结束w3wp进程或重启IIS服务，平均每天约十次操作，由于服务器存放于远程机房，所有操作都是远程控制进行，有时会因此出现远程无法连接登录的情况，只能通过电话通知机房管理人员重启服务器解决，此过程导致用户抱怨不断。</p>
<p>经过网上查阅资料，发现此类现象多数由于网页代码不合理所致，以下情况会导致此类现象发生：<br />1、代码中多处使用application、seesion等服务器缓存，导致服务器资料过度占用；<br />2、代码有不合理语法，死循环等；<br />3、数据库损坏，尤其是ACCESS数据库；<br />4、装过多第三方软件或插件，与IIS或网页功能代码冲突。</p>
<p>第一阶段排查：根据查阅到的参考资料逐项分析<br />1、服务器上所有站点代码均为公司设计人员自行编写，可证实并无过多调用服务器缓存语法（排除）<br />2、代码是否存在不合理语法（不确定）<br />3、根据情况来看，IIS进程占用率升高时，SQL占用率同时升高，应为SQL数据库的站点，根据现象判断，库或表应该正常，估计是数据方面可能有误；（不确定）<br />4、服务器端除了基本的系统服务，防杀毒及网站运作必备服务之外，并无多余第三方软件，机率不大（排除）。</p>
<p>经过以上分析判断，将不确定项连起来得出的结论是：某个采用了SQL数据库的网站网页代码存在不合理语法，导致IIS和SQL进程CPU占用率过高。</p>
<p>第二阶段排查：<br />确定范围，接着继续把范围缩小。<br />由于服务器上采用SQL数据库的站点并不多，便于建立独立进程ID来观察，将所有采用SQL数据库的站点在IIS管理器中分别建立独立的应用程序池，然后通过CMD界面输入：iisapp -a 命今查看并记录下各IIS池的进程ID号，通过多次现象重现时的观察，有个IIS进程ID是导致此次问题的罪魁祸首。</p>
<p>2003服务器用.net程序,w3wp老占cpu资源！怎么办？</p>
<p>&nbsp;</p>
<p><br />w3wp.exe狂占内存的问题解决方案！&nbsp;&nbsp;</p>
<p>问：</p>
<p>好的asp.net程序，放在一台服务器上，客户端连接使用一段时间后，在服务器上打开任务管理器一看，发现有很多w3wp.exe，占用内存很大，达到1g，请问为什么会这样？有什么办法可以避免这种情况呢？</p>
<p>答:这主要是你的ASP.NET 开发的程序有 内存泄漏;对于 非托管资源，一定要注意 释放。</p>
<p>-==================================<br />问：我的具体情况是这样的：<br />服务器配置 至强2.8G 内存512M SCSI硬盘 2块 （软镜像）<br />系统 windows 2003 <br />现在挂了一个asp.net开发的网站 访问量不大 但是出现一个 问题就是<br />每当服务器运行2-3天后 访问网站就特别慢 重启动服务器后就 正常了<br />查看进程使用内存的情况 发现w3wp.exe 和sqlservr.exe 进程 占用内存<br />相当大 达到了170多M（ 每个） 物理可用内存几乎用光<br />（服务器重启动时 占用的内存很小才40多M 每个）<br />以前网站挂在一个虚拟机上 数据库是分开挂的 从没出现这种情况<br />后来 原版移植到新服务器上就 出现这样的问题~~ <br />还个一问题就是 我在SQL企业管理器中查看SQL进程 发现有很多是 。net 引起的进程是sleeping 但是却占用了内存~ 无法释放</p>
<p>搞了很久了 一直都没解决<br />求救~~请高手 指教~~ 万分感谢~~~~~</p>
<p><br />答：IIS服务管理器----》应用程序池----》添加你的应用，并设置最大内存，当程序达到最大内存后其会自动重启。</p>
<p>我的问题跟你一样,不过我的内存是2G的,访问量比较高,一般是差不多运行24小时后就得重启,内存没耗完,W3WP进程占到一百八九十兆,SQL占了二百多兆时,就得重启,不然整个站点就当在那边....55555555,搞了快半个月了还是不行,痛苦啊</p>
<p>w3wp.exe就是你的ASP.NET应用宿主，如果你使用了大量的Session、Cache等资源，并且Session超市时间很长，那么内存占用量就比较大。应用池是为增加性能而设的一个特性，但是也消耗很大的内存。另外关掉Windows Server 2003里的大多数Service（那个不用都可以关掉），也可以节省一部分内存</p>
<p>1.怀疑在程序中应用的CACHE,<br />2.CACHE中有大量的数据<br />3.频繁刷新CACHE<br />4.没有设计好CACHE的方式</p>
<p><br />你的问题我以前也遇见过，我以前是用的Session,后我全部改成cook之后就好多了，应该是你的Session或是你的CACHE有问题（CACHE不太懂，但多多少应该是有的）</p>
<p>跟踪下SQL的调用记录,在每次往CACHE或SESSION写入大量数据时记录一下时间,看是否太过频繁</p>
<p>1.在win2003里asp.net的进程就是w3wp.exe</p>
<p>2.512M内存个人用是够用了，但是放在服务器上就有点不够用了，尤其是win2003 + asp.net +sql server 。尤其是sql server 他是很吃内存的，如果不控制的话，他会占光所有的物理内存（只剩下几十M 倒 100M 吧）。win2003 本身就要占用150M左右。也就剩不下什么了。</p>
<p>3.优化asp.net程序，就向楼上的说的那样，少用或不用session cache application之类的东西，再有就是是不是有翻页的地方，翻页处理不好也是会占很多内存的。</p>
<p>4.限制sql的内存。企业管理器&mdash;&mdash;SQL的属性（一般是local）&mdash;&mdash;&ldquo;内存&rdquo;标签<br />在这里看内存的设置，把最大值改成100M吧。</p>
<p>第四条是最快的方法，可以试一试。</p>
<p>我的一个自开发OA系统也存在这样的问题。<br />总结上面,大概原因是因为 session 和 cache 的不合理使用造成的。<br />我的应用程序中，确实用了很多的Session 和 Cache,<br />在 MSDN 中找到 了 &ldquo;动态内存分配&rdquo;这一篇，今天就试看看，是否有效。<br />希望有经验的朋友多给些信息，大家也好总结下出现类似错误的原因，谢谢！！</p>
<p><br />不知道你是什么网站。按理说是不会占用这么大的。如上你用了cache存放了超额的内容。当然。象session这种是不太可能占用这么大的了，或用了application 类似的一些有超长时间或永久保持性的对象来保存大量数据。如利用单例保存数据这些都有可能造成使用大量的内存。</p>
<p>建义2003系统安装至少1G内存。</p>
<p><br />w3wp.exe是2003下的一个iis进程，至于楼主说的sql占用内存，那有可能是因为你的sql没有设置占用内存上限</p>
<p>&nbsp;</p>
<p><br />-==================================<br />w3wp.exe进程狂占内存和CPU问题　谁能帮我？？<br />　　　我的电脑：P4,512M内存。。当我用了aspx系统建站两个星期后，就出现了速度极慢的情况，在进程里看到w3wp.exe狂占内存和CPU.<br />刚开始几十人注册时速度都不会有影响，但注册会员有100名以上后，再有多人同时注册时就出现了速度极慢的情况，简直导致瘫痪。</p>
<p><br />IIS中设置不正确。在.NET中，不要在IIS里限制内存的使用，不然当内存不足的时候，IIS会不断的重新起动。每次起动有30秒的时候用来重新加载.NET包，所以，网站在加载.NET 包时狂慢。这也是我当时用.NET系统时碰到过的问题。</p>
<p>应用程序池－－属性－－回收－－内存回收：消耗太多内存时回收工作进程：1、最大虚拟内存。2、最大使用的内存。两个选项都没选择<br /><br /><br />这里不要打勾。另一处是性能里的请求队列，不要打勾。<br />自已调调看就有经验了，我也是自已摸索出来的方法。</p>
<p><br />A:关于W3WP.EXE的知识.</p>
<p>Q : W3WP.EXE,应用程序,应用程序池之间的关系</p>
<p>A : 一个应用程序池可以包含多个应用程序,一个应用程序池创建一个W3WP.EXE进程.那么我们就不能简单的说一个进程池对应一个W3WP.EXE进程了!其实是多个应用进程池对应一个W3WP.EXE进程的.</p>
<p>Q : 如何启动和关闭W3WP.EXE这个进程</p>
<p>A : W3WP.EXE这个进程将在你访问www应用程序的时候启动.有人就会这么问了:&quot;我启动了一个Web应用程序，发现系统自动创建了一个W3wp.exe进程。但我关闭这个Web应用程序后，发现这个刚创建的W3Wp.exe进程还在,请问如何关闭该进程。&quot;这个进程不会在你关闭了这个程序以后,就马上关闭的.那是因为Http是无连接的访问,当你关闭了web网页,不会返回相应的关闭信息,所以W3WP.EXE这个进程不会因为你关闭了web应用程序尔关闭.</p>
<p>Q : 那么如何关闭这个进程呢?</p>
<p>A : 在应用程序池的配置中,&quot;空闲超时&quot;中设定合适的时间,系统默认的是20分钟.设定好指定的时间,那么在这个时间范围内没有在访问应用程序,那么系统会自动的关闭W3WP.EXE这个进程的.而不需要我们人为的干预的.也可以在Windows任务管理器里面,结束这个进程</p>
<p>Q : 如何让W3WP.EXE进程长时间的运行.</p>
<p>A : W3WP.EXE这个进程的默认生命是1740分钟,但依然是在这种默认的自然规律下,W3WP.EXE将在自己失业20分钟后,被系统直接枪杀.这样就可以看出,要想让W3WP.EXE长时间的生存,那我们可以通过&rdquo;空闲超时&rdquo;不作处理来达到我们的目的.</p>
<p>Q : 在IIS6下，经常出现w3wp.exe的内存及CPU占用不能及时释放，从而导致服务器响应速度很慢。</p>
<p>A: 解决内存占用过多，可以做以下配置<br />1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。<br />2、设置应用程序池的回收时间，默认为1720小时，可以根据情况修改。再设置当内存占用超过多少（如500M），就自动回收内存。</p>
<p>解决CPU占用过多：<br />1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。<br />2、设置应用程序池的CPU监视，不超过25%（服务器为4CPU），每分钟刷新，超过限制时关闭。</p>
<p>根据w3wp取得是那个一个应用程序池：<br />1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid<br />2、在命令提示符下运行iisapp -a。注意，第一次运行，会提示没有js支持，点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。（iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本，全名为iisapp.vbs，如果禁止了Vbs默认关联程序，那么就需要手动到该目录，先择打开方式，然后选&ldquo;Microsoft (r) Windows Based Script Host&rdquo;来执行，就可以得到PID与应用程序池的对应关系。）<br />3、到iis中察看该应用程序池对应的网站，就ok了，做出上面的内存或CPU方面的限制，或检查程序有无死循环之类的问题。</p>
<p>A2 : by 小步舞曲<br />查看占用cpu的w3wp进程里面里面有那个用户呼叫的token</p>
<p>Q : 另一种加载了某程序后发生w3wp.exe问题</p>
<p>A: 修改C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config,再配置节点&lt;processModel&gt;中有一个属性&quot;memoryLimit&quot;,这个属性的值是一个百分比,默认为&quot;60&quot;(注意,是60%不是60M),即制定了ASP.NET进程能够使用所有物理内存的60%,当ASP.NET使用的内存量草果这个限额时,IIS会开始自动回收进程,即创建一个新的进程去负责应付HTTP请求,而将旧进程所占用的内存回收.<br />本篇文章来源于 麦客学吧 原文链接：<a href="http://x8.maicoo.com/tech/win2003/10572.html">http://x8.maicoo.com/tech/win2003/10572.html</a></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=98" /> 
	  <id>http://www.nmju.net/default.asp?id=98</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ASP内置对象Request的ServerVariables集合列表]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=7" label="ASP/PHP" /> 
	  <updated>2008-09-18T12:27:21+08:00</updated>
	  <published>2008-09-18T12:27:21+08:00</published>
		  <summary type="html"><![CDATA[ASP内置对象Request的ServerVariables集合列表<br />Request.ServerVariables(&quot;Url&quot;) <br />返回服务器地址<br /><br />Request.ServerVariables(&quot;Path_Info&quot;) <br />客户端提供的路径信息<br /><br />Request.ServerVariables(&quot;Appl_Physical_Path&quot;) <br />与应用程序元数据库路径相应的物理路径<br /><br />Request.ServerVariables(&quot;Path_Translated&quot;) <br />通过由虚拟至物理的映射后得到的路径<br /><br />Request.ServerVariables(&quot;Script_Name&quot;) <br />执行脚本的名称<br /><br />Request.ServerVariables(&quot;Query_String&quot;) <br />查询字符串内容<br /><br />Request.ServerVariables(&quot;Http_Referer&quot;) <br />请求的字符串内容<br /><br />Request.ServerVariables(&quot;Server_Port&quot;) <br />接受请求的服务器端口号<br /><br />Request.ServerVariables(&quot;Remote_Addr&quot;) <br />发出请求的远程主机的IP地址<br /><br />Request.ServerVariables(&quot;Remote_Host&quot;) <br />发出请求的远程主机名称<br /><br />Request.ServerVariables(&quot;Local_Addr&quot;) <br />返回接受请求的服务器地址<br /><br />Request.ServerVariables(&quot;Http_Host&quot;) <br />返回服务器地址<br /><br />Request.ServerVariables(&quot;Server_Name&quot;) <br />服务器的主机名、DNS地址或IP地址<br /><br />Request.ServerVariables(&quot;Request_Method&quot;) <br />提出请求的方法比如GET、HEAD、POST等等<br /><br />Request.ServerVariables(&quot;Server_Port_Secure&quot;)<br />如果接受请求的服务器端口为安全端口时，则为1，否则为0<br /><br />Request.ServerVariables(&quot;Server_Protocol&quot;)<br />服务器使用的协议的名称和版本<br /><br />Request.ServerVariables(&quot;Server_Software&quot;)<br />应答请求并运行网关的服务器软件的名称和版本<br /><br />Request.ServerVariables(&quot;All_Http&quot;)<br />客户端发送的所有HTTP标头，前缀HTTP_<br /><br />Request.ServerVariables(&quot;All_Raw&quot;)<br />客户端发送的所有HTTP标头,其结果和客户端发送时一样，没有前缀HTTP_<br /><br />Request.ServerVariables(&quot;Appl_MD_Path&quot;)<br />应用程序的元数据库路径<br /><br />Request.ServerVariables(&quot;Content_Length&quot;)<br />客户端发出内容的长度<br /><br />Request.ServerVariables(&quot;Https&quot;)<br />如果请求穿过安全通道（SSL），则返回ON如果请求来自非安全通道，则返回OFF<br /><br />Request.ServerVariables(&quot;Instance_ID&quot;)<br />IIS实例的ID号<br /><br />Request.ServerVariables(&quot;Instance_Meta_Path&quot;)<br />响应请求的IIS实例的元数据库路径<br /><br />Request.ServerVariables(&quot;Http_Accept_Encoding&quot;)<br />返回内容如：gzip,deflate<br /><br />Request.ServerVariables(&quot;Http_Accept_Language&quot;)<br />返回内容如：en-us<br /><br />Request.ServerVariables(&quot;Http_Connection&quot;)<br />返回内容：Keep-Alive<br /><br />Request.ServerVariables(&quot;Http_Cookie&quot;)<br /><br />Request.ServerVariables(&quot;Http_User_Agent&quot;)<br />返回内容：Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)<br /><br />Request.ServerVariables(&quot;Https_Keysize&quot;)<br />安全套接字层连接关键字的位数，如128<br /><br />Request.ServerVariables(&quot;Https_Secretkeysize&quot;)<br /><br />服务器验证私人关键字的位数如1024<br /><br />Request.ServerVariables(&quot;Https_Server_Issuer&quot;)<br />服务器证书的发行者字段<br /><br />Request.ServerVariables(&quot;Https_Server_Subject&quot;)<br />服务器证书的主题字段<br /><br />Request.ServerVariables(&quot;Auth_Password&quot;)<br />当使用基本验证模式时，客户在密码对话框中输入的密码<br /><br />Request.ServerVariables(&quot;Auth_Type&quot;)<br />是用户访问受保护的脚本时，服务器用於检验用户的验证方法<br /><br />Request.ServerVariables(&quot;Auth_User&quot;)<br />代证的用户名<br /><br />Request.ServerVariables(&quot;Cert_Cookie&quot;)<br />唯一的客户证书ID号<br /><br />Request.ServerVariables(&quot;Cert_Flag&quot;)<br />客户证书标志，如有客户端证书，则bit0为0如果客户端证书验证无效，bit1被设置为1<br /><br />Request.ServerVariables(&quot;Cert_Issuer&quot;)<br />用户证书中的发行者字段<br /><br />Request.ServerVariables(&quot;Cert_Keysize&quot;)<br />安全套接字层连接关键字的位数，如128<br /><br />Request.ServerVariables(&quot;Cert_Secretkeysize&quot;)<br />服务器验证私人关键字的位数如1024<br /><br />Request.ServerVariables(&quot;Cert_Serialnumber&quot;)<br />客户证书的序列号字段<br /><br />Request.ServerVariables(&quot;Cert_Server_Issuer&quot;)<br />服务器证书的发行者字段<br /><br />Request.ServerVariables(&quot;Cert_Server_Subject&quot;)<br />服务器证书的主题字段<br /><br />Request.ServerVariables(&quot;Cert_Subject&quot;)<br />客户端证书的主题字段<br /><br />Request.ServerVariables(&quot;Content_Type&quot;)<br />客户发送的form内容或HTTPPUT的数据类型<br />]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=97" /> 
	  <id>http://www.nmju.net/default.asp?id=97</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Sql2000 和 Sql2005 删除或缩小数据库日志的方法(解决内存占用高)]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=8" label="DataBase" /> 
	  <updated>2008-09-13T16:27:13+08:00</updated>
	  <published>2008-09-13T16:27:13+08:00</published>
		  <summary type="html"><![CDATA[<p>sql2000删除数据库日志有两种方法<br /><strong>
<h3><strong>一种方法：清空日志。</strong></h3>
<p><br />1.现将日志干掉：&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backup&nbsp;&nbsp; log&nbsp;&nbsp; yourdatabasename&nbsp;&nbsp; with&nbsp;&nbsp;&nbsp;&nbsp; no_log&nbsp;&nbsp; /*清除日志*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbcc&nbsp;&nbsp; shrinkdatabase&nbsp;&nbsp; ('yourdatabasename')&nbsp;&nbsp; /*收缩数据库*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go&nbsp;&nbsp; <br />2.如果数据库的恢复模型为&ldquo;简单&rdquo;，那么在数据库属性里将&ldquo;自动收缩&rdquo;激活&nbsp;&nbsp; <br />3.如果数据库的恢复模型为&ldquo;完全&rdquo;，假设你不需日志备份恢复，则将恢复模型改为&ldquo;简单&rdquo;，万事大吉，否则做一个自动截断日志的job，定期调度！</p>
</strong></p>
<p><br />在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了</p>
<h3>另一种方法有一定的风险性</h3>
<p>因为SQL SERVER的日志文件不是即时写入数据库主文件的，如处理不当，会造成数据的损失。<br />1: 删除LOG<br />分离数据库 企业管理器－＞服务器－＞数据库－＞右键－＞分离数据库<br />2：删除LOG文件<br />附加数据库 企业管理器－＞服务器－＞数据库－＞右键－＞附加数据库<br />此法生成新的LOG，大小只有500多K。<br />注意：建议使用第一种方法。<br />如果以后,不想要它变大。<br />SQL2000下使用：<br />在数据库上点右键-&gt;属性-&gt;选项-&gt;故障恢复-模型-选择-简单模型。<br />或用SQL语句：<br />alter database 数据库名 set recovery simple</p>
<p><br />sql2005的方法如下：</p>
<p>1打开management studio</p>
<p>2服务器名上右键-&gt;Nnew Query</p>
<p>3在右面出现的SQLQuery1.sql界面输入DUMP TRANSACTION 数据库名 WITH NO_LOG，再点击执行按钮执行<br />4数据库名右键-&gt;task-&gt;shrink-》file。</p>
<p>选择日志文件,在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,</p>
<p>确定就可以了<br /></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=96" /> 
	  <id>http://www.nmju.net/default.asp?id=96</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[两个高效的ASP分页函数（统计记录数，分页提取记录）]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=7" label="ASP/PHP" /> 
	  <updated>2008-09-12T13:47:19+08:00</updated>
	  <published>2008-09-12T13:47:19+08:00</published>
		  <summary type="html"><![CDATA[<p>&lt;%<br />'&nbsp;&nbsp;&nbsp; /*智能返回分页SQL语句*/<br />'&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />'&nbsp;&nbsp;&nbsp; /// 功能:智能返回分页SQL语句<br />'&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;primaryKey&quot;&gt;主键（不能为空）&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;queryFields&quot;&gt;提取字段（不能为空）&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;tableName&quot;&gt;表（理论上允许多表）&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;condition&quot;&gt;条件（可以空）&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;OrderBy&quot;&gt;排序，格式：字段名+&quot;&quot;+ASC（可以空）&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;pageSize&quot;&gt;分页数（不能为空）&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;pageIndex&quot;&gt;当前页，起始为：1（不能为空）&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;<br />Public Function GetPageListSql( primaryKey,&nbsp; queryFields,&nbsp; tableName,&nbsp; condition,&nbsp; orderBy,&nbsp; pageSize,&nbsp; pageIndex)</p>
<p>Dim strTmp,SqlSelect,SqlPrimaryKeySelect,strOrderBy,strWhere,strTop,pageindexsize<br />&nbsp;strTmp=&quot;&quot;<br />'//---strTmp用于返回的SQL语句<br />&nbsp;SqlSelect = &quot;&quot;<br />&nbsp;SqlPrimaryKeySelect = &quot;&quot;<br />&nbsp;strOrderBy = &quot;&quot;<br />&nbsp;strWhere = &quot; where 1=1 &quot;<br />&nbsp;strTop = &quot;&quot;<br />&nbsp;pageindexsize = 0</p>
<p>'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //0：分页数量<br />'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //1:提取字段<br />'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //2:表<br />'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3:条件<br />'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4:主键不存在的记录<br />'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //5:排序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlSelect = &quot; select top {0} {1} from {2} {3} {4} {5}&quot;<br />&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //0:主键<br />&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //1:TOP数量,为分页数*(排序号-1)<br />&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //2:表<br />&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3:条件<br />&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4:排序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlPrimaryKeySelect = &quot; and {0} not in (select {1} {0} from {2} {3} {4}) &quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if orderBy &lt;&gt; &quot;&quot; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strOrderBy = &quot; order by &quot;&amp;orderBy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End if<br />&nbsp;&nbsp;&nbsp;&nbsp; if condition &lt;&gt; &quot;&quot; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strWhere =strWhere&amp;&quot; and &quot;&amp;condition<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageindexsize = (pageIndex - 1) * pageSize<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cint(pageindexsize) &gt; 0 then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strTop = &quot; top &quot; &amp; pageindexsize</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlPrimaryKeySelect = Replace(Replace(Replace(Replace(Replace(SqlPrimaryKeySelect,&quot;{0}&quot;, primaryKey),&quot;{1}&quot;, strTop),&quot;{2}&quot;, tableName),&quot;{3}&quot;, strWhere),&quot;{4}&quot;, strOrderBy)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strTmp = Replace(Replace(Replace(Replace(Replace(Replace(SqlSelect,&quot;{0}&quot;, pageSize),&quot;{1}&quot;, queryFields),&quot;{2}&quot;, tableName),&quot;{3}&quot;, strWhere),&quot;{4}&quot;, SqlPrimaryKeySelect),&quot;{5}&quot;, strOrderBy)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strTmp = Replace(Replace(Replace(Replace(Replace(Replace(SqlSelect,&quot;{0}&quot;, pageSize),&quot;{1}&quot;, queryFields),&quot;{2}&quot;, tableName),&quot;{3}&quot;, strWhere),&quot;{4}&quot;, &quot;&quot;),&quot;{5}&quot;, strOrderBy)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetPageListSql= strTmp</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />End Function </p>
<p>'&nbsp;&nbsp;&nbsp; /*分页查询数据记录总数获取*/<br />'&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />'&nbsp;&nbsp;&nbsp; ///功能: 分页查询数据记录总数获取<br />'&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;ptbName&quot;&gt;----要显示的表或多个表的连接&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;pID&quot;&gt;----主表的主键&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;pstrCondition&quot;&gt;----查询条件,不需where&lt;/param&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />'&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;pDist&quot;&gt;----是否添加查询字段的 DISTINCT 默认0不添加/1添加&lt;/param&gt;<br />'&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;<br />Public Function GetPageListCounts( pID,&nbsp; ptbName,&nbsp; pstrCondition,&nbsp; pDist)</p>
<p>'&nbsp; //---存放取得查询结果总数的查询语句&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //---对含有DISTINCT的查询进行SQL构造<br />'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //---对含有DISTINCT的总数查询进行SQL构造<br />Dim strTmp,SqlSelect,SqlCounts<br />&nbsp; strTmp = &quot;&quot;<br />&nbsp; SqlSelect = &quot;&quot;<br />&nbsp; SqlCounts = &quot;&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if CInt(pDist) = 0 then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlSelect = &quot;Select &quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCounts = &quot;COUNT(*)&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlSelect = &quot;Select DISTINCT &quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCounts = &quot;COUNT(DISTINCT &quot; &amp; pID&amp; &quot;)&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if pstrCondition =&quot;&quot; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strTmp = SqlSelect &amp; &quot; &quot;&amp; SqlCounts &amp; &quot; FROM &quot; &amp; ptbName &amp; &quot;&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strTmp = SqlSelect &amp; &quot; &quot; &amp; SqlCounts &amp; &quot; FROM &quot;&amp; ptbName&amp; &quot; Where (1=1) and &quot; &amp; pstrCondition<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetPageListCounts= strTmp</p>
<p>End Function </p>
<p>&nbsp;</p>
<p>%&gt;</p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=95" /> 
	  <id>http://www.nmju.net/default.asp?id=95</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Win2003下IIS安全配置整理三]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=14" label="Server" /> 
	  <updated>2008-09-12T09:29:16+08:00</updated>
	  <published>2008-09-12T09:29:16+08:00</published>
		  <summary type="html"><![CDATA[<p>三、系统权限的设置 <br />１、磁盘权限 <br />　　系统盘及所有磁盘只给 Administrators 组和 SYSTEM 的完全控制权限 <br />　　系统盘Documents and Settings 目录只给 Administrators 组和 SYSTEM 的完全控制权限 <br />　　系统盘Documents and SettingsAll Users 目录只给 Administrators 组和 SYSTEM 的完全控制权限 <br />　　系统盘WindowsSystem32cacls.exe、cmd.exe、net.exe、net1.exe、<a href="ftp://ftp.exe">ftp.exe</a>、tftp.exe、telnet.exe 、 netstat.exe、regedit.exe、at.exe、attrib.exe、format.com、del文件只给 Administrators 组和SYSTEM 的完全 控制权限 <br />另将System32cmd.exe、format.com、<a href="ftp://ftp.exe">ftp.exe</a>转移到其他目录或更名 <br />　　Documents and Settings下所有些目录都设置只给adinistrators权限。并且要一个一个目录查看，包括下面的所有子目录。 <br />删除c:inetpub目录 <br />２、本地安全策略设置 <br />　　开始菜单&mdash;&gt;管理工具&mdash;&gt;本地安全策略 <br />　　A、本地策略&mdash;&mdash;&gt;审核策略 <br />　　审核策略更改　　　成功　失败　　 <br />　　审核登录事件　　　成功　失败 <br />　　审核对象访问　　　　　　失败 <br /></p>
<p><br />　　审核过程跟踪　　　无审核 <br />　　审核目录服务访问　　　　失败 <br />　　审核特权使用　　　　　　失败 <br />　　审核系统事件　　　成功　失败 <br />　　审核账户登录事件　成功　失败 <br />　　审核账户管理　　　成功　失败 <br />　　B、本地策略&mdash;&mdash;&gt;用户权限分配 <br />　　关闭系统：只有Administrators组、其它全部删除。 <br />　　通过终端服务允许登陆：只加入Administrators,Remote Desktop Users组，其他全部删除 <br />　　C、本地策略&mdash;&mdash;&gt;安全选项 <br />　　交互式登陆：不显示上次的用户名　　　　　　　启用 <br />　　网络访问：不允许SAM帐户和共享的匿名枚举　 启用 <br />　　网络访问：不允许为网络身份验证储存凭证　　　启用 <br />　　网络访问：可匿名访问的共享　　　　　　　　　全部删除 <br />　　网络访问：可匿名访问的命　　　　　　　　　　全部删除 <br />　　网络访问：可远程访问的注册表路径　　　　　　全部删除 <br />　　网络访问：可远程访问的注册表路径和子路径　　全部删除 <br />　　帐户：重命名来宾帐户　　　　　　　　　　　　重命名一个帐户 <br />　　帐户：重命名系统管理员帐户　　　　　　　　　重命名一个帐户 网管u家u.bitsCN.com <br />３、禁用不必要的服务 开始-运行-services.msc <br />TCP/IPNetBIOS Helper提供 TCP/IP 服务上的 NetBIOS 和网络上客户端的 NetBIOS 名称解析的支持而使用户能够共享 <br />文件、打印和登录到网络 <br />Server支持此计算机通过网络的文件、打印、和命名管道共享 <br />　　Computer Browser 维护网络上计算机的最新列表以及提供这个列表 <br />Task scheduler 允许程序在指定时间运行 <br />Messenger 传输客户端和服务器之间的 NET SEND 和 警报器服务消息 <br />　　Distributed File System: 局域网管理共享文件，不需要可禁用 <br />　　Distributed linktracking client：用于局域网更新连接信息，不需要可禁用 <br />　　Error reporting service：禁止发送错误报告 <br />　　Microsoft Serch：提供快速的单词搜索，不需要可禁用 <br />　　NTLMSecuritysupportprovide：telnet服务和Microsoft Serch用的，不需要可禁用 <br />　　PrintSpooler：如果没有打印机可禁用 <br />　　Remote Registry：禁止远程修改注册表 <br />　　Remote Desktop Help Session Manager：禁止远程协助 <br />Workstation 关闭的话远程NET命令列不出用户组 <br />　　以上是在Windows Server 2003 系统上面默认启动的服务中禁用的，默认禁用的服务如没特别需要的话不要启动。 <br /></p>
<p><br />４、修改注册表 <br />修改注册表，让系统更强壮 <br />1) 隐藏重要文件/目录可以修改注册表实现完全隐藏 <br />HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows Current-VersionExplorerAdvancedFolderHi-ddenSHOWALL&rdquo;，鼠标右击 &ldquo;CheckedValue&rdquo;，选择修改，把数值由1改为0 <br />2) 防止SYN洪水攻击 <br />HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters <br />新建DWORD值，名为SynAttackProtect，值为2 <br />新建EnablePMTUDiscovery REG_DWORD 0 <br />新建NoNameReleaseOnDemand REG_DWORD 1 <br />新建EnableDeadGWDetect REG_DWORD 0 <br />新建KeepAliveTime REG_DWORD 300,000 <br />新建PerformRouterDiscovery REG_DWORD 0 <br />新建EnableICMPRedirects REG_DWORD 0 <br />3) 禁止响应ICMP路由通告报文 <br />HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersInterfacesinterface <br />新建DWORD值，名为PerformRouterDiscovery 值为0 <br />4) 防止ICMP重定向报文的攻击 <br />HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters <br />将EnableICMPRedirects 值设为0 <br />5) 不支持IGMP协议 <br />HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters <br /></p>
<p><br />新建DWORD值，名为IGMPLevel 值为0 <br />6) 禁止Ipc空连接： <br />cracker可以利用net use命令建立空连接，进而入侵，还有net view，nbtstat这些都是基于空连接的，禁止空连接就好了。 <br />Local_MachineSystemCurrentControlSetControlLSA-RestrictAnonymous 把这个值改成&rdquo;1&rdquo;即可。 <br />7) 更改TTL值 <br />cracker可以根据ping回的TTL值来大致判断你的操作系统，如： <br />TTL=107(WINNT); <br />TTL=108(win2000); <br />TTL=127或128(win9x); <br />TTL=240或241(linux); <br />TTL=252(solaris); <br />TTL=240(Irix); <br />实际上你可以自己改的：HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters：DefaultTTL REG_DWORD 0-0xff(0-255 十进制,默认值128)改成一个莫名其妙的数字如258，起码让那些小菜鸟晕上半天，就此放弃入侵你也不一定哦 <br />8) 删除默认共享 <br />有人问过我一开机就共享所有盘，改回来以后，重启又变成了共享是怎么回事，这是2K为管理而设置的默认共享，HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParameters：AutoShareServer类型是REG_DWORD把值改为0即可 <br />9) 禁止建立空连接 <br />默认情况下，任何用户通过通过空连接连上服务器，进而枚举出帐号，猜测密码。我们可以通过修改注册表来禁止建立空连接： <br /></p>
<p>Local_MachineSystemCurrentControlSetControlLSA-RestrictAnonymous 的值改成&rdquo;1&rdquo;即可。 <br />10) 建立一个记事本，填上以下代码。保存为*.bat并加到启动项目中 <br />net share c$ /del <br />net share d$ /del <br />net share e$ /del <br />net share f$ /del <br />net share ipc$ /del <br />net share admin$ /del <br />5、IIS站点设置： <br />1) 将IIS目录＆数据与系统磁盘分开，保存在专用磁盘空间内； <br />2) 启用父级路径； <br />3) 在IIS管理器中删除必须之外的任何没有用到的映射（保留asp等必要映射即可）； <br />4) 在IIS中将HTTP404 Object Not Found出错页面通过URL重定向到一个定制HTM文件； <br />5) Web站点权限设定（建议）： <br />读 允许 <br />写 不允许 <br />脚本源访问 不允许 <br />目录浏览 建议关闭 <br />日志访问 建议关闭 <br />索引资源 建议关闭 <br />执行 推荐选择 &ldquo;仅限于脚本&rdquo; 。 <br />6) 建议使用W3C扩充日志文件格式，每天记录客户IP地址，用户名，服务器端口，方法，URI字根，HTTP状态，用户代理，而且每天均要审查日志。（最好不要使用缺省的目录，建议更换一个记日志的路径，同时设置日志的访问权限，只允许管理员和system为Full Control）。 <br /></p>
<p>7) 程序安全: <br />A. 涉及用户名与口令的程序最好封装在服务器端，尽量少的在ASP文件里出现，涉及到与数据库连接地用户名与口令应给予最小的权限; <br />B. 需要经过验证的ASP页面，可跟踪上一个页面的文件名，只有从上一页面转进来的会话才能读取这个页面; <br />C. 防止ASP主页.inc文件泄露问题; <br />D. 防止UE等编辑器生成some.asp.bak文件泄露问题。 <br />6、IIS权限设置的思路 <br />1) 要为每个独立的要保护的个体（比如一个网站或者一个虚拟目录）创建一个系统用户，让这个站点在系统中具有惟一的可以设置权限的身份。 <br />2) 在IIS的【站点属性或者虚拟目录属性&rarr;目录安全性&rarr;匿名访问和验证控制&rarr;编辑&rarr;匿名访问&rarr;编辑】填写刚刚创建的那个用户名。 <br />3) 设置所有的分区禁止这个用户访问，而刚才这个站点的主目录对应的那个文件夹设置允许这个用户访问（要去掉继承父权限，并且要加上超管组和SYSTEM组）。 <br />7、卸载最不安全的组件 <br />最简单的办法是直接卸载后删除相应的程序文件。将下面的代码保存为一个.BAT文件，( 以下均以 WIN2000 为例，如果使用2003，则系统文件夹应该是 C:WINDOWS ) <br /></p>
<p>regsvr32/u C:WINDOWSSystem32wshom.ocx <br />del C:WINDOWSSystem32wshom.ocx <br />regsvr32/u C:WINDOWSsystem32shell32.dll <br />del C:WINNTWINDOWSshell32.dll </p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=94" /> 
	  <id>http://www.nmju.net/default.asp?id=94</id>
  </entry>	
		
</feed>
