﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Lhdyesok</title><link>http://www.cnblogs.com/Lhdyesok/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 04 Jul 2009 22:08:52 GMT</lastBuildDate><pubDate>Sat, 04 Jul 2009 22:08:52 GMT</pubDate><ttl>60</ttl><item><title>Log4Net 开发文档 </title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347795.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Thu, 04 Dec 2008 09:53:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347795.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1347795.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1347795.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1347795.html</trackback:ping><description><![CDATA[摘要: 目录1.1 log4net的简要说明，在具体项目中扮演的功能角色。1.2 Log4net 组成结构说明1.3 Log4net配置文件解析1.4 举一个实际的例子，阐述Log4net的完整的实现流程1.1 log4net的简要说明，在具体项目中扮演的功能角色。Log4net 是一个第三方开源组件，它设计的主要目的是组合，生成日志信息，同时将配置保存到各种存储介质或者展现平台中，在实际项目中，Log4&nbsp;&nbsp;<a href='http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347795.html'>阅读全文</a><img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1347795.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>面向对象的开发方法(Object Oriented,OO）</title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347789.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Thu, 04 Dec 2008 09:48:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347789.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1347789.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347789.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1347789.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1347789.html</trackback:ping><description><![CDATA[摘要: 现在每个程序员都会说：OO思想，OO开发，呵呵，是真的理解了嘛？看看下面的文章就知道啦。。。面向对象的开发方法(Object Oriented,OO） 从事软件开发的工程师们常常有这样的体会：在软件开发过程中，使用者会不断地提出各种更改要求，即使在软件投入使用后，也常常需要对其做出修改，在用结构化开发的程序中，这种修改往往是很困难的，而且还会因为计划或考虑不周，不但旧错误没有得到彻底改正，又引入了&nbsp;&nbsp;<a href='http://www.cnblogs.com/Lhdyesok/archive/2008/12/04/1347789.html'>阅读全文</a><img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1347789.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>基于Lucene.net开源搜索 浅谈</title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/08/21/1272676.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Wed, 20 Aug 2008 19:16:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/08/21/1272676.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1272676.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/08/21/1272676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1272676.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1272676.html</trackback:ping><description><![CDATA[<p>转载,文章来源:<a href="http://blog.csdn.net/akunshenjk/archive/2008/03/28/2226040.aspx">http://blog.csdn.net/akunshenjk/archive/2008/03/28/2226040.aspx</a></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 早在一年前我就曾接触到Lucene.net 当时版本为1.9.1 .004&nbsp;;当时学习该框架时，正赶上它宣布进去商业化，可能不会再出更高版本了；后来不知道什么原因，又重新开源，并出了新版本(2.0.0.004)，也是一年前的事了。刚接触Lucene,net的目的是改善网站的搜索，提高搜索效率。由于lucene是有java开源框架迁移过来的，所以相关资料大多是java的文档，相关文档基本是英文，所以当时学习的时候是比较吃力的。最后经过两个星期的奋斗，总算是把lucenet.net的脾性摸清楚了，并且做出来了相应的程序。可是，用了不多一个星期，发现写的程序并没有提升搜索效率，很是失望；同事决定弃用lucenet.net,换用其它方式。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近网站的数据量越来越大，搜索的效率再次成了大问题。于是又回到Lucene.net上，这次当然要用新版本(2.0.0.004),结果其与1.9.1.004版本有一些差别。先将这次学习经验盘点如下：</p>
<p>一.创建索引：IndexWriter&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 其构造函数：</p>
<p>&nbsp;</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IndexWriter(&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;path,&nbsp;&nbsp;&nbsp;Analyzer&nbsp;a,&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;create);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IndexWriter(&nbsp;&nbsp;&nbsp;FileInfo&nbsp;path,&nbsp;&nbsp;&nbsp;Analyzer&nbsp;a,&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;create);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IndexWriter(&nbsp;&nbsp;&nbsp;Directory&nbsp;d,&nbsp;&nbsp;&nbsp;Analyzer&nbsp;a,&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;create);</span></div>
</div>
<p>&nbsp;</p>
<p>我们常用的是第一个构造函数。string path 为索引所在目录，如：D:\search\index; Analyzer a是选用词语分析器；如&nbsp;<span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StandardAnalyzer()；最后一个参数是表示是否需要重新创建，如果是初次创建索引，则用true，否则一般为false。</span></p>
<p><span style="color: #000000">所以创建索引可以按如下写：</span>创建新的文档：<br />
Document doc = new Document();</p>
<p>&nbsp;</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">索引已存在,则直接打开&nbsp;否则创建,并打开</span></div>
<div><span style="color: #008000">//<span style="color: #0000ff">this</span><span style="color: #000000">.m_strIndexPath 为索引目录</span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">IndexWriter&nbsp;m_writer&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IndexWriter(</span><span style="color: #0000ff">this</span><span style="color: #000000">.m_strIndexPath,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Lucene.Net.Analysis.Standard.StandardAnalyzer(),&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">System.IO.File.Exists(&nbsp;System.IO.Path.Combine(</span><span style="color: #0000ff">this</span><span style="color: #000000">.m_strIndexPath,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">segments</span><span style="color: #000000">"</span><span style="color: #000000">)));<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<p>二.创建文档(Lucene.Net.Documents)<br />
构造函数:</p>
<p>&nbsp;</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Document();</span></div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>主要方法有:<br />
<table style="width: 574px; height: 63px" cellspacing="1" cellpadding="1" width="574" summary="" border="1">
    <tr>
            <td>Add()</td>
            <td>增加索引</td>
        </tr>
        <tr>
            <td>Get()</td>
            <td>获取索引字段存储的值</td>
        </tr>
        <tr>
            <td>GetBoost()</td>
            <td>获取权重</td>
        </tr>
        <tr>
            <td>SetBoost()</td>
            <td>设置权重</td>
        </tr>
        <tr>
            <td>GetField()</td>
            <td>返回赋予字段的名</td>
        </tr>
        <tr>
            <td>RemoveField()</td>
            <td>从文档中删除特定名的字段</td>
        </tr>
    </table>
</p>
<p>三.字段(域)Fields<br />
构造函数:</p>
<p>&nbsp;</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Field(&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;value_Renamed,&nbsp;&nbsp;&nbsp;Store&nbsp;store);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Field(&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;&nbsp;&nbsp;TextReader&nbsp;reader);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Field(&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;&nbsp;&nbsp;TextReader&nbsp;reader,&nbsp;&nbsp;&nbsp;TermVector&nbsp;termVector);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Field(&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;value_Renamed,&nbsp;&nbsp;&nbsp;Store&nbsp;store,&nbsp;&nbsp;&nbsp;Index&nbsp;index);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Field(&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;value_Renamed,&nbsp;&nbsp;&nbsp;Store&nbsp;store,&nbsp;&nbsp;&nbsp;Index&nbsp;index,&nbsp;&nbsp;&nbsp;TermVector&nbsp;termVector);</span></div>
</div>
<p>&nbsp;</p>
<p>string name 为字段名, string value_Renamed 字段对应的值,Store 对应有YES 和NO,YES则存储对应值，否则不存储;Field.Index对应有四个值，这对我们创建索引以及优化有很大的帮助.<br />
<table style="width: 577px; height: 96px" cellspacing="1" cellpadding="1" width="577" summary="" border="1">
    <tr>
            <td>NO</td>
            <td>不把字段值编入索引,因此该字段不会被搜索到</td>
        </tr>
        <tr>
            <td>NO_NORMS</td>
            <td>不使用分析器将字段值编入索引,不会按规范存储,它的优点是占用空间少</td>
        </tr>
        <tr>
            <td>TOKENIZED </td>
            <td>将字段值编入索引,并可以被搜索到，在这个规则被存储在索引之前，有一个分析会被用用来标志这个正文，或者可能的话，使这个正文更加正规化，这对于普通文本是非常有用的。</td>
        </tr>
        <tr>
            <td>UN_TOKENIZED </td>
            <td>不使用分析器将字段值编入索引,因此它可以被搜索到, 没有使用分析器，值将被存储为单独的项目，这对唯一的ID是非常有用的，比如产品数量</td>
        </tr>
    </table>
</p>
<p>四.搜索（示例）<br />
</p>
<p>&nbsp;</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">System.DateTime&nbsp;dt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.DateTime.Now;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />IndexSearcher&nbsp;searcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IndexSearcher(</span><span style="color: #000000">@"</span><span style="color: #000000">d:searchprovide</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;q</span><span style="color: #000000">=</span><span style="color: #000000">Keyword.Text;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />Query&nbsp;query1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;QueryParser.Parse(q,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">P_Name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StandardAnalyzer());<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />Hits&nbsp;hits</span><span style="color: #000000">=</span><span style="color: #000000">searcher.Search(query1);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />TimeSpan&nbsp;ts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.DateTime.Now.Subtract(dt);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ts.TotalMilliseconds.ToString()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">毫秒;Found&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;hits.Length()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;document(s)&nbsp;that&nbsp;matched&nbsp;query&nbsp;'</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;q&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">':&lt;br/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count</span><span style="color: #000000">=</span><span style="color: #000000">hits.Length();<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(count</span><span style="color: #000000">&gt;</span><span style="color: #000000">30</span><span style="color: #000000">)count</span><span style="color: #000000">=</span><span style="color: #000000">30</span><span style="color: #000000">;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;<br />
<img id="_499_614_Open_Image" onclick="this.style.display='none'; document.getElementById('_499_614_Open_Text').style.display='none'; document.getElementById('_499_614_Closed_Image').style.display='inline'; document.getElementById('_499_614_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="_499_614_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_499_614_Closed_Text').style.display='none'; document.getElementById('_499_614_Open_Image').style.display='inline'; document.getElementById('_499_614_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="_499_614_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_499_614_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hits.Doc(i);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results</span><span style="color: #000000">+=</span><span style="color: #000000">doc.Get(</span><span style="color: #000000">"</span><span style="color: #000000">HtmlPath</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results</span><span style="color: #000000">+=</span><span style="color: #000000">doc.Get(</span><span style="color: #000000">"</span><span style="color: #000000">ID</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />Label1.Text</span><span style="color: #000000">=</span><span style="color: #000000">results;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />searcher.Close();</span></div>
</div>
<p>&nbsp;</p>
<p>五，高亮显示查询结果</p>
<p>在Lucene.net2.0里有插件 Highlighter.Net,引入该插件，我们可以是搜索结果高亮显示。</p>
<p>示例:</p>
<p>&nbsp;</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Lucene.Net.Highlight;</span><span style="color: #008000">//</span><span style="color: #008000">引入<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">其它代码省略</span><span style="color: #008000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;QueryParser&nbsp;q&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryParser(</span><span style="color: #000000">"</span><span style="color: #000000">P_Name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;analyzer);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;Query&nbsp;query1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;q.Parse(Request[</span><span style="color: #000000">"</span><span style="color: #000000">bizKeyword</span><span style="color: #000000">"</span><span style="color: #000000">]);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;query.Add(query1,&nbsp;BooleanClause.Occur.MUST);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;Lucene.Net.Highlight.Formatter&nbsp;fm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleHTMLFormatter(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;span&nbsp;style="color:red;font-weight:bold"&gt;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;/span&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;highlighter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Highlighter(fm,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryScorer(query1));<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;highlighter.SetTextFragmenter(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleFragmenter(</span><span style="color: #000000">100</span><span style="color: #000000">));<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">中间代码省略<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">高亮显示</span><span style="color: #008000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;P_Name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;doc.Get(</span><span style="color: #000000">"</span><span style="color: #000000">P_Name</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;Lucene.Net.Analysis.TokenStream&nbsp;tokenStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;analyzer.TokenStream(</span><span style="color: #000000">"</span><span style="color: #000000">P_Name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;System.IO.StringReader(P_Name));<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;P_Name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;highlighter.GetBestFragments(tokenStream,&nbsp;P_Name,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">...</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&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;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
</div>
<p>&nbsp;</p>
<p>六.索引的实时更新(伪)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lucene.net是非常好用的一个开源搜索框架，但是很可惜它不支持读写并发操作。搜索的时候不能更新索引，更新索引的时候不能进行搜索。这对于数据经常要更新的场景，真可谓是致命的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在java下有人说：利用compass，hibernate实现lucene索引实时更新。我没试过，相应的资料也没找到。<br />
再说了据我所知,目前Compass还每有从Java迁移到.net，至于hibernate有.net版的 Nhibernate ，不过据说效率很成问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了解决这问题，我想了很多办法。最后我的解决办法很土，不过我认为还是很好用的。现将我的方法结束如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如我们要对产品进行建立索引，首先建议一份完整的索引，保存的目录A,再复制一份保存到目录B,A目录的主要作用就是在正常情况下提供搜索的索引目录，B目录则主要用于更新新的索引（包括删除废旧数据，修改，新增数据）；一旦更新操作完成，立即通知搜索更换目录到B目录，让删除A里的旧索引，并复制B里的最新索引到A目录。&nbsp; </p>
<p>这里之所以加一个&#8220;伪&#8221;字，我这里实现并不是实际意义的实时，这里还是有一定时间差的，因为Lucene.net优化索引比较耗时，我不可能每插入一条数据，就更新索引；我的做法是每间隔一段时间，待修改数据达到一定量时，再一起操作，更新索引，优化。这样也减少了很多I/O操作。</p>
<p>-------------------------------------------------</p>
<p>PS:今天搜索到一篇文章：<a href="http://blog.csdn.net/poson/archive/2008/03/21/2201880.aspx"><font color="#336699">http://blog.csdn.net/poson/archive/2008/03/21/2201880.aspx</font></a></p>
<p>里面简单的说了Lucenet.net的并发操作，如果其正确，那么我的文章里所说的&#8220;。搜索的时候不能更新索引，更新索引的时候不能进行搜索&#8221;则是错误。尽管如此，但有一点是肯定的：更新索引会耗用大量cpu资源。</p>
<img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1272676.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>数据库连接池〔翻译〕 </title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/07/05/1236164.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Sat, 05 Jul 2008 02:52:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/07/05/1236164.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1236164.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/07/05/1236164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1236164.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1236164.html</trackback:ping><description><![CDATA[原文：http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx<br />
<br />
<h4><span style="font-family: Comic Sans MS">1：合并数据库连接</span></h4>
&nbsp;&nbsp; 与数据库服务器建立连接是非常消耗系统资源的，如果某个系统需要查询某个数据库服务那么必须首先建立起与该数据库的连接然后再执行查询。<br />
&nbsp;&nbsp; 你是否能够感觉到当您在客户端使用相同的查询向服务器提交查询信息的时候结果的返回会越来越快。从服务器端将数据返回数据到客户端有一种机制产生了以上的结果，而这种机制就是在ADO之间建立连接<br />
&nbsp;&nbsp; 我们通常是把与数据库连接的信息存储在配置文件中，利用它在系统中频繁地打开与关闭与数据库的连接。这样我们不管是访问多大或多小的数据我们都是用的一样的连接。<br />
&nbsp;&nbsp; IIS中的ADO.NET有一种叫做连接池的技术是解决以上问题很好的方法。当应用程序第一次发生请求的时候建立与数据库的请求而当系统关闭数据库连接的时候。ADO.NET没有完全的销毁连接，而是把这个连接对象放到连接池中并保留对他的引用。当下一次发生请求的时候ADO.NET从连接池中调出连接运用到本次查询中。这样可以提高一定的效率。<br />
<br />
<h4>2：创建连接池</h4>
&nbsp;&nbsp; 连接池和连接字符串是紧密联系的。一个连接池有进程，应用程序域以及连接字符串来确定的。（<span id="intelliTXT" name="intelliTxt">process，</span><span id="intelliTXT" name="intelliTxt">domain ，</span><span id="intelliTXT" name="intelliTxt">connection string</span>）<br />
&nbsp;&nbsp; 当我们利用ADO.NET向数据库发送查询的时候，在相同的进程和应用程序域中ADO.NET利用确定的连接字符串匹配连接池中的连接对象。如果找到并且该连接空闲可用那么就得到该连接用于本次请求，否则就建立新的连接并把该连接添加到连接池中。在向连接池添加连接的时候不能超过连接池最大连接数量。<br />
&nbsp;&nbsp; 我们可以利用<span id="intelliTXT" name="intelliTxt">Close() or Dispose()方法在利用后立即销毁连接二而不是等到</span><span id="intelliTXT" name="intelliTxt">GC来释放连接消耗的资源。<br />
<br />
</span>
<h4><span id="intelliTXT" name="intelliTxt">3：删除和清理连接池</span></h4>
<h4></h4>
<span id="intelliTXT" name="intelliTxt">&nbsp;&nbsp; 当应用程序被卸载的时候连接池也随之销毁。在我们的</span><span id="intelliTXT" name="intelliTxt">ASP.NET系统中连接池在第一次请求的时候建立当重启IIS的时候销毁。连接池依赖于我们的IIS而不是我们的开发环境。因此你不能通过关闭DEV来销毁连接池。<br />
&nbsp;&nbsp; 在ADO2.0中新增了两个清理连接池的方法</span><span id="intelliTXT" name="intelliTxt"><strong>ClearAllPools，</strong></span><span id="intelliTXT" name="intelliTxt"><strong>ClearPool<br />
</strong></span><span id="intelliTXT" name="intelliTxt"><br />
</span>
<h4><span id="intelliTXT" name="intelliTxt">4：通过连接字符串来控制连接池</span></h4>
<h5></h5>
<span id="intelliTXT" name="intelliTxt">&nbsp;&nbsp; 下表列出连接字符串中有关连接池设置的选项</span> <br />
&nbsp;&nbsp;
<table height="431" cellspacing="2" cellpadding="2" width="1141" border="0">
    <tbody>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt"><strong>Name </strong></span></td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt"><strong>Default </strong></span></td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt"><strong>Description </strong></span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Connection Lifetime</span></td>
            <td>&nbsp;0</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">
            <p>When a connection is returned to the pool, its creation time is compared with the current time, and the connection is destroyed if that time span (in seconds) exceeds the value specified by <strong>Connection Lifetime</strong>. </p>
            <p>A value of zero (0) causes pooled connections to have the maximum connection timeout. </p>
            </span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Connection Timeout</span></td>
            <td>&nbsp;15</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Maximum Time (in Secs) to wait for a free connection from the tool</span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Enlist</span></td>
            <td>&nbsp;'true'</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">
            <p>When <strong>true</strong>, the pooler automatically enlists the connection in the creation thread's current transaction context. Recognized values are <strong>true</strong>, <strong>false</strong>, <strong>yes</strong>, and <strong>no</strong>. </p>
            <p>Set Enlist = "false" to ensure that connection is not context specific. </p>
            </span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Max Pool Size</span></td>
            <td>&nbsp;100</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">The maximum number of connections allowed in the pool.</span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Min Pool Size</span></td>
            <td>&nbsp;0</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">The minimum number of connections allowed in the pool.</span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Pooling</span></td>
            <td>&nbsp;'true'</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">When <strong>true</strong>, the <strong>SQLConnection</strong> object is drawn from the appropriate pool, or if it is required, is created and added to the appropriate pool. Recognized values are <strong>true</strong>, <strong>false</strong>, <strong>yes</strong>, and <strong>no</strong>.</span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Incr Pool Size</span></td>
            <td>&nbsp;5</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Controls the number of connections that are established when all the connections are used.</span></td>
        </tr>
        <tr>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Decr Pool Size</span></td>
            <td>&nbsp;1</td>
            <td>&nbsp;<span id="intelliTXT" name="intelliTxt">Controls the number of connections that are closed when an excessive amount of established connections are unused.</span></td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp; 除了注意以上列表以外还有一个需要注意的。我们在连接字符串中尽量利用USERID,PQSSWORD来建立连接，这样一个客户可以利用其他客户建立的连接。否则则会为每个客户建立连接。<br />
<br />
<h4>5：一个连接字符串的例子</h4>
<span id="intelliTXT" name="intelliTxt">&nbsp;&nbsp;&nbsp; initial catalog=Northwind; Data Source=localhost; Connection Timeout=30; User Id=MYUSER; Password=PASSWORD; Min Pool Size=20; Max Pool Size=200; Incr Pool Size=10; Decr Pool Size=5;<br />
<br />
</span>
<h4><span id="intelliTXT" name="intelliTxt">6：查看用ADO.NET建立的连接池</span></h4>
<h4></h4>
<span id="intelliTXT" name="intelliTxt">&nbsp;&nbsp;&nbsp; 在MS SQLSERVER中，打开查询分析器执行</span><span id="intelliTXT" name="intelliTxt">EXEC SP_WHO<br />
&nbsp;&nbsp;&nbsp; 在ORACLE中，打开类似PL/SQL的客户端工具执行</span><span id="intelliTXT" name="intelliTxt">SELECT * FROM V$SESSION WHERE PROGRAM IS NOT NULL<br />
&nbsp;&nbsp;&nbsp; <br />
</span>
<h4><span id="intelliTXT" name="intelliTxt">7：连接池中常见的异常</span></h4>
<h4></h4>
<span id="intelliTXT" name="intelliTxt">&nbsp;&nbsp;&nbsp; </span><span id="intelliTXT" name="intelliTxt"><em><strong>Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached<br />
</strong></em></span><span id="intelliTXT" name="intelliTxt">&nbsp;&nbsp;&nbsp; 问题描述：我们获取连接超过连接池最大值时产生如上异常。通常连接池最大值为100。当我们获取连接超过最大值时，ADO.NET等待连接池返回连接而超时，这样将抛出如上异常<br />
&nbsp;&nbsp;&nbsp; 解决办法：首先要做的是在我们使用连接后立即关闭连接。如果没有关闭连接那么连接将保存到连接池中知道GC来销毁。这种情况下你以为连接池没有到达最大值但实际上连接池已经到达了最大值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其次我们可以通过连接字符串中的</span><span id="intelliTXT" name="intelliTxt">Max Pool Size = N;来动态扩大连接池中的连接</span><span id="intelliTXT" name="intelliTxt">最大</span><span id="intelliTXT" name="intelliTxt">数量。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在者就是关闭连接池<br />
&nbsp;&nbsp;&nbsp; </span><span id="intelliTXT" name="intelliTxt"><em><strong>A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - Shared Memory Provider: )<br />
</strong></em></span><span id="intelliTXT" name="intelliTxt">&nbsp;&nbsp;&nbsp; 问题描述：ADO.NET以为数据库存在某一确定连接但是数据库由于重启而丢失了所有连接。<br />
&nbsp;&nbsp;&nbsp; 解决办法：对于ORACLE如果你用ODP，NET访问数据库那么你应该在连接字符串里加上</span><span id="intelliTXT" name="intelliTxt"><em>Validate Connection=true</em></span><span id="intelliTXT" name="intelliTxt"><em>或</em></span><span id="intelliTXT" name="intelliTxt"><em>validcon=true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em></span><span id="intelliTXT" name="intelliTxt">对于对于MS SQLSERVER，你可以用</span><span id="intelliTXT" name="intelliTxt">SqlConnection.ClearPool静态方法清除连接池。该方法在</span><span id="intelliTXT" name="intelliTxt">SqlClient，</span><span id="intelliTXT" name="intelliTxt">OracleClient 中都有。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于.net1.1下的MS SQLSERVER<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a：重建连接池销毁无用连接池<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b：捕获异常循环刷新连接直到ADO.</span>
<img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1236164.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>转载“internet explorer 无法打开 interne 站点  已终止操作”错误的问题解决</title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/06/17/1223433.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Mon, 16 Jun 2008 16:39:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/06/17/1223433.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1223433.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/06/17/1223433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1223433.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1223433.html</trackback:ping><description><![CDATA[<code id="code0">打开网页时，提示&#8220;internet explore 无法打开internet站点...，已终止操作&#8221;，<br />
曾以为是application 的原因，百思不得其解<br />
今天晚上找遍了<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=google">google</span>、baidu、sogou，还是一无所获<br />
看原页面代码，查找是否 DIV 没有结束，又不是。最后只能判断是JS 的问题了。<br />
不错，正是js引发的错误。<br />
由于页面中用到了下拉条，而且，微软把 select 的属性值设得太高了，层是没办法把他遮挡住的。只能用错就错在 &lt;iframe 这里了，页面还没完成，就跑 &lt;iframe ，&lt;iframe 还没引发完成就跳转，导致游览器中断，所以就出现了 &#8220;internet explore 无法打开internet站点...，已终止操作&#8221;，<br />
如下就是网页中用到的js，<br />
function openShim(menu,menuItem)<br />
{<br />
&nbsp; &nbsp;if (menu==null) return;<br />
&nbsp; &nbsp; var shim = getShim(menu);<br />
&nbsp; &nbsp; if (shim==null) shim = createMenuShim(menu,getShimId(menu));<br />
----------------------------------------------------------------------------------------<br />
只要稍微修改为以下就可以了<br />
function openShim(menu,menuItem)<br />
{<br />
if (document.readyState!="complete") return ;&nbsp;&nbsp;<br />
&nbsp;&nbsp;if (menu==null) return;<br />
&nbsp; &nbsp; var shim = getShim(menu);<br />
&nbsp; &nbsp; if (shim==null) shim = createMenuShim(menu,getShimId(menu));<br />
。。。。<br />
即加上一个载入判断就可以了。 if (document.readyState!="complete") return ; <br />
&#8220;internet explore 无法打开internet站点...，已终止操作&#8221;，从此消失<br />
另：遮掩 select 的方法还可以用如下：<br />
var allselect = document.getElementsByTagName("select");<br />
for (var i=0; i {<br />
&nbsp;&nbsp;allselect[i].style.visibility = "none";<br />
}<br />
或者用window.onload=function(){}<br />
也是可以的<br />
</code><br />
<br />
文章来源：<font face="Verdana">http://www.cnblogs.com/xin478/archive/2007/07/27/833129.html</font>
<img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1223433.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>海量数据的查询</title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/05/20/1202928.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Mon, 19 May 2008 16:54:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/05/20/1202928.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1202928.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/05/20/1202928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1202928.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1202928.html</trackback:ping><description><![CDATA[很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如：<br />
select * from table1 where name='zhangsan' and tID &gt; 10000<br />
　和执行:<br />
select * from table1 where tID &gt; 10000 and name='zhangsan'<br />
　　一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了；而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID&gt;10000来提出查询结果。<br />
　　事实上,这样的担心是不必要的。SQL SERVER中有一个&#8220;查询分析优化器&#8221;,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。<br />
　　虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下&#8220;查询优化器&#8221;的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。<br />
　　在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG）,那么就称之为可优化的,并且可以利用索引快速获得所需数据。<br />
　　SARG的定义：用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下：<br />
列名 操作符 &lt;常数 或 变量&gt;<br />
或<br />
&lt;常数 或 变量&gt; 操作符列名<br />
　　列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如：<br />
Name=&#8217;张三&#8217;<br />
价格&gt;5000<br />
5000&lt;价格<br />
Name=&#8217;张三&#8217; and 价格&gt;5000<br />
　　如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足Where子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。<br />
　　介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验：<br />
　　1、Like语句是否属于SARG取决于所使用的通配符的类型<br />
　　如：name like &#8216;张%&#8217; ,这就属于SARG<br />
　　而：name like &#8216;%张&#8217; ,就不属于SARG。<br />
　　原因是通配符%在字符串的开通使得索引无法使用。<br />
　　2、or 会引起全表扫描<br />
Name=&#8217;张三&#8217; and 价格&gt;5000 符号SARG,而：Name=&#8217;张三&#8217; or 价格&gt;5000 则不符合SARG。使用or会引起全表扫描。<br />
　　3、非操作符、函数引起的不满足SARG形式的语句<br />
　　不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如：NOT、!=、&lt;&gt;、!&lt;、!&gt;、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子：<br />
ABS(价格)&lt;5000<br />
Name like &#8216;%三&#8217;<br />
　　有些表达式,如：<br />
Where 价格*2&gt;5000<br />
　　SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为：<br />
Where 价格&gt;2500/2<br />
　　但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。<br />
　　4、IN 的作用相当与OR<br />
　　语句：<br />
Select * from table1 where tid in (2,3)<br />
　　和<br />
Select * from table1 where tid=2 or tid=3<br />
　　是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。<br />
　　5、尽量少用NOT<br />
　　6、exists 和 in 的执行效率是一样的<br />
　　很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开。<br />
　　(1）select title,price from titles where title_id in (select title_id from sales where qty&gt;30)<br />
　　该句的执行结果为：<br />
　　表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。<br />
　　表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。<br />
　　(2）select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty&gt;30)<br />
　　第二句的执行结果为：<br />
　　表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。<br />
　　表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。<br />
　　我们从此可以看到用exists和用in的执行效率是一样的。<br />
　　7、用函数charindex()和前面加通配符%的LIKE执行效率一样<br />
　　前面,我们谈到,如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍说,用函数charindex()来代替LIKE速度会有大的提升,经我试验,发现这种说明也是错误的：<br />
select gid,title,fariqi,reader from tgongwen where charindex('刑侦支队',reader)&gt;0 and fariqi&gt;'2004-5-5'<br />
　　用时：7秒,另外：扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。<br />
select gid,title,fariqi,reader from tgongwen where reader like '%' + '刑侦支队' + '%' and fariqi&gt;'2004-5-5'<br />
　　用时：7秒,另外：扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。<br />
　　8、union并不绝对比or的执行效率高<br />
　　我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or。事实证明,这种说法对于大部分都是适用的。<br />
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or gid&gt;9990000<br />
　　用时：68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。<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 />
　　看来,用union在通常情况下比用or的效率要高的多。<br />
　　但经过试验,笔者发现如果or两边的查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。<br />
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or fariqi='2004-2-5'<br />
　　用时：6423毫秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。<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&nbsp;&nbsp;fariqi='2004-2-5'<br />
　　用时：11640毫秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。<br />
　　9、字段提取要按照&#8220;需多少、提多少&#8221;的原则,避免&#8220;select *&#8221;<br />
　　我们来做一个试验：<br />
select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc<br />
　　用时：4673毫秒<br />
select top 10000 gid,fariqi,title from tgongwen order by gid desc<br />
　　用时：1376毫秒<br />
select top 10000 gid,fariqi from tgongwen order by gid desc<br />
　　用时：80毫秒<br />
　　由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。<br />
　　10、count(*)不比count(字段)慢<br />
　　某些资料上说：用*会统计所有列,显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看：<br />
select count(*) from Tgongwen<br />
　　用时：1500毫秒<br />
select count(gid) from Tgongwen <br />
　　用时：1483毫秒<br />
select count(fariqi) from Tgongwen<br />
　　用时：3140毫秒<br />
select count(title) from Tgongwen<br />
　　用时：52050毫秒<br />
　　从以上可以看出,如果用count(*)和用count(主键)的速度是相当的,而count(*)却比其他任何除主键以外的字段汇总速度要快,而且字段越长,汇总的速度就越慢。我想,如果用count(*), SQL SERVER可能会自动查找最小字段来汇总的。当然,如果您直接写count(主键)将会来的更直接些。<br />
　　11、order by按聚集索引列排序效率最高<br />
　　我们来看：(gid是主键,fariqi是聚合索引列）<br />
select top 10000 gid,fariqi,reader,title from tgongwen<br />
　　用时：196 毫秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。<br />
select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc<br />
　　用时：4720毫秒。 扫描计数 1,逻辑读 41956 次,物理读 0 次,预读 1287 次。<br />
select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc<br />
　　用时：4736毫秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。<br />
select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc<br />
　　用时：173毫秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。<br />
select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc<br />
　　用时：156毫秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。<br />
　　从以上我们可以看出,不排序的速度以及逻辑读次数都是和&#8220;order by 聚集索引列&#8221; 的速度是相当的,但这些都比&#8220;order by 非聚集索引列&#8221;的查询速度是快得多的。<br />
　　同时,按照某个字段进行排序的时候,无论是正序还是倒序,速度是基本相当的。<br />
　　12、高效的TOP<br />
　　事实上,在查询和提取超大容量的数据集时,影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。如：<br />
select top 10 * from (<br />
select top 10000 gid,fariqi,title from tgongwen<br />
where neibuyonghu='办公室'<br />
order by gid desc) as a<br />
order by gid asc<br />
　　这条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是10000条记录,而整条语句仅返回10条语句,所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。经笔者在实践中的应用,发现TOP确实很好用,效率也很高。但这个词在另外一个大型数据库ORACLE中却没有,这不能说不是一个遗憾,虽然在ORACLE中可以用其他方法(如：rownumber）来解决。在以后的关于&#8220;实现千万级数据的分页显示存储过程&#8221;的讨论中,我们就将用到TOP这个关键词。<br />
　　到此为止,我们上面讨论了如何实现从大容量的数据库中快速地查询出您所需要的数据方法。当然,我们介绍的这些方法都是&#8220;软&#8221;方法,在实践中,我们还要考虑各种&#8220;硬&#8221;因素,如：网络性能、服务器的性能、操作系统的性能,甚至网卡、交换机等。<br />
　三、实现小数据量和海量数据的通用分页显示存储过程<br />
　　建立一个web 应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标）来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点：游标是存放在内存中,很费内存。游标一建立,就将相关的记录锁住,直到取消游标。游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。而对于多表和大表中定义的游标(大的数据集合）循环很容易使程序进入一个漫长的等待甚至死机。<br />
　　更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。<br />
　　最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是&#8220;俄罗斯存储过程&#8221;。这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。<br />
　　后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程：<br />
Create procedure pagination1<br />
(@pagesize int,&nbsp;&nbsp;--页面大小,如每页存储20条记录<br />
@pageindex int&nbsp;&nbsp; --当前页码<br />
)<br />
as<br />
set nocount on<br />
begin<br />
declare @indextable table(id int identity(1,1),nid int)&nbsp;&nbsp;--定义表变量<br />
declare @PageLowerBound int&nbsp;&nbsp;--定义此页的底码<br />
declare @PageUpperBound int&nbsp;&nbsp;--定义此页的顶码<br />
set @PageLowerBound=(@pageindex-1)*@pagesize<br />
set @PageUpperBound=@PageLowerBound+@pagesize<br />
set rowcount @PageUpperBound<br />
insert into @indextable(nid) select gid from TGongwen where fariqi &gt;dateadd(day,-365,getdate()) order by fariqi desc<br />
select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid<br />
and t.id&gt;@PageLowerBound and t.id&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#61;&#64;&#80;&#97;&#103;&#101;&#85;&#112;&#112;&#101;&#114;&#66;&#111;&#117;&#110;&#100;" target="_blank">=@PageUpperBound</a><wbr></wbr> order by t.id<br />
end<br />
set nocount off<br />
　　以上存储过程运用了SQL SERVER的最新技术――表变量。应该说这个存储过程也是一个非常优秀的分页存储过程。当然,在这个过程中,您也可以把其中的表变量写成临时表：Create TABLE #Temp。但很明显,在SQL SERVER中,用临时表是没有用表变量快的。所以笔者刚开始使用这个存储过程时,感觉非常的不错,速度也比原来的ADO的好。但后来,我又发现了比此方法更好的方法。<br />
　　笔者曾在网上看到了一篇小短文《从数据表中取出第n条到第m条的记录的方法》,全文如下：<br />
从publish 表中取出第 n 条到第 m 条的记录： <br />
Select TOP m-n+1 * <br />
FROM publish <br />
Where (id NOT IN <br />
　　　　(Select TOP n-1 id <br />
　　　　 FROM publish)) <br />
id 为publish 表的关键字 <br />
　　我当时看到这篇文章的时候,真的是精神为之一振,觉得思路非常得好。等到后来,我在作办公自动化系统(ASP.NET+ C#＋SQL SERVER）的时候,忽然想起了这篇文章,我想如果把这个语句改造一下,这就可能是一个非常好的分页存储过程。于是我就满网上找这篇文章,没想到,文章还没找到,却找到了一篇根据此语句写的一个分页存储过程,这个存储过程也是目前较为流行的一种分页存储过程,我很后悔没有争先把这段文字改造成存储过程：<br />
Create PROCEDURE pagination2<br />
(<br />
@SQL nVARCHAR(4000),&nbsp;&nbsp;&nbsp;&nbsp;--不带排序语句的SQL语句<br />
@Page int,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--页码<br />
@RecsPerPage int,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --每页容纳的记录数<br />
@ID VARCHAR(255),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --需要排序的不重复的ID号<br />
@Sort VARCHAR(255)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--排序字段及规则<br />
)<br />
AS<br />
DECLARE @Str nVARCHAR(4000)<br />
SET @Str='Select&nbsp;&nbsp; TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#83;&#81;&#76;&#43;&#39;" target="_blank">'+@SQL+'</a><wbr></wbr>) T Where <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#84;&#46;&#39;&#43;&#64;&#73;&#68;&#43;&#39;&#78;&#79;&#84;" target="_blank">T.'+@ID+'NOT</a><wbr></wbr> IN <br />
(Select&nbsp;&nbsp; TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#73;&#68;&#43;&#39;" target="_blank">'+@ID+'</a><wbr></wbr> FROM (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#83;&#81;&#76;&#43;&#39;" target="_blank">'+@SQL+'</a><wbr></wbr>) T9 orDER BY <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#83;&#111;&#114;&#116;&#43;&#39;" target="_blank">'+@Sort+'</a><wbr></wbr>) orDER BY <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#83;&#111;&#114;&#116;" target="_blank">'+@Sort</a><wbr></wbr><br />
PRINT @Str<br />
EXEC sp_ExecuteSql @Str<br />
GO<br />
　　其实,以上语句可以简化为：<br />
Select TOP 页大小 *<br />
FROM Table1<br />
Where (ID NOT IN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Select TOP 页大小*页数 id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; orDER BY id))<br />
orDER BY ID<br />
　　但这个存储过程有一个致命的缺点,就是它含有NOT IN字样。虽然我可以把它改造为：<br />
Select TOP 页大小 *<br />
FROM Table1<br />
Where not exists<br />
(select * from (select top (页大小*页数) * from table1 order by id) b where b.id=a.id )<br />
order by id<br />
　　即,用not exists来代替not in,但我们前面已经谈过了,二者的执行效率实际上是没有区别的。<br />
　　既便如此,用TOP 结合NOT IN的这个方法还是比用游标要来得快一些。<br />
　　虽然用not exists并不能挽救上个存储过程的效率,但使用SQL SERVER中的TOP关键字却是一个非常明智的选择。因为分页优化的最终目的就是避免产生过大的记录集,而我们在前面也已经提到了TOP的优势,通过TOP 即可实现对数据量的控制。<br />
　　在分页算法中,影响我们查询速度的关键因素有两点：TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。<br />
　　我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。在这里,我们可以用操作符&#8220;&gt;&#8221;或&#8220;&lt;&#8221;号来完成这个使命,使查询语句符合SARG形式。如：<br />
Select top 10 * from table1 where id&gt;200<br />
　　于是就有了如下分页方案：<br />
select top 页大小 *<br />
from table1 <br />
where id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(select max (id) from <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(select top ((页码-1)*页大小) id from table1 order by id) as T<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;order by id<br />
　　在选择即不重复值,又容易分辨大小的列时,我们通常会选择主键。下表列出了笔者用有着1000万数据的办公自动化系统中的表,在以GID(GID是主键,但并不是聚集索引。）为排序列、提取gid,fariqi,title字段,分别以第1、10、100、500、1000、1万、10万、25万、50万页为例,测试以上三种分页方案的执行速度：(单位：毫秒）<br />
页&nbsp;&nbsp;码<br />
方案1<br />
方案2<br />
方案3<br />
1<br />
60<br />
30<br />
76<br />
10<br />
46<br />
16<br />
63<br />
100<br />
1076<br />
720<br />
130<br />
500<br />
540<br />
12943<br />
83<br />
1000<br />
17110<br />
470<br />
250<br />
1万<br />
24796<br />
4500<br />
140<br />
10万<br />
38326<br />
42283<br />
1553<br />
25万<br />
28140<br />
128720<br />
2330<br />
50万<br />
121686<br />
127846<br />
7168<br />
<br />
　　从上表中,我们可以看出,三种存储过程在执行100页以下的分页命令时,都是可以信任的,速度都很好。但第一种方案在执行分页1000页以上后,速度就降了下来。第二种方案大约是在执行分页1万页以上后速度开始降了下来。而第三种方案却始终没有大的降势,后劲仍然很足。<br />
　　在确定了第三种分页方案后,我们可以据此写一个存储过程。大家知道SQL SERVER的存储过程是事先编译好的SQL语句,它的执行效率要比通过WEB页面传来的SQL语句的执行效率要高。下面的存储过程不仅含有分页方案,还会根据页面传来的参数来确定是否进行数据总数统计。<br />
-- 获取指定页的数据<br />
Create PROCEDURE pagination3<br />
@tblName&nbsp;&nbsp; varchar(255),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 表名<br />
@strGetFields varchar(1000) = '*',&nbsp;&nbsp;-- 需要返回的列 <br />
@fldName varchar(255)='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 排序的字段名<br />
@PageSize&nbsp;&nbsp; int = 10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 页尺寸<br />
@PageIndex&nbsp;&nbsp;int = 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 页码<br />
@doCount&nbsp;&nbsp;bit = 0,&nbsp;&nbsp; -- 返回记录总数, 非 0 值则返回<br />
@OrderType bit = 0,&nbsp;&nbsp;-- 设置排序类型, 非 0 值则降序<br />
@strWhere&nbsp;&nbsp;varchar(1500) = ''&nbsp;&nbsp;-- 查询条件 (注意: 不要加 where)<br />
AS<br />
declare @strSQL&nbsp;&nbsp; varchar(5000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 主语句<br />
declare @strTmp&nbsp;&nbsp; varchar(110)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 临时变量<br />
declare @strOrder varchar(400)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 排序类型<br />
<br />
if @doCount != 0<br />
&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;if @strWhere !=''<br />
&nbsp;&nbsp;&nbsp;&nbsp;set @strSQL = "select count(*) as Total from [" + @tblName + "] where "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#115;&#116;&#114;&#87;&#104;&#101;&#114;&#101;" target="_blank">+@strWhere</a><wbr></wbr><br />
&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;set @strSQL = "select count(*) as Total from [" + @tblName + "]"<br />
end&nbsp;&nbsp;<br />
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况<br />
else<br />
begin<br />
<br />
if @OrderType != 0<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;set @strTmp = "&lt;(select min"<br />
set @strOrder = " order by [" + @fldName +"] desc"<br />
--如果@OrderType不是0,就执行降序,这句很重要！<br />
end<br />
else<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;set @strTmp = "&gt;(select max"<br />
&nbsp;&nbsp;&nbsp;&nbsp;set @strOrder = " order by [" + @fldName +"] asc"<br />
end<br />
<br />
if @PageIndex = 1<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;if @strWhere != ''&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;set @strSQL = "select top " + str(@PageSize) +" "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#115;&#116;&#114;&#71;&#101;&#116;&#70;&#105;&#101;&#108;&#100;&#115;" target="_blank">+@strGetFields</a><wbr></wbr>+ "&nbsp;&nbsp;from [" + @tblName + "] where " + @strWhere + " " + @strOrder<br />
&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp; set @strSQL = "select top " + str(@PageSize) +" "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#115;&#116;&#114;&#71;&#101;&#116;&#70;&#105;&#101;&#108;&#100;&#115;" target="_blank">+@strGetFields</a><wbr></wbr>+ "&nbsp;&nbsp;from ["+ @tblName + "] "+ @strOrder<br />
--如果是第一页就执行以上代码,这样会加快执行速度<br />
end<br />
else<br />
begin<br />
--以下代码赋予了@strSQL以真正执行的SQL代码<br />
set @strSQL = "select top " + str(@PageSize) +" "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#115;&#116;&#114;&#71;&#101;&#116;&#70;&#105;&#101;&#108;&#100;&#115;" target="_blank">+@strGetFields</a><wbr></wbr>+ "&nbsp;&nbsp;from ["<br />
&nbsp;&nbsp;&nbsp;&nbsp;+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder<br />
<br />
if @strWhere != ''<br />
&nbsp;&nbsp;&nbsp;&nbsp;set @strSQL = "select top " + str(@PageSize) +" "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#115;&#116;&#114;&#71;&#101;&#116;&#70;&#105;&#101;&#108;&#100;&#115;" target="_blank">+@strGetFields</a><wbr></wbr>+ "&nbsp;&nbsp;from ["<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ @fldName + "] from [" + @tblName + "] where " + @strWhere + " "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder<br />
end <br />
end&nbsp;&nbsp; <br />
exec (@strSQL)<br />
GO<br />
　　上面的这个存储过程是一个通用的存储过程,其注释已写在其中了。<br />
　　在大数据量的情况下,特别是在查询最后几页的时候,查询时间一般不会超过9秒；而用其他存储过程,在实践中就会导致超时,所以这个存储过程非常适用于大容量数据库的查询。<br />
　　笔者希望能够通过对以上存储过程的解析,能给大家带来一定的启示,并给工作带来一定的效率提升,同时希望同行提出更优秀的实时数据分页算法。<br />
四、聚集索引的重要性和如何选择聚集索引<br />
　　在上一节的标题中,笔者写的是：实现小数据量和海量数据的通用分页显示存储过程。这是因为在将本存储过程应用于&#8220;办公自动化&#8221;系统的实践中时,笔者发现这第三种存储过程在小数据量的情况下,有如下现象：<br />
　　1、分页速度一般维持在1秒和3秒之间。<br />
　　2、在查询最后一页时,速度一般为5秒至8秒,哪怕分页总数只有3页或30万页。<br />
　　虽然在超大容量情况下,这个分页的实现过程是很快的,但在分前几页时,这个1－3秒的速度比起第一种甚至没有经过优化的分页方法速度还要慢,借用户的话说就是&#8220;还没有ACCESS数据库速度快&#8221;,这个认识足以导致用户放弃使用您开发的系统。<br />
　　笔者就此分析了一下,原来产生这种现象的症结是如此的简单,但又如此的重要：排序的字段不是聚集索引！<br />
　　本篇文章的题目是：&#8220;查询优化及分页算法方案&#8221;。笔者只所以把&#8220;查询优化&#8221;和&#8220;分页算法&#8221;这两个联系不是很大的论题放在一起,就是因为二者都需要一个非常重要的东西――聚集索引。<br />
　　在前面的讨论中我们已经提到了,聚集索引有两个最大的优势：<br />
　　1、以最快的速度缩小查询范围。<br />
　　2、以最快的速度进行字段排序。<br />
　　第1条多用在查询优化时,而第2条多用在进行分页时的数据排序。<br />
　　而聚集索引在每个表内又只能建立一个,这使得聚集索引显得更加的重要。聚集索引的挑选可以说是实现&#8220;查询优化&#8221;和&#8220;高效分页&#8221;的最关键因素。<br />
　　但要既使聚集索引列既符合查询列的需要,又符合排序列的需要,这通常是一个矛盾。<br />
　　笔者前面&#8220;索引&#8221;的讨论中,将fariqi,即用户发文日期作为了聚集索引的起始列,日期的精确度为&#8220;日&#8221;。这种作法的优点,前面已经提到了,在进行划时间段的快速查询中,比用ID主键列有很大的优势。<br />
　　但在分页时,由于这个聚集索引列存在着重复记录,所以无法使用max或min来最为分页的参照物,进而无法实现更为高效的排序。而如果将ID主键列作为聚集索引,那么聚集索引除了用以排序之外,没有任何用处,实际上是浪费了聚集索引这个宝贵的资源。<br />
　　　为解决这个矛盾,笔者后来又添加了一个日期列,其默认值为getdate()。用户在写入记录时,这个列自动写入当时的时间,时间精确到毫秒。即使这样,为了避免可能性很小的重合,还要在此列上创建UNIQUE约束。将此日期列作为聚集索引列。<br />
　　有了这个时间型聚集索引列之后,用户就既可以用这个列查找用户在插入数据时的某个时间段的查询,又可以作为唯一列来实现max或min,成为分页算法的参照物。<br />
　　经过这样的优化,笔者发现,无论是大数据量的情况下还是小数据量的情况下,分页速度一般都是几十毫秒,甚至0毫秒。而用日期段缩小范围的查询速度比原来也没有任何迟钝。<br />
　　聚集索引是如此的重要和珍贵,所以笔者总结了一下,一定要将聚集索引建立在：<br />
　　1、您最频繁使用的、用以缩小查询范围的字段上；<br />
　　2、您最频繁使用的、需要排序的字段上。<br />
　　结束语：<br />
　　本篇文章汇集了笔者近段在使用数据库方面的心得,是在做&#8220;办公自动化&#8221;系统时实践经验的积累。希望这篇文章不仅能够给大家的工作带来一定的帮助,也希望能让大家能够体会到分析问题的方法；最重要的是,希望这篇文章能够抛砖引玉,掀起大家的学习和讨论的兴趣,以共同促进,共同为公安科技强警事业和金盾工程做出自己最大的努力。<br />
&nbsp;
<img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1202928.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>海量数据库的查询优化及分页算法方案(转载)</title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/05/20/1202925.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Mon, 19 May 2008 16:53:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/05/20/1202925.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1202925.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/05/20/1202925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1202925.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1202925.html</trackback:ping><description><![CDATA[摘要: 随着&#8220;金盾工程&#8221;建设的逐步深入和公安信息化的高速发展，公安计算机应用系统被广泛应用在各警种、各部门。与此同时，应用系统体系的核心、系统数据的存放地――数据库也随着实际应用而急剧膨胀，一些大规模的系统，如人口系统的数据甚至超过了1000万条，可谓海量。那么，如何实现快速地从这些超大容量的数据库中提取数据（查询）、分析、统计以及提取数据后进行数据分页已成为各地系统管理员和数据库&nbsp;&nbsp;<a href='http://www.cnblogs.com/Lhdyesok/archive/2008/05/20/1202925.html'>阅读全文</a><img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1202925.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>把SQL SERVER里表里的数据导出成为insert into 脚本 </title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/05/13/1195925.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Tue, 13 May 2008 14:36:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/05/13/1195925.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1195925.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/05/13/1195925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1195925.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1195925.html</trackback:ping><description><![CDATA[<p>转贴一位老兄的文章，懒得细看，先收藏备用。</p>
<p>&nbsp;</p>
<p>CREATE &nbsp; &nbsp; &nbsp; PROCEDURE &nbsp; dbo.UspOutputData &nbsp; <br />
&nbsp; @tablename &nbsp; sysname &nbsp; <br />
&nbsp; AS &nbsp; <br />
&nbsp; declare &nbsp; @column &nbsp; varchar(1000) &nbsp; <br />
&nbsp; declare &nbsp; @columndata &nbsp; varchar(1000) &nbsp; <br />
&nbsp; declare &nbsp; @sql &nbsp; varchar(4000) &nbsp; <br />
&nbsp; declare &nbsp; @xtype &nbsp; tinyint &nbsp; <br />
&nbsp; declare &nbsp; @name &nbsp; sysname &nbsp; <br />
&nbsp; declare &nbsp; @objectId &nbsp; int &nbsp; <br />
&nbsp; declare &nbsp; @objectname &nbsp; sysname &nbsp; <br />
&nbsp; declare &nbsp; @ident &nbsp; int &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; set &nbsp; nocount &nbsp; on &nbsp; <br />
&nbsp; set &nbsp; @objectId=object_id(@tablename) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; if &nbsp; @objectId &nbsp; is &nbsp; null &nbsp; -- &nbsp; 判斷對象是否存在 &nbsp; &nbsp; <br />
&nbsp; begin &nbsp; &nbsp; <br />
&nbsp; print &nbsp; 'The &nbsp; object &nbsp; not &nbsp; exists' &nbsp; &nbsp; <br />
&nbsp; return &nbsp; &nbsp; <br />
&nbsp; end &nbsp; &nbsp; <br />
&nbsp; set &nbsp; &nbsp; @objectname=object_name(@objectId) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; if &nbsp; &nbsp; @objectname &nbsp; is &nbsp; null &nbsp; or &nbsp; charindex(@objectname,@tablename)=0 &nbsp; --此判断不严密 &nbsp; <br />
&nbsp; begin &nbsp; <br />
&nbsp; print &nbsp; 'object &nbsp; not &nbsp; in &nbsp; current &nbsp; database' &nbsp; <br />
&nbsp; return &nbsp; <br />
&nbsp; end &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; if &nbsp; OBJECTPROPERTY(@objectId,'IsTable') &nbsp; &lt;&gt; &nbsp; 1 &nbsp; -- &nbsp; 判斷對象是否是table &nbsp; &nbsp; <br />
&nbsp; begin &nbsp; &nbsp; <br />
&nbsp; print &nbsp; 'The &nbsp; object &nbsp; is &nbsp; not &nbsp; table' &nbsp; &nbsp; <br />
&nbsp; return &nbsp; &nbsp; <br />
&nbsp; end &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; select &nbsp; @ident=status&amp;0x80 &nbsp; &nbsp; from &nbsp; syscolumns &nbsp; where &nbsp; id=@objectid &nbsp; and &nbsp; status&amp;0x80=0x80 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; if &nbsp; @ident &nbsp; is &nbsp; not &nbsp; null &nbsp; <br />
&nbsp; print &nbsp; 'SET &nbsp; IDENTITY_INSERT &nbsp; '+@TableName+' &nbsp; ON' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; declare &nbsp; syscolumns_cursor &nbsp; cursor &nbsp; &nbsp; <br />
&nbsp; for &nbsp; select &nbsp; c.name,c.xtype &nbsp; from &nbsp; syscolumns &nbsp; c &nbsp; <br />
&nbsp; where &nbsp; c.id=@objectid &nbsp; <br />
&nbsp; order &nbsp; by &nbsp; c.colid &nbsp; <br />
&nbsp; open &nbsp; syscolumns_cursor &nbsp; <br />
&nbsp; set &nbsp; @column='' &nbsp; <br />
&nbsp; set &nbsp; @columndata='' &nbsp; <br />
&nbsp; fetch &nbsp; next &nbsp; from &nbsp; syscolumns_cursor &nbsp; into &nbsp; @name,@xtype &nbsp; <br />
&nbsp; while &nbsp; @@fetch_status &nbsp; &lt;&gt;-1 &nbsp; <br />
&nbsp; begin &nbsp; <br />
&nbsp; if &nbsp; @@fetch_status&lt;&gt;-2 &nbsp; <br />
&nbsp; begin &nbsp; <br />
&nbsp; if &nbsp; @xtype &nbsp; not &nbsp; in(189,34,35,99,98) &nbsp; --timestamp不需处理，image,text,ntext,sql_variant &nbsp; 暂时不处理 &nbsp; <br />
&nbsp; begin &nbsp; <br />
&nbsp; set &nbsp; @column=@column+case &nbsp; when &nbsp; len(@column)=0 &nbsp; then'' &nbsp; else &nbsp; ','end+@name &nbsp; <br />
&nbsp; set &nbsp; @columndata=@columndata+case &nbsp; when &nbsp; len(@columndata)=0 &nbsp; then &nbsp; '' &nbsp; else &nbsp; ','','','end &nbsp; <br />
&nbsp; +case &nbsp; when &nbsp; @xtype &nbsp; in(167,175) &nbsp; then &nbsp; '''''''''+'+@name+'+''''''''' &nbsp; --varchar,char &nbsp; <br />
&nbsp; when &nbsp; @xtype &nbsp; in(231,239) &nbsp; then &nbsp; '''N''''''+'+@name+'+''''''''' &nbsp; --nvarchar,nchar &nbsp; <br />
&nbsp; when &nbsp; @xtype=61 &nbsp; then &nbsp; '''''''''+convert(char(23),'+@name+',121)+''''''''' &nbsp; --datetime &nbsp; <br />
&nbsp; when &nbsp; @xtype=58 &nbsp; then &nbsp; '''''''''+convert(char(16),'+@name+',120)+''''''''' &nbsp; --smalldatetime &nbsp; <br />
&nbsp; when &nbsp; @xtype=36 &nbsp; then &nbsp; '''''''''+convert(char(36),'+@name+')+''''''''' &nbsp; --uniqueidentifier &nbsp; <br />
&nbsp; else &nbsp; @name &nbsp; end &nbsp; <br />
&nbsp; end &nbsp; <br />
&nbsp; end &nbsp; &nbsp; &nbsp; <br />
&nbsp; fetch &nbsp; next &nbsp; from &nbsp; syscolumns_cursor &nbsp; into &nbsp; @name,@xtype &nbsp; <br />
&nbsp; end &nbsp; <br />
&nbsp; close &nbsp; syscolumns_cursor &nbsp; <br />
&nbsp; deallocate &nbsp; syscolumns_cursor &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; set &nbsp; @sql='set &nbsp; nocount &nbsp; on &nbsp; select &nbsp; ''insert &nbsp; '+@tablename+'('+@column+') &nbsp; values(''as &nbsp; ''--'','+@columndata+','')'' &nbsp; from &nbsp; '+@tablename &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; print &nbsp; '--'+@sql &nbsp; <br />
&nbsp; exec(@sql) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; if &nbsp; @ident &nbsp; is &nbsp; not &nbsp; null &nbsp; <br />
&nbsp; print &nbsp; 'SET &nbsp; IDENTITY_INSERT &nbsp; '+@TableName+' &nbsp; OFF' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; GO&nbsp;&nbsp; <br />
<br />
<br />
执行方法是:&nbsp;exec &nbsp; UspOutputData &nbsp; 你的表名 &nbsp; <br />
&nbsp; 得到导出<nobr oncontextmenu="return false;" onmousemove="kwM(2);" id="key1" onmouseover="kwE(event,2, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">数据</nobr>的语句，但image,text,ntext,sql_variant &nbsp; 列不出现在语句，以后改进。</p>
 <img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1195925.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>静态(Static)方法</title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/05/10/1190797.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Fri, 09 May 2008 17:20:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/05/10/1190797.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1190797.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/05/10/1190797.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1190797.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1190797.html</trackback:ping><description><![CDATA[<p>1.static方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用!<br />
static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!<br />
<br />
2.静态方法效率上要比实例化高，静态方法的缺点是不自动进行销毁，而实例化的则可以做销毁。<br />
<br />
3.静态方法和静态变量创建后始终使用同一块内存，而使用实例的方式会创建多个内存.<br />
<br />
4.C#中的方法有两种:实例方法,静态方法.类的方法代码只有一份,它们的生命周期和类是一致的.实例方法是通过对象名调用的,静态方法与类关联而不是与对象名关联.例如:MyObj是类MyClass的实例,调用InstanceMethod为MyObj.InstanceMethod();调用StaticMethod为MyClass.StaticMethod.<br />
下面这是我的理解,大家参考一下.<br />
//动态方法<br />
class Method<br />
{<br />
public void createconn()<br />
{<br />
&nbsp;&nbsp;........<br />
}<br />
} <br />
Method cconn =new Method();&nbsp;&nbsp;<br />
SqlConnection con = cconn.createconn(); <br />
//静态方法<br />
class Method<br />
{<br />
public&nbsp;&nbsp;static&nbsp;&nbsp;void createconn()<br />
{<br />
&nbsp;&nbsp;........<br />
} <br />
}<br />
SqlConnection con = Method.createconn(); <br />
<br />
<br />
5.那么在程序中什么地方可以利用静态字段和静态构造方法，通常适用于于一些不会经常变化而又频繁使用的数据，比如连接字符串，配置信息等，当满足上面所说的两点时，进行一次读取，以后就可以方便的使用了，同时也节约了托管资源，因为对于静态成员，一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例，它的静态字段永远都只有一个副本(副本我理解为只有一块内存</p>
<p><font color="#ff0000"><font color="#ff0000">静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.</font>&nbsp;</font><font color="#000000">公用的处理函数,使用静态方法应该没有问题..牵涉到数据共享,静态变量的函数要多考虑...静态变量要小心使用.. </font></p>
<p><font color="#ff0000">静态方法 <br />
原理就是共享代码段 <br />
共享代码段不会产生任何问题 <br />
因为代码段都是给CPU作为"读取"用的,除非你进行恶意"修改"运行时的代码段 <br />
所以静态方法是可以放心使用的 <br />
<br />
静态变量 <br />
原理就是共享数据段 <br />
同上 只要没有进行"写入"操作就不会产生问题 但是数据通常都是用于读和写 所以静态变量要注意使用</font></p>
<img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1190797.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>如何在子线程中操作窗体上的控件 </title><link>http://www.cnblogs.com/Lhdyesok/archive/2008/05/02/1179434.html</link><dc:creator>EasyWriter</dc:creator><author>EasyWriter</author><pubDate>Fri, 02 May 2008 05:06:00 GMT</pubDate><guid>http://www.cnblogs.com/Lhdyesok/archive/2008/05/02/1179434.html</guid><wfw:comment>http://www.cnblogs.com/Lhdyesok/comments/1179434.html</wfw:comment><comments>http://www.cnblogs.com/Lhdyesok/archive/2008/05/02/1179434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Lhdyesok/comments/commentRss/1179434.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Lhdyesok/services/trackbacks/1179434.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">一般来说，直接在子线程中对窗体上的控件操作是会出现异常，这是由于子线程和运行窗体的线程是不同的空间，因此想要在子线程来操作窗体上的控件，是不可能简单的通过控件对象名来操作，但不是说不能进行操作，微软提供了</span><font face="Times New Roman">Invoke</font><span style="font-family: 宋体">的方法，其作用就是让子线程告诉窗体线程来完成相应的控件操作。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">现在用一个用线程控制的进程条来说明，大致的步骤如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><font face="Times New Roman"><font size="3">1．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">创建</span><font face="Times New Roman">Invoke</font><span style="font-family: 宋体">函数，大致如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: green"> Delegate function to be invoked by main thread</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;/summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">void</span> InvokeFun()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>( prgBar.Value &lt; 100 )</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prgBar.Value = prgBar.Value + 1;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><font face="Times New Roman"><font size="3">2．</font>&nbsp;</font><span style="font-family: 宋体"><font size="3">子线程入口函数：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: green"> Thread function interface</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;/summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">void</span> ThreadFun()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//Create invoke method by specific function</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MethodInvoker mi = <span style="color: blue">new</span> MethodInvoker( <span style="color: blue">this</span>.InvokeFun );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span>( <span style="color: blue">int</span> i = 0; i &lt; 100; i++ )</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">this</span>.BeginInvoke( mi );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep( 100 );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><font face="Times New Roman"><font size="3">3．</font>&nbsp;</font><span style="font-family: 宋体"><font size="3">创建子线程：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread thdProcess = <span style="color: blue">new</span> Thread( <span style="color: blue">new</span> ThreadStart( ThreadFun ) );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thdProcess.Start();</span></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-family: 宋体">备注：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font face="Times new roman" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-size: 10pt; color: blue; font-family: 新宋体">using</span><span style="font-size: 10pt; font-family: 新宋体"> System.Threading;</span></p>
<p><font face="Times new roman" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-size: 10pt; color: blue; font-family: 新宋体">private</span><span style="font-size: 10pt; font-family: 新宋体"> System.Windows.Forms.ProgressBar prgBar;</span><br />
<br />
<a href="http://blog.csdn.net/Knight94/archive/2006/05/27/757351.aspx">如何弹出一个模式窗口来显示进度条</a><br />
<br />
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=757351<br />
<br />
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">最近看了好多人问这方面的问题，以前我也写过一篇</span><font face="Times New Roman">blog</font><span style="font-family: 宋体">，里面说了如何在子线程中控制进度条。但目前大多数环境，需要弹出模式窗口，来显示进度条，那么只需要在原先的基础上稍作修改即可。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">首先是进度条窗体，需要在上面添加进度条，然后去掉</span><font face="Times New Roman">ControlBox</font><span style="font-family: 宋体">。除此外，还要增加一个方法，用来控制进度条的增加幅度，具体如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: green"> Increase process bar</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;/summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;param name="nValue"&gt;</span><span style="color: green">the value increased</span><span style="color: gray">&lt;/param&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;returns&gt;&lt;/returns&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">bool</span> Increase( <span style="color: blue">int</span> nValue )</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>( nValue &gt; 0 )</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>( prcBar.Value + nValue &lt; prcBar.Maximum )</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prcBar.Value += nValue;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: blue">true</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prcBar.Value = prcBar.Maximum;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">this</span>.Close();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: blue">false</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: blue">false</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">接着就是主窗体了，如何进行操作了，首先需要定义两个私有成员，一个委托。其中一个私有成员是保存当前进度条窗体对象，另一个是保存委托方法（即增加进度条尺度），具体如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> frmProcessBar myProcessBar = <span style="color: blue">null</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">delegate</span> <span style="color: blue">bool</span> IncreaseHandle( <span style="color: blue">int</span> nValue );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> IncreaseHandle myIncrease = <span style="color: blue">null</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">接着要在主窗体中提供函数来打开进度条窗体，如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: green"> Open process bar window</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;/summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">void</span> ShowProcessBar()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myProcessBar = <span style="color: blue">new</span> frmProcessBar();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// Init increase event</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myIncrease = <span style="color: blue">new</span> IncreaseHandle( myProcessBar.Increase );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myProcessBar.ShowDialog();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myProcessBar = <span style="color: blue">null</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">那么现在就可以开始创建线程来运行，具体如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: green"> Sub thread function</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: gray">///</span><span style="color: gray">&lt;/summary&gt;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">void</span> ThreadFun()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MethodInvoker mi = <span style="color: blue">new</span> MethodInvoker( ShowProcessBar );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">this</span>.BeginInvoke( mi );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep( 1000 );<span style="color: green">//Sleep a while to show window</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">bool</span> blnIncreased = <span style="color: blue">false</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">object</span> objReturn = <span style="color: blue">null</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">do</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep( 50 );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objReturn = <span style="color: blue">this</span>.Invoke( <span style="color: blue">this</span>.myIncrease, </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">new</span> <span style="color: blue">object</span>[]{ 2 } );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blnIncreased = (<span style="color: blue">bool</span>)objReturn ;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span>( blnIncreased );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times new roman" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><strong><em><span style="font-size: 12pt; color: red; font-family: 宋体">注意以上，在打开进度条窗体和增加进度条进度的时候，一个用的是</span></em></strong></font><strong><em><span style="font-size: 12pt; color: red"><font face="Times New Roman">BeginInvoke</font></span></em></strong><strong><em><span style="font-size: 12pt; color: red; font-family: 宋体">，一个是</span></em></strong><strong><em><span style="font-size: 12pt; color: red"><font face="Times New Roman">Invoke</font></span></em></strong><strong><em><span style="font-size: 12pt; color: red; font-family: 宋体">，这里的区别是</span></em></strong><strong><em><span style="font-size: 12pt; color: red"><font face="Times New Roman">BeginInvoke</font></span></em></strong><strong><em><span style="font-size: 12pt; color: red; font-family: 宋体">不需要等待方法运行完毕，而</span></em></strong><strong><em><span style="font-size: 12pt; color: red"><font face="Times New Roman">Invoke</font></span></em></strong><strong><em><span style="font-size: 12pt; color: red; font-family: 宋体">是要等待方法运行完毕。还有一点，此处用返回值来判断进度条是否到头了，如果需要有其他的控制，可以类似前面的方法来进行扩展。</span></em></strong></p>
<p style="margin: 0cm 0cm 0pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">启动线程，可以如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; Thread thdSub = <span style="color: blue">new</span> Thread( <span style="color: blue">new</span> ThreadStart( ThreadFun ) );</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; thdSub.Start();</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="Times new roman" size="3">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">这样，一个用模式打开进度条窗体就做完了。</font></span></p>
<p><br />
&nbsp;</p><img src ="http://www.cnblogs.com/Lhdyesok/aggbug/1179434.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>