﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>大绿茶D博客 &#187; 未分类</title>
	<atom:link href="http://www.biggreentea.cn/?feed=rss2&#038;cat=1" rel="self" type="application/rss+xml" />
	<link>http://www.biggreentea.cn</link>
	<description>一个贺州网页伪设计师.....人要长久利于不败之地就要不断发展，不能永远一成不变</description>
	<lastBuildDate>Sat, 04 Sep 2010 15:20:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>全面优化ASP应用程序的性能</title>
		<link>http://www.biggreentea.cn/?p=124</link>
		<comments>http://www.biggreentea.cn/?p=124#comments</comments>
		<pubDate>Wed, 05 May 2010 16:34:35 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=124</guid>
		<description><![CDATA[
ASP 本身并不是一种脚本语言，它只是提供了一种使镶嵌在 HTML 页面中的脚本程序得以运行的环境，而在ASP中最常用的脚本语言就是VBScript了。虽然ASP的脚本语言很简单，但是要想让一个ASP程序能够最优化的运行也不是一件简单的事情。 
　　现在国内的网络带宽很有限，网络十分拥挤，如何使得自己的ASP应用程序能够快速的运行就成为了每一个ASP程序员的梦想了。那就跟随我来一同加速你的ASP程序吧！ 
一． 有关操作数据库的优化方法 
　　我们使用ASP最主要的用途就是对数据库进行操作了，如何更快速的完成这些动作呢？ 
1． 不要任意使用“Select　　*　　&#8230;&#8230;” 
　　请尽量拾取你所需要的那些字段，比如，一个Table中有10个字段，但是你只会用到其中的一个字段（name），就要使用“select name from yourtable”，而不是用“select * from yourtable”。你或许会说，我是这么做的阿，但是，如果一个table中有50个字段，你需要用到其中的23个字段的时候，你会怎么做呢？为了节省打字以及查找对应字段名称的麻烦，你就不一定会老老实实的用“select name，sex，age&#8230; from yourtable”了吧！ 
　　实际证明，尽量拾取你所需要的那些字段来使用select语句将会是你的ASP程序至少加快5%左右。 
2． 尽可能使用系统存储过程（针对MS SQL Server） 
　　有的时候完成一个读取操作，使用SQL语句和存储过程同样可以完成，但是使用存储过程将会大大加快完成读取操作的速度，也就提高了你的ASP程序运行的速度。 
3． 注意你的游标使用方法 
　　如果你仅仅是对一个table进行读取操作，那么请你使用forward-only，read-only游标，因为这种游标读取数据库是最为快速的，尤其是你的读取数据量很大的情况下。 
4． 不要打开无用的独立记录集 
　　也许你在笑了，我会打开没有用的记录集吗？是的，你当然会，比如在生成一个树型记录集的时候，你不得不打开父记录集以及对应的子记录集，甚至还有孙记录集，其实你可以使用ADO提供的Data Shaping技术来替代打开多个独立的记录集，那样会加快程序的运行速度。（关于Data Shaping的用法可以参考ADO帮助） 
5． 一定要记着关闭打开的记录集对象以及连接(Connection)对象 
　　有些朋友总是奇怪为何自己的ASP程序刚开始的时候运行速度很快，可是多运行几遍就越来越慢了呢？甚至出现服务器死机的情况。发生这种情况，就很可能是你打开了太多的记录集对象以及连接(Connection)对象而最后却没有关闭他们引起的。使用如下方法进行关闭： 
 程序代码
YourRecordSet.close 
Set YourRecordSet=Nothing 
Set YourConnection=Nothing 
6． 取得数据库数据的方法比较 
　　你是如何得到记录集的数据的呢？是不是用YourRecordSet(字段编号),还是YourRecordSet(&#8220;字段名称&#8221;)？其实还有其他的使用方法，现在我们就比较一下吧（100条记录）： 
 程序代码
Rs(&#8220;字段名称&#8221;) 
Rs(&#8220;字段名&#8221;).Value 
Rs(&#8220;字段编号&#8221;) 
Set方法 
数据库回应时间 
2．967秒 
2．936秒 
1．650秒 
0．586秒 
2．824秒 
2．914秒 
1．611秒 
0．602秒 
2．893秒 
2．943秒 
1．613秒 
0．594秒 
平均回应时间 
2．895秒 
2．931秒 
1．625秒 
0．594秒 
　　这下知道了吧，前三种方法大家都可以看的明白，我就说说第四种方法（Set方法）如何使用： 
 程序代码
Dim strSQL 
StrSQL=&#8221;select name,sex,age from yourtable&#8221; 
Dim rs 
Set rs=server.createobject(&#8220;ADODB.RECORDSET&#8221;) 
Rs.open strSQL,conn,1,1 
Const fieldsOrder=2 
Dim objOrder 
Set objOrder=rs(fieldsOrder) 
Response.write objOrder　　&#8217;Set方法 
二． 有关ASP内置对象使用方面的优化方法 
1． 尽量减少Session对象和Application对象的使用 
　　虽然ASP中提供的这两个对象对我们的编程提供了很大的帮助，但是，对这两个对象要合理的使用，不要滥用。因为大量的使用这两个对象将会极大的增大服务器的负担，严重消耗系统资源。也将使你的ASP程序运行慢如老牛。 
2． 要及时的关闭不再使用的对象（尤其是Session和Application） 
　　不及时的关闭你所使用的对象会导致系统运行速度变得缓慢。也许你会问，Session和Application不是可以自动消失的吗？完全正确，系统默认30分钟内用户如果没有任何操作就自动触发Session_OnEnd和Application_OnEnd事件，但是大量的用户频繁的读取服务器，服务器将在很长的一段时间保持那些已经没有用的Session,Application对象，如果不及时关闭使用完的Session和Application后果将不堪想象了。 
关闭的方法是： 
　　 Set 对象=Nothing 
三． 合理使用Include文件 
　　我们这里说的是指用&#60;!&#8211;#include file=&#8221;xxx&#8221;&#8211;&#62;形式包含进来的文件,并且文件内容全是ASP程序,也就是说你将一些公共的函数放到一个文件中,并在其他有可能调用其中函数的页面包含进来。 
建议你不要将所有的函数放到一个包含文件中，因为你在其他页面包含这个文件的时候，服务器端是要进行预编译的，很可能在一个包含文件里面有上百个函数，而你只是想要使用其中的一个函数，这样就得不偿失了。所以，尽可能的分割你的包含文件成为多个小的包含文件。这样也可以提高程序的运行速度哦。 
四． 有关VBScript语言方面的优化方法 
1．尽量使用系统函数代替自己编写的函数 
　　 比如要想分割一个有规律的字符串（&#8221;sss,ddd,fff,ggg&#8221;）,就不必自己使用什么Mid(),Instr等等函数来分析了，其实VBScript就提供了一个函数 Split(),这样既省时间，又提高了速度，何乐而不为呢？ 
2．减少动态数组的使用 
3．尽可能的养成提前声明变量的习惯 
　　 不要小看了这一条，提前声明变量会加快程序的解释执行时间。相反，从不声明变量，不但程序难以阅读，整个程序在服务器的执行效率也会大打折扣的。 
五． 其他方面的优化方法 
1． 在ASP文件中尽量使用&#60;%%&#62;嵌入到HTML标签中，而不要使用Response.write的方式，比如： 
 程序代码
&#60;html&#62; 
&#60;body&#62; 
&#60;%If ok =1 then %&#62; 
　　Hello!&#38;nbsp;World! 
&#60;%End If%&#62; 
&#60;/body&#62; 
&#60;/html&#62; 
就远远比: 
&#38;nbsp;程序代码
&#60;% 
Response.write &#8221;&#60;html&#62;&#8221; 
Response.write &#8221; &#60;body&#62;&#8221; 
　　　　　　　　　　　　If ok =1 then 
　　Response.write &#8221;Hello! World!&#8221; 
　　　　　　　　　　　　End If 
Response.write &#8221; &#60;/body&#62;&#8221; 
Response.write &#8221;&#60;/html&#62;&#8221; 
%&#62; 
的运行速度要快，尤其是你的ASP文件比较大的情况下。因为，第二种方式增加了服务器端的解释时间，因而也就降低了ASP程序的性能。 
2． 尽量用一个ASP文件完成一个动作 
　　很多人喜欢在一个ASP程序中同时完成诸如添加，删除，查找等等多个动作，不要认为这样是有效的利用了文件，相反，这样做的结果是使得应用程序的运行速度减慢很多。 
应当将添加，删除，查找等分割成单个的独立的ASP文件来完成。这样使得文件不会过于庞大，降低服务器端解释执行的负担，并且阅读程序也很快捷。 
　　好了，经过我们的全面优化，你的ASP应用程序是不是运行的更加稳定，更加快速了呢？

]]></description>
			<content:encoded><![CDATA[<div id="mf59">
<p id="mf60">ASP 本身并不是一种脚本语言，它只是提供了一种使镶嵌在 HTML 页面中的脚本程序得以运行的环境，而在ASP中最常用的脚本语言就是VBScript了。虽然ASP的脚本语言很简单，但是要想让一个ASP程序能够最优化的运行也不是一件简单的事情。 </p>
<p id="mf61">　　现在国内的网络带宽很有限，网络十分拥挤，如何使得自己的ASP应用程序能够快速的运行就成为了每一个ASP程序员的梦想了。那就跟随我来一同加速你的ASP程序吧！ </p>
<p id="mf62"><strong>一． 有关操作数据库的优化方法</strong> </p>
<p id="mf63">　　我们使用ASP最主要的用途就是对数据库进行操作了，如何更快速的完成这些动作呢？ </p>
<p id="mf64">1． 不要任意使用“Select　　*　　&#8230;&#8230;” </p>
<p id="mf65">　　请尽量拾取你所需要的那些字段，比如，一个Table中有10个字段，但是你只会用到其中的一个字段（name），就要使用“select name from yourtable”，而不是用“select * from yourtable”。你或许会说，我是这么做的阿，但是，如果一个table中有50个字段，你需要用到其中的23个字段的时候，你会怎么做呢？为了节省打字以及查找对应字段名称的麻烦，你就不一定会老老实实的用“select name，sex，age&#8230; from yourtable”了吧！ </p>
<p id="mf66">　　实际证明，尽量拾取你所需要的那些字段来使用select语句将会是你的ASP程序至少加快5%左右。 </p>
<p id="mf67">2． 尽可能使用系统存储过程（针对MS SQL Server） </p>
<p id="mf68">　　有的时候完成一个读取操作，使用SQL语句和存储过程同样可以完成，但是使用存储过程将会大大加快完成读取操作的速度，也就提高了你的ASP程序运行的速度。 </p>
<p id="mf69">3． 注意你的游标使用方法 </p>
<p id="mf70">　　如果你仅仅是对一个table进行读取操作，那么请你使用forward-only，read-only游标，因为这种游标读取数据库是最为快速的，尤其是你的读取数据量很大的情况下。 </p>
<p id="mf71">4． 不要打开无用的独立记录集 </p>
<p id="mf72">　　也许你在笑了，我会打开没有用的记录集吗？是的，你当然会，比如在生成一个树型记录集的时候，你不得不打开父记录集以及对应的子记录集，甚至还有孙记录集，其实你可以使用ADO提供的Data Shaping技术来替代打开多个独立的记录集，那样会加快程序的运行速度。（关于Data Shaping的用法可以参考ADO帮助） </p>
<p id="mf73">5． 一定要记着关闭打开的记录集对象以及连接(Connection)对象 </p>
<p id="mf74">　　有些朋友总是奇怪为何自己的ASP程序刚开始的时候运行速度很快，可是多运行几遍就越来越慢了呢？甚至出现服务器死机的情况。发生这种情况，就很可能是你打开了太多的记录集对象以及连接(Connection)对象而最后却没有关闭他们引起的。使用如下方法进行关闭： </p>
<p id="mf75"> 程序代码</p>
<p id="mf76">YourRecordSet.close </p>
<p id="mf77">Set YourRecordSet=Nothing </p>
<p id="mf78">Set YourConnection=Nothing </p>
<p id="mf79">6． 取得数据库数据的方法比较 </p>
<p id="mf80">　　你是如何得到记录集的数据的呢？是不是用YourRecordSet(字段编号),还是YourRecordSet(&#8220;字段名称&#8221;)？其实还有其他的使用方法，现在我们就比较一下吧（100条记录）： </p>
<p id="mf81"> 程序代码</p>
<p id="mf82">Rs(&#8220;字段名称&#8221;) </p>
<p id="mf83">Rs(&#8220;字段名&#8221;).Value </p>
<p id="mf84">Rs(&#8220;字段编号&#8221;) </p>
<p id="mf85">Set方法 </p>
<p id="mf86">数据库回应时间 </p>
<p id="mf87">2．967秒 </p>
<p id="mf88">2．936秒 </p>
<p id="mf89">1．650秒 </p>
<p id="mf90">0．586秒 </p>
<p id="mf91">2．824秒 </p>
<p id="mf92">2．914秒 </p>
<p id="mf93">1．611秒 </p>
<p id="mf94">0．602秒 </p>
<p id="mf95">2．893秒 </p>
<p id="mf96">2．943秒 </p>
<p id="mf97">1．613秒 </p>
<p id="mf98">0．594秒 </p>
<p id="mf99">平均回应时间 </p>
<p id="mf100">2．895秒 </p>
<p id="mf101">2．931秒 </p>
<p id="mf102">1．625秒 </p>
<p id="mf103">0．594秒 </p>
<p id="mf104">　　这下知道了吧，前三种方法大家都可以看的明白，我就说说第四种方法（Set方法）如何使用： </p>
<p id="mf105"> 程序代码</p>
<p id="mf106">Dim strSQL </p>
<p id="mf107">StrSQL=&#8221;select name,sex,age from yourtable&#8221; </p>
<p id="mf108">Dim rs </p>
<p id="mf109">Set rs=server.createobject(&#8220;ADODB.RECORDSET&#8221;) </p>
<p id="mf110">Rs.open strSQL,conn,1,1 </p>
<p id="mf111">Const fieldsOrder=2 </p>
<p id="mf112">Dim objOrder </p>
<p id="mf113">Set objOrder=rs(fieldsOrder) </p>
<p id="mf114">Response.write objOrder　　&#8217;Set方法 </p>
<p id="mf115"><strong>二． 有关ASP内置对象使用方面的优化方法</strong> </p>
<p id="mf116">1． 尽量减少Session对象和Application对象的使用 </p>
<p id="mf117">　　虽然ASP中提供的这两个对象对我们的编程提供了很大的帮助，但是，对这两个对象要合理的使用，不要滥用。因为大量的使用这两个对象将会极大的增大服务器的负担，严重消耗系统资源。也将使你的ASP程序运行慢如老牛。 </p>
<p id="mf118">2． 要及时的关闭不再使用的对象（尤其是Session和Application） </p>
<p id="mf119">　　不及时的关闭你所使用的对象会导致系统运行速度变得缓慢。也许你会问，Session和Application不是可以自动消失的吗？完全正确，系统默认30分钟内用户如果没有任何操作就自动触发Session_OnEnd和Application_OnEnd事件，但是大量的用户频繁的读取服务器，服务器将在很长的一段时间保持那些已经没有用的Session,Application对象，如果不及时关闭使用完的Session和Application后果将不堪想象了。 </p>
<p id="mf120">关闭的方法是： </p>
<p id="mf121">　　 Set 对象=Nothing </p>
<p id="mf122"><strong>三． 合理使用Include文件</strong> </p>
<p id="mf123">　　我们这里说的是指用&lt;!&#8211;#include file=&#8221;xxx&#8221;&#8211;&gt;形式包含进来的文件,并且文件内容全是ASP程序,也就是说你将一些公共的函数放到一个文件中,并在其他有可能调用其中函数的页面包含进来。 </p>
<p id="mf124">建议你不要将所有的函数放到一个包含文件中，因为你在其他页面包含这个文件的时候，服务器端是要进行预编译的，很可能在一个包含文件里面有上百个函数，而你只是想要使用其中的一个函数，这样就得不偿失了。所以，尽可能的分割你的包含文件成为多个小的包含文件。这样也可以提高程序的运行速度哦。 </p>
<p id="mf125"><strong>四． 有关VBScript语言方面的优化方法</strong> </p>
<p id="mf126">1．尽量使用系统函数代替自己编写的函数 </p>
<p id="mf127">　　 比如要想分割一个有规律的字符串（&#8221;sss,ddd,fff,ggg&#8221;）,就不必自己使用什么Mid(),Instr等等函数来分析了，其实VBScript就提供了一个函数 <span style="color: #993300;">Split(),</span>这样既省时间，又提高了速度，何乐而不为呢？ </p>
<p id="mf128">2．减少动态数组的使用 </p>
<p id="mf129">3．尽可能的养成提前声明变量的习惯 </p>
<p id="mf130">　　 不要小看了这一条，提前声明变量会加快程序的解释执行时间。相反，从不声明变量，不但程序难以阅读，整个程序在服务器的执行效率也会大打折扣的。 </p>
<p id="mf131"><span style="color: #000000;"><strong>五． 其他方面的优化方法</strong> </span></p>
<p id="mf132">1． 在ASP文件中<span style="color: #993300;">尽量使用&lt;%%&gt;嵌入到HTML标签中</span>，而不要使用Response.write的方式，比如： </p>
<p id="mf133"> 程序代码</p>
<p id="mf134">&lt;html&gt; </p>
<p id="mf135">&lt;body&gt; </p>
<p id="mf136">&lt;%If ok =1 then %&gt; </p>
<p id="mf137">　　Hello!&amp;nb<br id="mf138" />sp;World! </p>
<p id="mf139">&lt;%End If%&gt; </p>
<p id="mf140">&lt;/body&gt; </p>
<p id="mf141">&lt;/html&gt; </p>
<p id="mf142">就远远比: </p>
<p id="mf143">&amp;nbsp<br id="mf144" />;程序代码</p>
<p id="mf145">&lt;% </p>
<p id="mf146">Response.write &#8221;&lt;html&gt;&#8221; </p>
<p id="mf147">Response.write &#8221; &lt;body&gt;&#8221; </p>
<p id="mf148">　　　　　　　　　　　　If ok =1 then </p>
<p id="mf149">　　Response.write &#8221;Hello! World!&#8221; </p>
<p id="mf150">　　　　　　　　　　　　End If </p>
<p id="mf151">Response.write &#8221; &lt;/body&gt;&#8221; </p>
<p id="mf152">Response.write &#8221;&lt;/html&gt;&#8221; </p>
<p id="mf153">%&gt; </p>
<p id="mf154">的运行速度要快，尤其是你的ASP文件比较大的情况下。因为，第二种方式增加了服务器端的解释时间，因而也就降低了ASP程序的性能。 </p>
<p id="mf155">2． 尽量用一个ASP文件完成一个动作 </p>
<p id="mf156">　　很多人喜欢在一个ASP程序中同时完成诸如添加，删除，查找等等多个动作，不要认为这样是有效的利用了文件，相反，这样做的结果是使得应用程序的运行速度减慢很多。 </p>
<p id="mf157">应当将添加，删除，查找等分割成单个的独立的ASP文件来完成。这样使得文件不会过于庞大，降低服务器端解释执行的负担，并且阅读程序也很快捷。 </p>
<p id="mf158">　　好了，经过我们的全面优化，你的ASP应用程序是不是运行的更加稳定，更加快速了呢？</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=124</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XP的IIS5.5建立多个站点[iisadmin.NET汉化版]</title>
		<link>http://www.biggreentea.cn/?p=118</link>
		<comments>http://www.biggreentea.cn/?p=118#comments</comments>
		<pubDate>Wed, 05 May 2010 16:20:41 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[XP IIS]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=118</guid>
		<description><![CDATA[ XP 有个最大的问题就是 IIS5.5 只支持一个站点，如果每次修改不同网站都要到 Internet 信息管理里面更改一下一下站点主目录无疑是太麻烦了。
IIsAdmin.NET 是一个专门可以在 XP 的 IIS 下面建立多个站点的小工具
提醒：这个小工具需要 .NET 2.0 运行环境。
汉化修改版：点击下载    
作者：Loveyuki
截图：

]]></description>
			<content:encoded><![CDATA[<p> XP 有个最大的问题就是 IIS5.5 只支持一个站点，如果每次修改不同网站都要到 Internet 信息管理里面更改一下一下站点主目录无疑是太麻烦了。</p>
<p><a href="http://www.codeplex.com/iisadmin" target="_blank">IIsAdmin.NET</a> 是一个专门可以在 XP 的 IIS 下面建立多个站点的小工具</p>
<p><strong><span style="color: #993300;">提醒：这个小工具需要 .NET 2.0 运行环境。</span></strong></p>
<p>汉化修改版：<a href="http://www.biggreentea.cn/tool/XPIISMulti.cab" target="_blank">点击下载</a>    </p>
<p><strong>作者：Loveyuki</strong></p>
<p>截图：</p>
<p><a href="http://www.biggreentea.cn/wp-content/uploads/2010/05/12.gif"><img class="aligncenter size-full wp-image-119" title="12" src="http://www.biggreentea.cn/wp-content/uploads/2010/05/12.gif" alt="" width="641" height="479" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=118</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server 2005 服务管理器</title>
		<link>http://www.biggreentea.cn/?p=115</link>
		<comments>http://www.biggreentea.cn/?p=115#comments</comments>
		<pubDate>Wed, 05 May 2010 16:15:32 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=115</guid>
		<description><![CDATA[SQL Server 2005 相对于 2000 的进步非常大，特别是有了免费的 SQL Server 2005 Express 版本以后，就可以免费使用了。但是 2005 有个比较麻烦的就是找不到跟 2000 一样的服务管理器了。停止运行服务显得有些麻烦，每次都要进配置管理器进行操作，很不方便。
不过不怕，有了这个小工具以后你就可以拥有跟 2000 一样的服务管理器了。启动和停止 SQL Server 服务方便很多。提醒：本程序需要 .NET 2.0 运行环境。
点击下载

]]></description>
			<content:encoded><![CDATA[<p>SQL Server 2005 相对于 2000 的进步非常大，特别是有了免费的 SQL Server 2005 Express 版本以后，就可以免费使用了。但是 2005 有个比较麻烦的就是找不到跟 2000 一样的服务管理器了。停止运行服务显得有些麻烦，每次都要进配置管理器进行操作，很不方便。</p>
<p>不过不怕，有了这个小工具以后你就可以拥有跟 2000 一样的服务管理器了。启动和停止 SQL Server 服务方便很多。提醒：本程序需要 .NET 2.0 运行环境。</p>
<p><a title="下载" href="http://www.biggreentea.cn/tool/SQL2005ServiceMan.cab" target="_blank">点击下载</a></p>
<p><a href="http://www.biggreentea.cn/wp-content/uploads/2010/05/12.png"><img class="aligncenter size-full wp-image-116" title="12" src="http://www.biggreentea.cn/wp-content/uploads/2010/05/12.png" alt="" width="296" height="273" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=115</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>把 SQL Server 存储的层级数据读出成树显示</title>
		<link>http://www.biggreentea.cn/?p=111</link>
		<comments>http://www.biggreentea.cn/?p=111#comments</comments>
		<pubDate>Wed, 05 May 2010 15:58:14 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=111</guid>
		<description><![CDATA[前两天我们介绍了一种新的存储无限级分类方法，但是读出分类的时候怎么实现树形显示呢？方法很简单，我们自己定义一个树形的数据结构，然后根据数据库存储的节点的深度来插入到树里面，当然显示的时候需要用递归来显示一下，不过这里的递归只是在内存里面递归，效率是相当高的。
2008-11-17 更新为不使用树结构，使用排序和深度来做文章。
在数据库读出数据的时候直接按照 LID 来进行 ASC
排序就可以了，默认的排列顺序就是按照树走的，大家可以插入一些数据，并读取一下就可以很明了的看到顺序了，插入树循环的时候只需要对深度进行运算就可以了。
下面我只写出了一些关键地方的代码，具体的代码自己试着多写写在纸上多画画应该就明白了。
另外就是想说下，这种分类算法只适用于一般的树形分类，并不适用于插入数据比较频繁的树形结构，比如说无限次回复的评论，无限次回复的评论有另外一种更适合的算法。
新的方法：
Response.Write(&#8221;
&#8220;);
Response.Write(&#8221;
]]></description>
			<content:encoded><![CDATA[<p>前两天我们介绍了一种新的存储无限级分类方法，但是读出分类的时候怎么实现树形显示呢？方法很简单，我们自己定义一个树形的数据结构，然后根据数据库存储的节点的深度来插入到树里面，当然显示的时候需要用递归来显示一下，不过这里的递归只是在内存里面递归，效率是相当高的。</p>
<p>2008-11-17 更新为不使用树结构，使用排序和深度来做文章。</p>
<p>在数据库读出数据的时候直接按照 LID 来进行 ASC<br />
排序就可以了，默认的排列顺序就是按照树走的，大家可以插入一些数据，并读取一下就可以很明了的看到顺序了，插入树循环的时候只需要对深度进行运算就可以了。</p>
<p>下面我只写出了一些关键地方的代码，具体的代码自己试着多写写在纸上多画画应该就明白了。</p>
<p>另外就是想说下，这种分类算法只适用于一般的树形分类，并不适用于插入数据比较频繁的树形结构，比如说无限次回复的评论，无限次回复的评论有另外一种更适合的算法。</p>
<p>新的方法：</p>
<p>Response.Write(&#8221;</p>
<ul id="\&quot;ZoneTree\&quot;" class="\&quot;tree\&quot;">&#8220;);<br />
Response.Write(&#8221;</p>
<li id="\&quot;zv_0\&quot;"><a class="\&quot;add\&quot;" title="\&quot;增加根区域\&quot;" href="\">增加根区域</a></li>
<p>&#8220;);</p>
<p>ZoneList oZoneList = SiteLoad.ZoneList;<br />
ZoneItem oZoneItem;<br />
Int32 intDee = 1, intNum = oZoneList.Count;</p>
<p>for (Int32 intI = 0; intI &lt; intNum; intI++)<br />
{<br />
oZoneItem = oZoneList[intI];</p>
<p>if (intI != 0 &amp;&amp; oZoneItem.Tree == intDee)<br />
{<br />
Response.Write(&#8220;&#8221;);<br />
}<br />
else if (oZoneItem.Tree &gt; intDee)<br />
{<br />
Response.Write(&#8221;</p>
<ul>&#8220;);<br />
}<br />
else if (oZoneItem.Tree &lt; intDee)<br />
{<br />
Response.Write(SiteFun.EchoText(&#8220;</ul>
<p>&#8220;, intDee &#8211; oZoneItem.Tree));<br />
}</p>
<p>Response.Write(String.Format(&#8221;</p>
<li id="\&quot;zv_{0}\&quot;"><span id="\&quot;zName_{0}\&quot;">{1}</span>&#8220;, oZoneItem.ID, oZoneItem.Name));</li>
<p>intDee = oZoneItem.Tree;</p>
<p>}<br />
Response.Write(SiteFun.EchoText(&#8220;</ul>
<p>&#8220;, intDee &#8211; 1));<br />
Response.Write(&#8220;&#8221;);</p>
<p>旧的树结构方法：</p>
<p>首先我们定义一个树形的数据结构：</p>
<p>public class ZoneList<br />
{<br />
private readonly ZoneList _Parent = null;<br />
private readonly List _Childs = new List();<br />
private readonly ZoneItem _Value = null;</p>
<p>public ZoneList Parent { get { return _Parent; } }</p>
<p>public List Childs { get { return _Childs; } }</p>
<p>public ZoneItem Value { get { return _Value; } }</p>
<p>public ZoneList Root<br />
{<br />
get<br />
{<br />
ZoneList curNode = this;<br />
while (curNode.Parent != null)<br />
{<br />
curNode = curNode.Parent;<br />
}<br />
return curNode;<br />
}<br />
}</p>
<p>public ZoneList() { }</p>
<p>public ZoneList(ZoneItem value, ZoneList parent)<br />
{<br />
_Value = value;<br />
_Parent = parent;<br />
}</p>
<p>public ZoneList AddChild(ZoneItem value)<br />
{<br />
ZoneList nZoneList = new ZoneList(value, this);<br />
_Childs.Add(nZoneList);<br />
return nZoneList;<br />
}<br />
}</p>
<p>然后读取数据库并插入到树：</p>
<p>public ZoneList Select()<br />
{<br />
ZoneList oZoneList = new ZoneList();<br />
ZoneItem oZoneItem;</p>
<p>Int32 intDee = 0;</p>
<p>SqlDataReader oData = SiteSQL.ExecuteReader(&#8220;ZoneSelect&#8221;);<br />
while (oData.Read())<br />
{<br />
oZoneItem = new ZoneItem();<br />
oZoneItem.ID = oData.GetInt32(0);<br />
oZoneItem.Tree = oData.GetInt32(1);<br />
oZoneItem.Name = oData.GetString(2);<br />
intDee = intDee &#8211; oZoneItem.Tree;</p>
<p>for (Int32 intI = 0; intI &lt;= intDee; intI++)<br />
{<br />
oZoneList = oZoneList.Parent;<br />
}</p>
<p>oZoneList = oZoneList.AddChild(oZoneItem);</p>
<p>intDee = oZoneItem.Tree;<br />
}<br />
oData.Close();<br />
return oZoneList.Root;<br />
}</p>
<p>显示的时候直接用递归就可以了：</p>
<p>private void ZoneOutWrite(ZoneList oZoneList)<br />
{<br />
foreach (ZoneList oZoneNode in oZoneList.Childs)<br />
{<br />
Response.Write(String.Format(&#8221;</p>
<li id="\&quot;zv_{0}\&quot;"><span id="\&quot;zName_{0}\&quot;">{1}</span>&#8220;, oZoneNode.Value.ID, oZoneNode.Value.Name));</li>
<p>if (oZoneNode.Childs.Count &gt; 0)<br />
{<br />
Response.Write(&#8221;</p>
<ul>&#8220;);<br />
ZoneOutWrite(oZoneNode);<br />
Response.Write(&#8220;</ul>
<p>&#8220;);<br />
}<br />
Response.Write(&#8220;&#8221;);<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=111</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server 存储层级数据实现无限级分类</title>
		<link>http://www.biggreentea.cn/?p=108</link>
		<comments>http://www.biggreentea.cn/?p=108#comments</comments>
		<pubDate>Wed, 05 May 2010 15:54:45 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=108</guid>
		<description><![CDATA[由于数据库存储的数据都是以平面方式存储，所以目前大部分论坛和其他程序都是用递归来展现层次数据的，如果分类的层次十分深的话那么使用的递归次数相当可观，对性能的影响也非常大。最近要做一个分类信息的平台就遇到这个问题了，那么如何实现快速的展现分层数据呢？MYSQL 的开发者帮我们想到了一个算法，这个算法目前唯一的问题就是尚未实现分类排序，我们可以通过右值的反向排序实现先入先出的排序。在这里我们需要了解的是如何用 SQL Server 来实现，我们就以省市县数据库为例来实现：

如图所示我们将一个树节点的左右各编上号码，就可以看出一些规律，山西的左右值为(8,17)，那么所有左值大于8，右值小于17的节点都是属于山西的子节点。稷山先的左右值为(14,15)，那么他的所有父节点就是左值小于14，右值大于15的节点，怎么样，用这个方法实现的无限级分类性能绝对是顶呱呱的。一次查询就可以查出属于某个节点的数据以及他子节点的数据。这个算是我见过性能最高的无限级分类算法。其他算法跟这个对比基本没有任何优势。
我们先建立一个数据表，结构如下图(LID 为左值，RID 为右值，Tree 为节点深度，Name 和 ID 就不多说了，节点的索引和名称)

我们可以使用下面的存储过程来获得一个节点和其子节点：

CREATE PROCEDURE CLSP_ZoneSelect  
(  
    @Root INT,  
    @Tree INT 
)  
AS 
    SELECT Z.ID,Z.Tree,Z.Name  
    FROM CL_ZoneData AS Z,CL_ZoneData AS P  
    WHERE   P.ID = @Root  
            AND Z.LID &#62;= P.LID AND Z.RID &#60;= P.RID  
            AND (@Tree = 0 OR Z.Tree &#60;= P.Tree + @Tree)  
    ORDER BY Z.LID ASC 
GO 

我们可以用下面这个存储过程来在一个节点下插入新的子节点：

CREATE PROCEDURE CLSP_ZoneInsert  
(  
    @Root INT,  
    @Name NVARCHAR(50)  
)  
AS 
    DECLARE @RID AS INT,@NID AS INT,@Tree AS INT 
 
    SET @RID = 1  
    SET @NID = 0  
    SET @Tree = 1  
 
    IF @Root = 0  
    BEGIN 
        SELECT TOP 1 @RID = RID + 1  
        FROM CL_CateData ORDER BY RID DESC 
    END 
    ELSE 
    BEGIN 
        SELECT @RID = RID, @Tree = Tree + 1  
        FROM CL_ZoneData WHERE ID = @Root  
    END 
 
    IF @Root = 0 OR @RID &#62; 1  
    BEGIN 
        UPDATE CL_ZoneData SET RID = RID + 2 WHERE RID &#62;= @RID  
        UPDATE CL_ZoneData SET LID = LID + 2 WHERE LID &#62; @RID  
 
        INSERT INTO CL_ZoneData(LID,RID,Tree,Name)  
        VALUES (@RID,@RID + 1,@Tree,@Name)  
 
        SET @NID = SCOPE_IDENTITY()  
    END 
    SELECT @NID  
GO 

删除一个节点可以用下面的存储过程：

CREATE PROCEDURE CLSP_ZoneDelete  
(  
    @ID INT 
)   
AS 
    DECLARE @LID AS INT, @RID AS INT, @WID AS INT, @DID AS INT 
    SET @DID = 0  
    SELECT @DID = ID, @LID = LID, @RID = RID, @WID = RID - LID + 1 FROM CL_ZoneData WHERE ID = @ID  
    IF @DID != 0  
    BEGIN 
        DELETE FROM CL_ZoneData WHERE LID BETWEEN @LID AND @RID  
        UPDATE CL_ZoneData SET RID = RID - @WID WHERE RID &#62; @RID  
        UPDATE CL_ZoneData SET LID = LID - @WID WHERE LID &#62; @RID  
    END 
    SELECT @DID  
GO  

]]></description>
			<content:encoded><![CDATA[<p>由于数据库存储的数据都是以平面方式存储，所以目前大部分论坛和其他程序都是用递归来展现层次数据的，如果分类的层次十分深的话那么使用的递归次数相当可观，对性能的影响也非常大。最近要做一个分类信息的平台就遇到这个问题了，那么如何实现快速的展现分层数据呢？MYSQL 的开发者帮我们想到了一个算法，这个算法目前唯一的问题就是尚未实现分类排序，我们可以通过右值的反向排序实现先入先出的排序。在这里我们需要了解的是如何用 SQL Server 来实现，我们就以省市县数据库为例来实现：</p>
<p><a href="http://www.biggreentea.cn/wp-content/uploads/2010/05/7feaas_TreeNum.gif"><img class="aligncenter size-full wp-image-107" title="7feaas_TreeNum" src="http://www.biggreentea.cn/wp-content/uploads/2010/05/7feaas_TreeNum.gif" alt="" width="501" height="231" /></a></p>
<p>如图所示我们将一个树节点的左右各编上号码，就可以看出一些<strong>规律</strong>，山西的左右值为(8,17)，那么所有左值大于8，右值小于17的节点都是属于山西的子节点。稷山先的左右值为(14,15)，那么他的所有父节点就是左值小于14，右值大于15的节点，怎么样，用这个方法实现的无限级分类性能绝对是顶呱呱的。一次查询就可以查出属于某个节点的数据以及他子节点的数据。这个算是我见过性能最高的无限级分类算法。其他算法跟这个对比基本没有任何优势。</p>
<p>我们先建立一个数据表，结构如下图(LID 为左值，RID 为右值，Tree 为节点深度，Name 和 ID 就不多说了，节点的索引和名称)</p>
<p><a href="http://www.biggreentea.cn/wp-content/uploads/2010/05/6evplx_TreeTbl.gif"><img class="aligncenter size-full wp-image-109" title="6evplx_TreeTbl" src="http://www.biggreentea.cn/wp-content/uploads/2010/05/6evplx_TreeTbl.gif" alt="" width="356" height="103" /></a></p>
<p>我们可以使用下面的存储过程来获得一个节点和其子节点：</p>
<pre>
<li>CREATE PROCEDURE CLSP_ZoneSelect  </li>
<li>(  </li>
<li>    @Root INT,  </li>
<li>    @Tree INT </li>
<li>)  </li>
<li>AS </li>
<li>    SELECT Z.ID,Z.Tree,Z.Name  </li>
<li>    FROM CL_ZoneData AS Z,CL_ZoneData AS P  </li>
<li>    WHERE   P.ID = @Root  </li>
<li>            AND Z.LID &gt;= P.LID AND Z.RID &lt;= P.RID  </li>
<li>            AND (@Tree = 0 OR Z.Tree &lt;= P.Tree + @Tree)  </li>
<li>    ORDER BY Z.LID ASC </li>
<li>GO </li>
</pre>
<p>我们可以用下面这个存储过程来在一个节点下插入新的子节点：</p>
<pre>
<li>CREATE PROCEDURE CLSP_ZoneInsert  </li>
<li>(  </li>
<li>    @Root INT,  </li>
<li>    @Name NVARCHAR(50)  </li>
<li>)  </li>
<li>AS </li>
<li>    DECLARE @RID AS INT,@NID AS INT,@Tree AS INT </li>
<li> </li>
<li>    SET @RID = 1  </li>
<li>    SET @NID = 0  </li>
<li>    SET @Tree = 1  </li>
<li> </li>
<li>    IF @Root = 0  </li>
<li>    BEGIN </li>
<li>        SELECT TOP 1 @RID = RID + 1  </li>
<li>        FROM CL_CateData ORDER BY RID DESC </li>
<li>    END </li>
<li>    ELSE </li>
<li>    BEGIN </li>
<li>        SELECT @RID = RID, @Tree = Tree + 1  </li>
<li>        FROM CL_ZoneData WHERE ID = @Root  </li>
<li>    END </li>
<li> </li>
<li>    IF @Root = 0 OR @RID &gt; 1  </li>
<li>    BEGIN </li>
<li>        UPDATE CL_ZoneData SET RID = RID + 2 WHERE RID &gt;= @RID  </li>
<li>        UPDATE CL_ZoneData SET LID = LID + 2 WHERE LID &gt; @RID  </li>
<li> </li>
<li>        INSERT INTO CL_ZoneData(LID,RID,Tree,Name)  </li>
<li>        VALUES (@RID,@RID + 1,@Tree,@Name)  </li>
<li> </li>
<li>        SET @NID = SCOPE_IDENTITY()  </li>
<li>    END </li>
<li>    SELECT @NID  </li>
<li>GO </li>
</pre>
<p>删除一个节点可以用下面的存储过程：</p>
<pre>
<li>CREATE PROCEDURE CLSP_ZoneDelete  </li>
<li>(  </li>
<li>    @ID INT </li>
<li>)   </li>
<li>AS </li>
<li>    DECLARE @LID AS INT, @RID AS INT, @WID AS INT, @DID AS INT </li>
<li>    SET @DID = 0  </li>
<li>    SELECT @DID = ID, @LID = LID, @RID = RID, @WID = RID - LID + 1 FROM CL_ZoneData WHERE ID = @ID  </li>
<li>    IF @DID != 0  </li>
<li>    BEGIN </li>
<li>        DELETE FROM CL_ZoneData WHERE LID BETWEEN @LID AND @RID  </li>
<li>        UPDATE CL_ZoneData SET RID = RID - @WID WHERE RID &gt; @RID  </li>
<li>        UPDATE CL_ZoneData SET LID = LID - @WID WHERE LID &gt; @RID  </li>
<li>    END </li>
<li>    SELECT @DID  </li>
<li>GO  </li>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=108</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>推荐在 ASP.NET 中使用 SQLite</title>
		<link>http://www.biggreentea.cn/?p=105</link>
		<comments>http://www.biggreentea.cn/?p=105#comments</comments>
		<pubDate>Wed, 05 May 2010 15:47:21 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[SQLite ASP.NET]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=105</guid>
		<description><![CDATA[SQLite 是一个轻量级的数据库引擎，相比一般我们用 JET 引擎访问 Aceess 优点很多，ASP.NET 可以使用 System.Data.SQLite 这个 .NET Wrapper，我在本机测试了一下 Bitrac 程序使用不同引擎的速度，目前数据量很小的情况下可以提高一倍的速度，数据库越大提高肯定越多的。就是不知道 System.Data.SQLite 能否在这个服务器上使用，毕竟我所使用的服务器的 .NET 权限是有所限制的。
今天把 Access 到 SQLite 的转换程序已经写完了。明天测试一下服务器是否支持，不管支持不支持，Bitrac 都会多一个 Database Provider。写 Database Provider 真麻烦。每种数据库的 SQL 语句都不太一样，数据类型也要考虑好，真头疼。
]]></description>
			<content:encoded><![CDATA[<p>SQLite 是一个轻量级的数据库引擎，相比一般我们用 JET 引擎访问 Aceess 优点很多，ASP.NET 可以使用 System.Data.SQLite 这个 .NET Wrapper，我在本机测试了一下 Bitrac 程序使用不同引擎的速度，目前数据量很小的情况下可以提高一倍的速度，数据库越大提高肯定越多的。就是不知道 System.Data.SQLite 能否在这个服务器上使用，毕竟我所使用的服务器的 .NET 权限是有所限制的。</p>
<p>今天把 Access 到 SQLite 的转换程序已经写完了。明天测试一下服务器是否支持，不管支持不支持，Bitrac 都会多一个 Database Provider。写 Database Provider 真麻烦。每种数据库的 SQL 语句都不太一样，数据类型也要考虑好，真头疼。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=105</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP之GetRows()，能提高读取数据库的速度？</title>
		<link>http://www.biggreentea.cn/?p=102</link>
		<comments>http://www.biggreentea.cn/?p=102#comments</comments>
		<pubDate>Wed, 05 May 2010 15:42:30 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=102</guid>
		<description><![CDATA[现有10W条数据，Access数据库保存
通过正常提取：
&#60;%
Set conn= Server.CreateObject(&#8220;ADODB.Connection&#8221;)
connstr = &#8220;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&#8221;&#38;Server.MapPath(&#8220;db2.mdb&#8221;)
conn.Open connstr 
Set rs = Server.CreateObject (&#8220;ADODB.Recordset&#8221;)
sql = &#8220;Select * from people order by id desc&#8221;
rs.Open sql,conn,1,1
Do While Not rs.EOF
    Response.write rs(&#8220;id&#8221;)&#38;&#8221; &#124; &#8221;
    rs.MoveNext
Loop
%&#62;
地址：http://www.cnbruce.com/test/getrows/show1.asp耗时3,250.000毫秒，总测试平均值在3秒左右
使用存储过程提取：
&#60;%
Set conn = Server.CreateObject(&#8220;ADODB.Connection&#8221;)
Set cmd = Server.CreateObject(&#8220;ADODB.Command&#8221;)
conn.Open &#8220;Provider=Microsoft.Jet.OLEDB.4.0; Data Source=&#8221; &#38; Server.MapPath(&#8220;db2.mdb&#8221;)http://www.cnbruce.com/test/getrows/show2.asp以上两种均不能彻底解决执行时间漫长的问题，主要原因即是循环每次都须向数据库抽取记录（Command速度相对较快）
cmd.ActiveConnection = conn
cmd.CommandText = &#8220;Select * from people order by id desc&#8221;
Set rs = cmd.Execute
Do While Not rs.EOF
Response.write [...]]]></description>
			<content:encoded><![CDATA[<p>现有10W条数据，Access数据库保存</p>
<p><strong><span style="color: #000000;">通过正常提取：</span></strong></p>
<p><span style="color: #888888;">&lt;%<br />
Set conn= Server.CreateObject(&#8220;ADODB.Connection&#8221;)<br />
connstr = &#8220;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&#8221;&amp;Server.MapPath(&#8220;db2.mdb&#8221;)<br />
conn.Open connstr</span><span style="color: #888888;"> </span></p>
<p>Set rs = Server.CreateObject (&#8220;ADODB.Recordset&#8221;)<br />
sql = &#8220;Select * from people order by id desc&#8221;<br />
rs.Open sql,conn,1,1</p>
<p>Do While Not rs.EOF<br />
    Response.write rs(&#8220;id&#8221;)&amp;&#8221; | &#8221;<br />
    rs.MoveNext<br />
Loop<br />
%&gt;</p>
<p><span style="color: #888888;">地址：<a href="http://www.cnbruce.com/test/getrows/show1.asp" target="_blank"><span style="color: #0000ff;">http://www.cnbruce.com/test/getrows/show1.asp</span></a></span><span style="color: #888888;"><strong>耗时3,250.000毫秒，总测试平均值在3秒左右</strong></span></p>
<p><span style="color: #888888;"><strong><span style="color: #000000;">使用存储过程提取：<br />
</span>&lt;%<br />
Set conn = Server.CreateObject(&#8220;ADODB.Connection&#8221;)<br />
Set cmd = Server.CreateObject(&#8220;ADODB.Command&#8221;)<br />
conn.Open &#8220;Provider=Microsoft.Jet.OLEDB.4.0; Data Source=&#8221; &amp; Server.MapPath(&#8220;db2.mdb&#8221;)</strong><a href="http://www.cnbruce.com/test/getrows/show2.asp" target="_blank"><span style="color: #0000ff;"><strong>http://www.cnbruce.com/test/getrows/show2.asp</strong></span></a><strong></strong><span style="color: #000000;"><strong>以上两种均不能彻底解决执行时间漫长的问题，主要原因即是循环每次都须向数据库抽取记录（Command速度相对较快）</strong></span></span></p>
<p>cmd.ActiveConnection = conn<br />
cmd.CommandText = &#8220;Select * from people order by id desc&#8221;<br />
Set rs = cmd.Execute</p>
<p>Do While Not rs.EOF<br />
Response.write rs(&#8220;id&#8221;)&amp;&#8221; | &#8221;<br />
rs.MoveNext<br />
Loop<br />
%&gt;</p>
<p>耗时2,187.500毫秒，总测试平均值在2秒左右</p>
<p>=========================================================</p>
<p>那么使用GetRows()方法呢：</p>
<p><span style="color: #888888;"><br />
<strong>&lt;%<br />
Set conn = Server.CreateObject(&#8220;ADODB.Connection&#8221;)<br />
Set cmd = Server.CreateObject(&#8220;ADODB.Command&#8221;)</strong><a href="http://www.cnbruce.com/test/getrows/show3.asp" target="_blank"><span style="color: #0000ff;"><strong>http://www.cnbruce.com/test/getrows/show3.asp</strong></span></a><strong></strong><a href="http://www.blueidea.com/tech/program/2005/2853.asp" target="_blank"><span style="color: #0000ff;"><strong>http://www.blueidea.com/tech/program/2005/2853.asp</strong></span></a></span></p>
<p>conn.Open &#8220;Provider=Microsoft.Jet.OLEDB.4.0; Data Source=&#8221; &amp; Server.MapPath(&#8220;db2.mdb&#8221;)<br />
cmd.ActiveConnection = conn<br />
cmd.CommandText = &#8220;Select * from people order by id desc&#8221;<br />
Set rs = cmd.Execute<br />
rsArray = rs.GetRows()</p>
<p>For i = 0 To UBound(rsArray, 2)<br />
Response.Write rsArray(0, i)&amp;&#8221; | &#8221;<br />
Next<br />
%&gt;</p>
<p>耗时187.500毫秒，总测试平均值在0.2秒左右</p>
<p>GetRows()方法是将数据从 Recordset 复制到二维数组中，这是一个二维数组，第一个下标标识字段，第二个则标识记录号</p>
<p>所以rsArray = rs.GetRows()<br />
rsArray(0, 0)就表示记录集第一行的第一字段值<br />
rsArray(1, 0)就表示记录集第一行的第二字段值</p>
<p>数组的数据是保存在内存中的，这就从根本上解决了每次显示记录还需向数据库请求的麻烦。</p>
<p>另外，关于GetRows()的详细介绍和用法，这里有份内容参考</p>
<p>http://www.blueidea.com/tech/program/2005/2853.asp</p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=102</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery可以保护邮件地址</title>
		<link>http://www.biggreentea.cn/?p=99</link>
		<comments>http://www.biggreentea.cn/?p=99#comments</comments>
		<pubDate>Wed, 05 May 2010 14:29:06 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=99</guid>
		<description><![CDATA[保护邮件地址的方法为数众多，随便一搜就能找出大把。若是刚好有使用 jQuery 框架，这里有个用 jQuery 保护邮件地址的方案。此方案的优点在于：邮件地址分段存储在 JS 之中，链接被点击以后，邮件地址才会从 JS 中调出并写入 HTML 页面，目前再厉害的机器人拿它都没办法，除非开着浏览器点击。缺点嘛，访客的浏览器不支持 JS 的话会被当作机器人对待XD。
另外需要说明的是，代码本来很简单，但是考虑到大众的审美需求，多数人都会喜欢稍稍华丽的过渡效果，
所以先提供一个所谓的&#8221;华丽版&#8221;(演示地址)：
html：
&#60;p&#62;我的邮箱：&#60;a href=&#8221;javascript:void(0)&#8221;&#62;点击查看&#60;/a&#62;&#60;/p&#62;
js：
$(document).ready(function(){
$(&#8220;.email&#8221;).click(function(){
var A=&#8221;admin&#8221;
var B=&#8221;domain.com&#8221;
var C=A+&#8221;@&#8221;+B;
$(this).parent().append(&#8220;&#60;img src=&#8217;loading.gif&#8217; /&#62;&#8220;);
$(this).hide();
setTimeout(function(){
var D=$(&#8220;.email&#8221;);
D.next().hide();
D.text(C);
D.attr(&#8220;href&#8221;,&#8221;mailto:&#8221;+C).unbind(&#8220;click&#8221;);
D.fadeIn(1000)
},3000)
})
})
使用时，红色字体是你需要修改的部分，然后将 JS 保存为一个文件在网页上引用。链接被点击后，浏览者需要等待三秒才会看见邮件地址，既然假装异步我们就假装到底。其中用到了一个 loading 图片，你可以换成你自己的。
最后再来个朴素版：
$(document).ready(function(){
$(&#8220;.email2&#8243;).click(function(){
var A=&#8221;admin&#8221;
var B=&#8221;domain.com&#8221;
var C=A+&#8221;@&#8221;+B;
$(this).text(C);
})
})
]]></description>
			<content:encoded><![CDATA[<p>保护邮件地址的方法为数众多，随便一搜就能找出大把。若是刚好有使用 jQuery 框架，这里有个用 jQuery 保护邮件地址的方案。此方案的优点在于：邮件地址分段存储在 JS 之中，链接被点击以后，邮件地址才会从 JS 中调出并写入 HTML 页面，目前再厉害的机器人拿它都没办法，除非开着浏览器点击。缺点嘛，访客的浏览器不支持 JS 的话会被当作机器人对待XD。</p>
<p>另外需要说明的是，代码本来很简单，但是考虑到大众的审美需求，多数人都会喜欢稍稍华丽的过渡效果，</p>
<p>所以先提供一个所谓的&#8221;华丽版&#8221;(<a rel="external nofollow" href="http://ishawn.net/jQuery/email-protection.html">演示地址</a>)：</p>
<p><span style="color: #008000;">html：</span></p>
<p><span style="color: #008000;">&lt;p&gt;我的邮箱：&lt;a href=&#8221;javascript:void(0)&#8221;&gt;点击查看&lt;/a&gt;&lt;/p&gt;</span></p>
<p><span style="color: #008000;">js：</span></p>
<p><span style="color: #008000;">$(document).ready(function(){<br />
$(&#8220;.email&#8221;).click(function(){<br />
var A=&#8221;<span style="color: #ff0000;">admin</span>&#8221;<br />
var B=&#8221;<span style="color: #ff0000;">domain.com</span>&#8221;<br />
var C=A+&#8221;@&#8221;+B;<br />
$(this).parent().append(&#8220;<span style="color: #ff0000;">&lt;img src=&#8217;loading.gif&#8217; /&gt;</span>&#8220;);<br />
$(this).hide();<br />
setTimeout(function(){<br />
var D=$(&#8220;.email&#8221;);<br />
D.next().hide();<br />
D.text(C);<br />
D.attr(&#8220;href&#8221;,&#8221;mailto:&#8221;+C).unbind(&#8220;click&#8221;);<br />
D.fadeIn(1000)<br />
},<span style="color: #ff0000;">3000</span>)<br />
})<br />
})</span></p>
<p>使用时，红色字体是你需要修改的部分，然后将 JS 保存为一个文件在网页上引用。链接被点击后，浏览者需要等待三秒才会看见邮件地址，既然假装异步我们就假装到底。其中用到了一个 loading 图片，你可以换成你自己的。</p>
<p>最后再来个朴素版：</p>
<p>$(document).ready(function(){<br />
$(&#8220;.email2&#8243;).click(function(){<br />
var A=&#8221;<span style="color: #ff0000;">admin</span>&#8221;<br />
var B=&#8221;<span style="color: #ff0000;">domain.com</span>&#8221;<br />
var C=A+&#8221;@&#8221;+B;<br />
$(this).text(C);<br />
})<br />
})</p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=99</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 页面载入进度条</title>
		<link>http://www.biggreentea.cn/?p=93</link>
		<comments>http://www.biggreentea.cn/?p=93#comments</comments>
		<pubDate>Wed, 05 May 2010 13:51:26 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=93</guid>
		<description><![CDATA[在网页的&#60;/body&#62;标签前插入下面两条的任意一条：
&#60;script type='text/javascript'
src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'&#62;&#60;/script&#62;
&#60;script type='text/javascript'
src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js'&#62;&#60;/script&#62;
在网页的&#60;body&#62;...&#60;/body&#62;之间插入&#60;div
id="status"&#62;LOADING...&#60;/div&#62;
CSS 文件可以这样写
#status{
background:none repeat scroll 0 0
#27BCEF;
border-bottom:1px solid #888888;
border-right:1px solid
#888888;
color:#FFFFFF;
float:right;
font-size:11px;
left:45%;
letter-spacing:2px;
padding:6px
12px;
position:fixed;
text-align:center;
top:20%;
z-index:999;
_position:absolute;
_bottom:auto;
_top:expression(eval(document.documentElement.scrollTop));
_margin-top:20%;
}
JavaScript 文件这样写（务必放在 jQuery 库后面）：
&#60;script
type="text/javascript"&#62;
$('#status').fadeOut(800);
$("a[rel!='nofollow']a[rel!='external'][target!='_blank']a[class!='load']").click(function()
{
$("#status").fadeIn(400);
setTimeout(function()
{
$("#status").fadeOut(400)
},
4000)
});
$("a[href*='#'],a[rel='external
nofollow'],a[href='javascript:void(0)'],a[href='javascript:reset_captcha('')']").click(function()
{
$("#status").fadeOut(400)
});
&#60;/script&#62;
err&#8230;代码我也不多解释了，如果不会的话可以直接复制、粘贴，原因是你不熟悉 JavaScript 跟正则表达式；如果你会自然也不用我多解释了。
]]></description>
			<content:encoded><![CDATA[<p><strong>在网页的<code>&lt;/body&gt;</code>标签前插入下面两条的任意一条：</strong></p>
<p><code class="block">&lt;script type='text/javascript'<br />
src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'&gt;&lt;/script&gt;</code></p>
<p><code class="block">&lt;script type='text/javascript'<br />
src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js'&gt;&lt;/script&gt;</code></p>
<p>在网页的<code>&lt;body&gt;...&lt;/body&gt;</code>之间插入<code>&lt;div<br />
id="status"&gt;LOADING...&lt;/div&gt;</code></p>
<p><strong>CSS 文件可以这样写</strong></p>
<p><code class="block">#status{<br />
background:none repeat scroll 0 0<br />
#27BCEF;<br />
border-bottom:1px solid #888888;<br />
border-right:1px solid<br />
#888888;<br />
color:#FFFFFF;<br />
float:right;<br />
font-size:11px;<br />
left:45%;<br />
letter-spacing:2px;<br />
padding:6px<br />
12px;<br />
position:fixed;<br />
text-align:center;<br />
top:20%;<br />
z-index:999;<br />
_position:absolute;<br />
_bottom:auto;<br />
_top:expression(eval(document.documentElement.scrollTop));<br />
_margin-top:20%;<br />
}</code></p>
<p><strong>JavaScript 文件这样写（务必放在 jQuery 库后面）：</strong></p>
<p><code class="block">&lt;script<br />
type="text/javascript"&gt;<br />
$('#status').fadeOut(800);<br />
$("a[rel!='nofollow']a[rel!='external'][target!='_blank']a[class!='load']").click(function()<br />
{<br />
$("#status").fadeIn(400);<br />
setTimeout(function()<br />
{<br />
$("#status").fadeOut(400)<br />
},<br />
4000)<br />
});<br />
$("a[href*='#'],a[rel='external<br />
nofollow'],a[href='javascript:void(0)'],a[href='javascript:reset_captcha('')']").click(function()<br />
{<br />
$("#status").fadeOut(400)<br />
});<br />
&lt;/script&gt;</code></p>
<p>err&#8230;代码我也不多解释了，如果不会的话可以直接复制、粘贴，原因是你不熟悉 JavaScript 跟正则表达式；如果你会自然也不用我多解释了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=93</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>国产基于jQuery的优秀XHTML在线编辑器xhEditor</title>
		<link>http://www.biggreentea.cn/?p=85</link>
		<comments>http://www.biggreentea.cn/?p=85#comments</comments>
		<pubDate>Tue, 04 May 2010 18:14:45 +0000</pubDate>
		<dc:creator>biggreentea</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.biggreentea.cn/?p=85</guid>
		<description><![CDATA[说起xhtml在线编辑器，我们可能会想起大名鼎鼎的FCKeditor、TinyMCE……，不过它们都是老外开发的。今天要向大家推荐的是一款国产的优秀XHTML在线编辑器xhEditor。 xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化XHTML编辑器，基于网络访问并且兼容IE 6.0+,Firefox 3.0+,Opera 9.6+,Chrome 1.0+,Safari 3.22+。
从最初的0.9.1版的发布，到现在的1.0.0 beta2版，经过9个多月的开发更新，xhEditor编辑器已经越来越完善，并得到了大量的用户认可和支持。xhEditor团队这种持续改进的态度，也是我对它认可的重要原因。
【xhEditor特色】

小巧：初始加载4个文件，包括：1个js(46k)+2个css(9k)+1个图片(5k)，总共60k。若js和css文件进行gzip压缩，可以进一步缩减为21k左右。
快速：基于jQuery引擎开发，提供高效的代码执行效率
简单：简单的调用方式，加一个class属性就能将您的textarea立马变成一个功能丰富的可视化编辑器。
支持Word：实现Word代码自动检测并清理，提供高效完美的Word代码过滤方案，生成代码最优化精简，但是却不丢失任何细节效果。
支持UBB：提供完美的UBB可视化编辑解决方案，在您获得安全高效代码存储的同时，又能享受可视化编辑的便捷

【在线示例】

默认模式：http://xheditor.com/demos/demo01.html
自定义按钮：http://xheditor.com/demos/demo02.html
皮肤选择：http://xheditor.com/demos/demo03.html
其它选项：http://xheditor.com/demos/demo04.html
Javascript交互：http://xheditor.com/demos/demo05.html
非utf-8 编码网页调用：http://xheditor.com/demos/demo06.html
UBB可视化编辑：http://xheditor.com/demos/demo07.html
Ajax文件 上传：http://xheditor.com/demos/demo08.html
插件扩展：http://xheditor.com/demos/demo09.html
iframe 调用文件上传：http://xheditor.com/demos/demo10.html
异步加载：http://xheditor.com/demos/demo11.html

访问官方网站及下载：http://code.google.com/p/xheditor/
]]></description>
			<content:encoded><![CDATA[<p>说起xhtml在线编辑器，我们可能会想起大名鼎鼎的FCKeditor、TinyMCE……，不过它们都是老外开发的。今天要向大家推荐的是一款国产的优秀XHTML在线编辑器xhEditor。 xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化XHTML编辑器，基于网络访问并且兼容IE 6.0+,Firefox 3.0+,Opera 9.6+,Chrome 1.0+,Safari 3.22+。</p>
<p>从最初的0.9.1版的发布，到现在的1.0.0 beta2版，经过9个多月的开发更新，xhEditor编辑器已经越来越完善，并得到了大量的用户认可和支持。xhEditor团队这种持续改进的态度，也是我对它认可的重要原因。</p>
<p><strong>【xhEditor特色】</strong></p>
<ul>
<li>小巧：初始加载4个文件，包括：1个js(46k)+2个css(9k)+1个图片(5k)，总共60k。若js和css文件进行gzip压缩，可以进一步缩减为21k左右。</li>
<li>快速：基于jQuery引擎开发，提供高效的代码执行效率</li>
<li>简单：简单的调用方式，加一个class属性就能将您的textarea立马变成一个功能丰富的可视化编辑器。</li>
<li>支持Word：实现Word代码自动检测并清理，提供高效完美的Word代码过滤方案，生成代码最优化精简，但是却不丢失任何细节效果。</li>
<li>支持UBB：提供完美的UBB可视化编辑解决方案，在您获得安全高效代码存储的同时，又能享受可视化编辑的便捷</li>
</ul>
<p><strong>【在线示例】</strong></p>
<ul>
<li>默认模式：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo01.html">http://xheditor.com/demos/demo01.html</a></li>
<li>自定义按钮：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo02.html">http://xheditor.com/demos/demo02.html</a></li>
<li>皮肤选择：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo03.html">http://xheditor.com/demos/demo03.html</a></li>
<li>其它选项：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo04.html">http://xheditor.com/demos/demo04.html</a></li>
<li>Javascript交互：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo05.html">http://xheditor.com/demos/demo05.html</a></li>
<li>非utf-8 编码网页调用：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo06.html">http://xheditor.com/demos/demo06.html</a></li>
<li>UBB可视化编辑：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo07.html">http://xheditor.com/demos/demo07.html</a></li>
<li>Ajax文件 上传：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo08.html">http://xheditor.com/demos/demo08.html</a></li>
<li>插件扩展：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo09.html">http://xheditor.com/demos/demo09.html</a></li>
<li>iframe 调用文件上传：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo10.html">http://xheditor.com/demos/demo10.html</a></li>
<li>异步加载：<a onclick="pageTracker._trackPageview('/outbound/article/xheditor.com');" rel="nofollow" href="http://xheditor.com/demos/demo11.html">http://xheditor.com/demos/demo11.html</a></li>
</ul>
<p>访问官方网站及下载：<a onclick="pageTracker._trackPageview('/outbound/article/code.google.com');" href="http://code.google.com/p/xheditor/">http://code.google.com/p/xheditor/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.biggreentea.cn/?feed=rss2&amp;p=85</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
