﻿<?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>IT博客-飞得更高-随笔分类-&lt;font color="red"&gt;IT歧途&lt;/font&gt;</title><link>http://www.cnitblog.com/qiuwuqiu/category/4958.html</link><description>己所不欲，勿施于人
&lt;form action="www.baidu.com"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;input type="button" onClick="shake(3)" value="我要发泄！！！"&gt;

&lt;/form&gt;
&lt;div id="ring" class="ringstyle"&gt;
	&lt;p&gt;&lt;font color="red"&gt;）&lt;/font&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div id="redirection" class="explain"&gt;
&lt;/div&gt; 
&lt;style&gt;
.ringstyle {
position:absolute;
visibility:visible;
top:-50px;
font-size:5pt;
font-family:Verdana;
color:FF0000
}
.explain {
position:absolute;
top:80px; 
left:40px; 
width:300px; 
color:000000;
text-align:center;
font-size:20pt;
font-family:Times;
}
&lt;/style&gt;
&lt;script LANGUAGE="JavaScript"&gt;


var x,y
var timer
var i_fontsize=0
var step=0
var thisx,thisy
function handlerMM(e){
	 // x = window.screen.width/2;
	  //y = window.screen.height/2;
	x = (document.layers) ? e.pageX : event.clientX
	y = (document.layers) ? e.pageY : event.clientY
}
function ringup() {
	if (document.all) {
		thisx = x
		thisy = y
		ringup2()
	}
}
function ringup2() {
	if (i_fontsize &lt;= 300) { 
		document.all.ring.style.fontSize=i_fontsize
		document.all.ring.style.color="rgb(255,"+Math.floor(i_fontsize/6)+","+Math.floor(i_fontsize/6)+")"
		document.all.ring.style.posLeft = thisx - (Math.floor(i_fontsize/4))
		document.all.ring.style.posTop = thisy-(Math.floor(i_fontsize/2))
		step += 3
		i_fontsize += step
		timer=setTimeout("ringup(2)",50)
	}
	else {
		clearTimeout(timer)
		i_fontsize = 0
		step = 0
		document.all.ring.style.posTop=-8000
	}
	
}
document.onmousemove = handlerMM;

function shake(n) 
{
  ringup();
  if (window.moveBy) 
  {
    for (i = 3; i &gt; 0; i--) 
    {
	  event.keyDown = 20
      for (j = n; j &gt; 0; j--) 
      {
        window.moveBy(0,i);
        window.moveBy(i,0);
        window.moveBy(0,-i);
        window.moveBy(-i,0);
      }
    }
	
  }
}

&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 16:13:53 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 16:13:53 GMT</pubDate><ttl>60</ttl><item><title>【转载】Visual Studio：针对 Java 开发人员的 C# 编程语言</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24283.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Mon, 19 Mar 2007 07:51:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24283.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24283.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24283.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24283.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Visual Studio：针对 Java 开发人员的 C# 编程语言						发布日期： 7/23/2004 | 更新日期： 7/23/2004						本文讨论 Java 和 C# 之间的异同点，目的在于当迁移到 .NET 时，让 Java 开发人员掌握所涉及的一些知识。Java 和 C# 之间的主要相似点是：																						...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24283.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-19 15:51 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】Visual C# .NET 入门</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24282.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Mon, 19 Mar 2007 07:41:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24282.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24282.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24282.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24282.html</trackback:ping><description><![CDATA[
		<h1>Visual C# .NET 入门</h1>
		<div class="date">发布日期： 6/28/2004<span class="datePipe"> | </span>更新日期： 6/28/2004</div>
		<div class="overview">
				<p>Microsoft Corporation</p>
				<p>适用于：Microsoft Visual C# .NET</p>
				<p>
						<b>摘要</b>：Visual C# .NET 是功能强大的编程语言 Visual Studio 套件的最新成员。Visual C# .NET 入门指南通过实现一个简单的 QuickSort 算法，带您领略如何构建 Visual C# .NET 项目。</p>
				<p>下载 <a href="http://download.microsoft.com/download/f/f/8/ff8c8040-d1a7-4402-90df-5d1aaa7d37af/Quicksort_Visual_CSharp_.NET.exe" target="_blank">Quicksort_Visual_CSharp_.NET.exe</a>。</p>
		</div>
		<center>
				<img title="" height="6" alt="*" src="http://img.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif" width="30" border="0" />
		</center>
		<div style="HEIGHT: 18px">
		</div>
		<h5 style="PADDING-TOP: 2px">本页内容</h5>
		<table style="MARGIN-TOP: 7px; MARGIN-BOTTOM: 12px" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EBC">
												<img height="9" alt="简介" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EBC">简介</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EKC">
												<img height="9" alt="步骤 1. 开始项目" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EKC">步骤 1. 开始项目</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E3D">
												<img height="9" alt="步骤 2. Hello, World!" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E3D">步骤 2. Hello, World!</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EEG">
												<img height="9" alt="步骤 3. 程序结构" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EEG">步骤 3. 程序结构</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EIAAC">
												<img height="9" alt="步骤 4. 控制台输入" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EIAAC">步骤 4. 控制台输入</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EFBAC">
												<img height="9" alt="步骤 5. 使用数组" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EFBAC">步骤 5. 使用数组</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EKCAC">
												<img height="9" alt="步骤 6. 文件输入/输出" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EKCAC">步骤 6. 文件输入/输出</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EAEAC">
												<img height="9" alt="步骤 7. 创建函数" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EAEAC">步骤 7. 创建函数</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EVFAC">
												<img height="9" alt="步骤 8. 使用调试器" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#EVFAC">步骤 8. 使用调试器</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E2IAC">
												<img height="9" alt="小结" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E2IAC">小结</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E2JAC">
												<img height="9" alt="补遗：QuickSort C# .NET 的源代码" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E2JAC">补遗：QuickSort C# .NET 的源代码</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E6JAC">
												<img height="9" alt="补遗：关于 QuickSort C# .NET" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#E6JAC">补遗：关于 QuickSort C# .NET</a>
								</td>
						</tr>
				</tbody>
		</table>
		<a name="EBC">
		</a>
		<h2>简介</h2>
		<p>Visual C# .NET 是 Visual Studio 系列中的最新成员。这种新语言基于 C/C++，但它深化了更容易地使用面向组件编程的发展方向。C/C++ 程序员应该非常熟悉它的语法。</p>
		<p>下面的示例应用程序示范了如何构建一个简单的实现 QuickSort 算法的 C# 项目。它包括了 C# 程序的基本组成部分：读/写控制台和文件、创建函数和使用基本数组。</p>
		<p>这些入门指南并不打算涵盖该编程语言的所有方面。它们只是您探索这种语言的一个起点。我们鼓励您按照本教程的说明执行，因为它包括了 QuickSort 应用程序的各个不同部分。您还可以获得完整的源代码和项目文件。</p>
		<p>
				<b>建议的要求</b>
		</p>
		<p>编译此示例应用程序需要 Visual Studio.NET（测试版 2 或更高版本）。关于 C/C++ 的知识是有帮助的但不是必需的。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="EKC">
		</a>
		<h2>步骤 1. 开始项目</h2>
		<p>Visual Studio 中的开发工作以解决方案的形式进行组织，每个解决方案包含一个或多个项目。在本教程中，我们创建的解决方案包含一个 C# 项目。</p>
		<h3>创建一个新项目</h3>
		<table class="numberedList" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>1.</p>
								</td>
								<td>
										<p>在 Visual Studio .NET 环境中，从菜单中选择 <b>File | New | Project</b>。 </p>
										<div style="WIDTH: 376px">
												<img height="100" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-01.gif" width="376" border="0" />
												<br />
												<p class="figureCaption">
												</p>
												<div class="figureRule">
												</div>
										</div>
								</td>
						</tr>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>2.</p>
								</td>
								<td>
										<p>在左侧选择 <b>Visual C#</b><b>Projects</b>，然后在右侧选择 <b>Console Application</b>。 </p>
										<div style="WIDTH: 525px">
												<img height="114" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-02.gif" width="525" border="0" />
												<br />
												<p class="figureCaption">
												</p>
												<div class="figureRule">
												</div>
										</div>
								</td>
						</tr>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>3.</p>
								</td>
								<td>
										<p>指定项目的名称，然后输入创建项目的位置。Visual Studio 会自动创建项目目录。 </p>
										<div style="WIDTH: 421px">
												<img height="56" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-03.gif" width="421" border="0" />
												<br />
												<p class="figureCaption">
												</p>
												<div class="figureRule">
												</div>
										</div>
								</td>
						</tr>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>4.</p>
								</td>
								<td>
										<p>单击 OK，那么现在就正式开始了！ </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h3>Visual C# 解决方案</h3>
		<p>Visual Studio.NET 已经创建了含有一个简单 Visual C# 项目的解决方案。该项目包含两个文件：assemblyinfo.cs 和 class1.cs。</p>
		<p>接下来的几步骤将讨论这些不同的文件以及如何编译该项目。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="E3D">
		</a>
		<h2>步骤 2. Hello, World!</h2>
		<p>很遗憾，但我们仍然无法抵御这种诱惑……我们还是不得不完成一个基于 C# 的经典"Hello, World!"应用程序，这个应用程序最初是用 C 语言编写的。</p>
		<h3>修改源代码</h3>
		<table class="numberedList" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>1.</p>
								</td>
								<td>
										<p>在 Solution Explorer 中双击文件"class1.cs"。可以通过"View"菜单来显示 Solution Explorer。 </p>
								</td>
						</tr>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>2.</p>
								</td>
								<td>
										<p>更改预生成的模板 (class1.cs)，如下面以斜体突出显示的 代码所示。 </p>
										<pre class="codeSample">using System;
namespace quicksort
{
    /// 
    /// Summary description for Class1.
    /// 
    class Class1
    {
        static void Main(string[] args)
        {
            //
            // TODO: Add code to start application here
            //
            Console.WriteLine ("Hello, C#.NET World!");
        }
    }
}
</pre>
								</td>
						</tr>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>3.</p>
								</td>
								<td>
										<p>注意，当您键入代码时，Visual Studio 将为您提示类和函数的名称（因为 .NET 框架发布了这种类型信息）。 </p>
										<div style="WIDTH: 500px">
												<img height="100" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-04.gif" width="500" border="0" />
												<br />
												<p class="figureCaption">
												</p>
												<div class="figureRule">
												</div>
										</div>
										<div style="WIDTH: 400px">
												<img height="61" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-05.gif" width="400" border="0" />
												<br />
												<p class="figureCaption">
												</p>
												<div class="figureRule">
												</div>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<h3>编译应用程序</h3>
		<table class="numberedList" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>1.</p>
								</td>
								<td>
										<p>既然您已经完成了修改，就可以通过在 Build 菜单中简单地选择 Build 来编译 Visual C# 项目。 </p>
										<div style="WIDTH: 380px">
												<img height="69" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-06.gif" width="380" border="0" />
												<br />
												<p class="figureCaption">
												</p>
												<div class="figureRule">
												</div>
										</div>
								</td>
						</tr>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>2.</p>
								</td>
								<td>
										<p>来自 C# 编译器的错误和消息会在 Output 窗口中显示。如果没有错误，则可以通过单击 Debug 菜单下的 Start without Debugging 来运行 Hello World 应用程序。 </p>
										<div style="WIDTH: 431px">
												<img height="117" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-07.gif" width="431" border="0" />
												<br />
												<p class="figureCaption">
												</p>
												<div class="figureRule">
												</div>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<h3>程序输出</h3>
		<p>在 Visual C# 中运行 Hello World 示例应用程序时，输出结果的屏幕截图如下：</p>
		<div style="WIDTH: 369px">
				<img height="93" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-08.gif" width="369" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<h3>理解更改</h3>
		<p>
				<b>System.Console </b>类的 <b>WriteLine() </b>函数打印传递给它的字符串，其后紧跟一行新的字符。此函数可以接受许多其他数据类型（包括整型和浮点型）的参数。</p>
		<p>在程序加载完成后，控制就传递给 <b>Main() </b>函数。这就是我们在该过程中插入对 <b>WriteLine()</b> 调用的原因。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="EEG">
		</a>
		<h2>步骤 3. 程序结构</h2>
		<p>既然我们已经构建了一个简单的 Hello World 应用程序，那么就让我们停下来分析一下 Visual C# 应用程序的基本组成部分。</p>
		<h3>源代码注释</h3>
		<p>字符 // 将行的剩余部分标记为一个注释，这样 C# 编译器就会忽略它。另外，/* 和 */ 之间的代码也会被当作注释。</p>
		<pre class="codeSample">// This line is ignored by the compiler.
/* This block of text is also
ignored by the Visual C# compiler. */
</pre>
		<h3>Using 指令</h3>
		<p>.NET 框架为开发人员提供了许多有用的类。例如，<b>Console</b> 类处理对控制台窗口的输入和输出。这些类是按照层次树的形式组织的。<b>Console</b> 类的完全限定名实际上是 <b>System.Console</b>。其他的类包括 <b>System.IO.FileStream</b> 和 <b>System.Collections.Queue</b>。</p>
		<p>
				<b>using</b> 指令允许您在不使用完全限定名的情况下引用命名空间中的类。以<i>斜体突出显示</i>的 代码应用了 <b>using</b> 指令。</p>
		<pre class="codeSample">using System;
class Class1
{
    static void Main(string[] args)
    {
        System.Console.WriteLine ("Hello, C#.NET World!");
        Console.WriteLine ("Hello, C#.NET World!");
    }
}
</pre>
		<h3>类声明</h3>
		<p>与 C++ 或 Visual Basic 不同，Visual C# 中的所有函数都必须封装在一个类中。<b>class</b> 语句声明一个新的 C# 类。就 Hello World 应用程序来说，<b>Class1</b> 类包含一个函数，即 <b>Main()</b> 函数。如果用一个 <b>namespace</b> 块将类的定义括起来，就可以把类组织为诸如 <b>MsdnAA.QuickSortApp</b> 这样的层次。</p>
		<p>在本入门指南中，我们并不打算深入地介绍类，但是我们将为您简要概述为什么类是我们的示例应用程序的一部分。</p>
		<h3>Main() 函数</h3>
		<p>在应用程序加载到内存之后，<b>Main() </b>函数就会接收控制，因此，应该将应用程序启动代码放在此函数中。传递给程序的命令行参数存储在 <b>args</b> 字符串数组中。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="EIAAC">
		</a>
		<h2>步骤 4. 控制台输入</h2>
		<p>现在，我们将继续编写 QuickSort 应用程序。我们需要做的第一件事就是提示用户提供输入和输出文件。</p>
		<h3>修改源代码</h3>
		<p>更改 C# 源文件 (class1.cs)，如下面以斜体突出显示的代码所示。其他的差异（如类名）可忽略不计。</p>
		<pre class="codeSample">// Import namespaces
using System;
// Declare namespace
namespace MsdnAA
{
    // Declare application class
    class QuickSortApp
    {
        // Application initialization
        static void Main (string[] szArgs)
        {
            // Describe program function
            Console.WriteLine ("QuickSort C#.NET Sample Application\n");
            // Prompt user for filenames
            Console.Write ("Source: ");
            string szSrcFile = Console.ReadLine ();
            Console.Write ("Output: ");
            string szDestFile = Console.ReadLine ();
        }
    }
}
</pre>
		<h3>从控制台进行读取</h3>
		<p>
				<b>Console</b> 类的 <b>ReadLine() </b>方法提示用户输入，并返回输入的字符串。它会自动地为字符串处理内存分配，由于使用了 .NET 垃圾回收器，您不需要做任何释放内存的工作。</p>
		<h3>程序输出</h3>
		<p>从菜单中选择 <b>Debug | Start Without Debugging </b>来运行程序。这是到此为止来自 QuickSort 应用程序的输出的屏幕截图。</p>
		<div style="WIDTH: 433px">
				<img height="127" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-09.gif" width="433" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="EFBAC">
		</a>
		<h2>步骤 5. 使用数组</h2>
		<p>在对从输入读取的行进行排序之前，程序需要将其存储到一个数组中。我们将简要讨论可实现对象数组的 .NET 基类的用法。</p>
		<h3>修改源代码</h3>
		<p>更改 C# 源文件 (class1.cs)，如下面以斜体突出显示的代码所示。其他的差异（如类名）可忽略不计。</p>
		<pre class="codeSample">// Import namespaces
using System;
using System.Collections;
// Declare namespace
namespace MsdnAA
{
    // Declare application class
    class QuickSortApp
    {
        // Application initialization
        static void Main (string[] szArgs)
        {
            // Describe program function
            Console.WriteLine ("QuickSort C#.NET Sample Application\n");
            // Prompt user for filenames
            Console.Write ("Source: ");
            string szSrcFile = Console.ReadLine ();
            Console.Write ("Output: ");
            string szDestFile = Console.ReadLine ();
            // TODO: Read contents of source file
            ArrayList szContents = new ArrayList ();
        }
    }
}
</pre>
		<h3>使用 ArrayList 类</h3>
		<p>我们将导入 System.Collections 命名空间，这样我们就可以直接引用 <b>ArrayList</b>。此类实现大小可动态调整的对象数组。要插入新的元素，可以简单地将对象传递到 <b>ArrayList</b> 类的 <b>Add() </b>方法。新的数组元素将引用原始的对象，而垃圾回收器将处理它的释放。</p>
		<pre class="codeSample">string szElement = "insert-me";
ArrayList szArray = new ArrayList ();
szArray.Add (szElement);
</pre>
		<p>要检索现有的元素，请将所需元素的索引传递给 <b>Item() </b>方法。另外，作为一种简写形式，还可以使用方括号 <b>operator []</b>，它实际上映射到<b> Item()</b> 方法。</p>
		<pre class="codeSample">Console.WriteLine (szArray[2]);
Console.WriteLine (szArray.Item (2));
</pre>
		<p>
				<b>ArrayList</b> 类中还有许多其他方法，但是插入和检索都是我们需要在此示例中使用的。请查阅 MSDN 库以获得完整的参考指南。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="EKCAC">
		</a>
		<h2>步骤 6. 文件输入/输出</h2>
		<p>现在，让我们来实现读取输入文件和写入输出文件。我们将每一行读取到一个字符串数组中，然后输出该字符串数组。在下一步中，我们将使用 QuickSort 算法来对该数组进行排序。</p>
		<h3>修改源代码</h3>
		<p>更改 C# 源文件 (class1.cs)，如下面以斜体突出显示的代码所示。其他的差异（如类名）可忽略不计。</p>
		<pre class="codeSample">// Import namespaces
using System;
using System.Collections;
using System.IO;
// Declare namespace
namespace MsdnAA
{
    // Declare application class
    class QuickSortApp
    {
        // Application initialization
        static void Main (string[] szArgs)
        {
            ... ... ...
            // Read contents of source file
            string szSrcLine;
            ArrayList szContents = new ArrayList ();
            FileStream fsInput = new FileStream (szSrcFile, FileMode.Open,
                FileAccess.Read);
            StreamReader srInput = new StreamReader (fsInput);
            while ((szSrcLine = srInput.ReadLine ()) != null)
            {
                // Append to array
                szContents.Add (szSrcLine);
            }
            srInput.Close ();
            fsInput.Close ();
            // TODO: Pass to QuickSort function
            // Write sorted lines
            FileStream fsOutput = new FileStream (szDestFile,
                FileMode.Create, FileAccess.Write);
            StreamWriter srOutput = new StreamWriter (fsOutput);
            for (int nIndex = 0; nIndex &lt; szContents.Count; nIndex++)
            {
                // Write line to output file
                srOutput.WriteLine (szContents[nIndex]);
            }
            srOutput.Close ();
            fsOutput.Close ();
            // Report program success
            Console.WriteLine ("\nThe sorted lines have been written.\n\n");
        }
    }
}
</pre>
		<h3>从源文件进行读取</h3>
		<p>使用 <b>FileStream</b> 类打开源文件，然后加入 <b>StreamReader</b> 类，这样我们就可以使用它的 <b>ReadLine() </b>方法了。现在，我们调用 <b>ReadLine()</b> 方法，直到它返回 <b>null</b>，这表示到达文件结尾。在循环过程中，我们将读取的行存储到字符串数组中，然后关闭这两个对象。</p>
		<div style="WIDTH: 481px">
				<img height="164" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-10.gif" width="481" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<h4>写入输出文件</h4>
		<p>假设已经用 QuickSort 对字符串数组进行了排序，接下来要做的事情就是输出数组的内容。按照同样的方式，我们将 <b>StreamWriter</b> 对象附加到 <b>FileStream</b> 对象上。这使得我们可以使用 <b>WriteLine() </b>方法，该方法能够很方便地模仿 <b>Console</b> 类的行为。一旦遍历了数组，我们便可以象前面一样关闭这两个对象。</p>
		<div style="WIDTH: 481px">
				<img height="164" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-11.gif" width="481" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="EAEAC">
		</a>
		<h2>步骤 7. 创建函数</h2>
		<p>最后一步就是创建一个函数来在字符串数组中运行 QuickSort。我们将此函数放到应用程序类 <b>QuickSortApp</b> 之中。</p>
		<h3>修改源代码</h3>
		<p>更改 C# 源文件 (class1.cs)，如下面以斜体突出显示的 代码所示。其他的差异（如类名）可忽略不计。</p>
		<pre class="codeSample">// Import namespaces
using System;
using System.Collections;
using System.IO;
// Declare namespace
namespace MsdnAA
{
    // Declare application class
    class QuickSortApp
    {
        // Application initialization
        static void Main (string[] szArgs)
        {
            ... ... ...
            // Pass to QuickSort function
            QuickSort (szContents, 0, szContents.Count - 1);
            ... ... ...
        }
        // QuickSort implementation
        static void QuickSort (ArrayList szArray, int nLower, int nUpper)
        {
            // Check for non-base case
            if (nLower &lt; nUpper)
            {
                // Split and sort partitions
                int nSplit = Partition (szArray, nLower, nUpper);
                QuickSort (szArray, nLower, nSplit - 1);
                QuickSort (szArray, nSplit + 1, nUpper);
            }
        }
        // QuickSort partition implementation
        static int Partition (ArrayList szArray, int nLower, int nUpper)
        {
            // Pivot with first element
            int nLeft = nLower + 1;
            string szPivot = (string) szArray[nLower];
            int nRight = nUpper;
            // Partition array elements
            string szSwap;
            while (nLeft &lt;= nRight)
            {
                // Find item out of place
                while (nLeft &lt;= nRight)
                {
                    if (((string) szArray[nLeft]).CompareTo (szPivot) &gt; 0)
                        break;
                    nLeft = nLeft + 1;
                }
                while (nLeft &lt;= nRight)
                {
                    if (((string) szArray[nRight]).CompareTo (szPivot) &lt;= 0)
                        break;
                    nRight = nRight - 1;
                }
                // Swap values if necessary
                if (nLeft &lt; nRight)
                {
                    szSwap = (string) szArray[nLeft];
                    szArray[nLeft] = szArray[nRight];
                    szArray[nRight] = szSwap;
                    nLeft = nLeft + 1;
                    nRight = nRight - 1;
                }
            }
            // Move pivot element
            szSwap = (string) szArray[nLower];
            szArray[nLower] = szArray[nRight];
            szArray[nRight] = szSwap;
            return nRight;
        }
    }
}
</pre>
		<h3>QuickSort() 函数</h3>
		<p>这个函数需要三个参数：对数组的引用、下界和上界。它调用 <b>Partition() </b>函数将数组分成两部分，其中一部分包含 Pivot 值之前的所有字符串，另一部分包含 Pivot 值之后的所有字符串。然后，它调用自身来对每个部分进行排序。</p>
		<p>上面修改中的注释应该说明了每个代码块的作用。唯一的新概念就是 <b>CompareTo()</b> 方法的使用，该方法是 <b>String</b> 类的成员，并且应该是自说明的。</p>
		<h4>运行 QuickSort 应用程序</h4>
		<p>这一步完成 QuickSort C# 示例应用程序。现在，可以构建项目并运行应用程序。需要提供一个示例文本文件，以供其进行排序。将该文件放在与 EXE 文件相同的目录中。</p>
		<div style="WIDTH: 467px">
				<img height="194" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-12.gif" width="467" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<h4>程序输出</h4>
		<p>下面是已完成的 QuickSort C# .NET 示例应用程序的输出。可以查看示例输入文件 <a href="http://msdn.microsoft.com/library/en-us/dnaa/html/getstart_vcpp.asp?FRAME=true#getstart_vcpp_topic12a" target="_blank">'example.txt'</a> 和输出文件 <a href="http://msdn.microsoft.com/library/en-us/dnaa/html/getstart_vcpp.asp?FRAME=true#getstart_vcpp_topic12b" target="_blank">'output.txt'</a>。</p>
		<div style="WIDTH: 494px">
				<img height="157" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-13.gif" width="494" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="EVFAC">
		</a>
		<h2>步骤 8. 使用调试器</h2>
		<p>调试器是诊断程序问题的一个必不可少的工具。我们觉得有必要在本入门指南中对其进行介绍。这最后一步将向您展示如何走查程序和使用诸如 QuickWatch 这样的功能。</p>
		<h3>设置断点</h3>
		<p>当程序在调试器中运行时，断点会暂停程序的执行，从而使开发人员能够控制调试器。要设置断点，请右键单击您想要程序暂停的行，然后单击 <b>Insert</b><b>Breakpoint</b>，如下所示。</p>
		<div style="WIDTH: 450px">
				<img height="149" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-14.gif" width="450" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<b>注</b>：带有断点的行以红色突出显示。通过再次右键单击该行并选择 <b>Remove Breakpoint</b> 可以删除断点。</p>
		<h3>单步调试程序</h3>
		<p>既然设置了断点（最好是在前面所示的行中），就让我们在调试器中运行程序。在 <b>Debug</b> 菜单中，选择 <b>Start</b> 而不是同前面一样选择 <b>Start Without Debugging</b>。这样就在调试器中启动了程序，并因而激活了断点。</p>
		<p>一旦程序遇到断点，调试器便会接收程序的控制。这时会有一个箭头指向当前执行的行。</p>
		<div style="WIDTH: 556px">
				<img height="131" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-15.gif" width="556" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>要单步调试一行代码，可以选择 <b>Debug | Step Over</b> 并观察光标是否移到下一行。<b>Debug | Step Into</b> 命令允许您单步执行将要调用的函数。进行两次 <b>Step Over</b> 之后的屏幕如下所示。</p>
		<div style="WIDTH: 457px">
				<img height="120" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-16.gif" width="457" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>如果想要程序在遇到下一个断点、遇到异常或退出之前继续执行，请从菜单中选择 <b>Debug | Continue</b>。</p>
		<h3>检查变量值</h3>
		<p>当您可以控制调试器时，可将鼠标指针移到变量上以获得它的基本值。</p>
		<div style="WIDTH: 457px">
				<img height="120" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-17.gif" width="457" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>您也可以右键单击变量，然后从上下文菜单中选择 <b>QuickWatch</b>。<b>QuickWatch</b> 将为您提供关于某些变量（如 <b>ArrayList</b> 对象）的更多详细信息。</p>
		<div style="WIDTH: 526px">
				<img height="144" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-18.gif" width="526" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<h3>其他调试器工具</h3>
		<p>Visual Studio 调试器具有许多其他工具（例如 Call Stack 查看器）的功能，可以使用此调试器来查看到此为止调用的函数。还可以获得内存转储和关于进程中线程的信息。我们鼓励您使用这些功能强大的调试工具。</p>
		<div style="WIDTH: 494px">
				<img height="218" alt="" src="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/art/getstart_vcsharp-19.gif" width="494" border="0" />
				<br />
				<p class="figureCaption">
				</p>
				<div class="figureRule">
				</div>
		</div>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="E2IAC">
		</a>
		<h2>小结</h2>
		<p>本入门指南旨在帮助您用 Visual Studio 构建一个简单的 C# 项目。它无法进行全面的介绍。我们鼓励您查询关于 C# 和 .NET 的其他资源，以便更多地学习这些技术。在完成本教程之后，您至少有了一个可用的项目，在您研究 Visual C# 时，可以从修改此这些代码开始。</p>
		<p>为了方便起见，我们提供了完整的源程序和项目文件。您可以通过本文档顶部的目录来访问它们。</p>
		<h3>其他资源</h3>
		<p>我们强烈推荐下面这些关于 C# 和 .NET 平台的书籍。它们是开发人员尝试学习这些新技术的有益资源。 </p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>Archer, Tom.<i>Inside C#</i>.Redmond:Microsoft Press, 2001. </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>Deitel, Harvey.<i>C#:</i>How to Program.Upper Saddle River, NJ:Prentice Hall, 2001. </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>Gunnerson, Eric.<i>A Programmer's Introduction to C#.</i>New York:Apress, 2000. </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>Platt, David.<i>Introducing Microsoft .NET.</i>Redmond:Microsoft Press, 2001. </p>
								</td>
						</tr>
				</tbody>
		</table>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="E2JAC">
		</a>
		<h2>补遗：QuickSort C# .NET 的源代码</h2>
		<p>下面是 QuickSort C# .NET 示例应用程序的完整源代码。您可以复制、使用和分发这些代码（无版权费）。注意，这些源代码以"原样"提供并且不作任何保证。</p>
		<pre class="codeSample">//
//  QuickSort C# .NET Sample Application
//  Copyright 2001-2002 Microsoft Corporation. All rights reserved.
//
//  MSDN ACADEMIC ALLIANCE [http://www.msdn.microsoft.com/academic]
//  This sample is part of a vast collection of resources we developed for
//  faculty members in K-12 and higher education. Visit the MSDN AA web site for more!
//  The source code is provided "as is" without warranty.
//
// Import namespaces
using System;
using System.Collections;
using System.IO;
// Declare namespace
namespace MsdnAA
{
    // Declare application class
    class QuickSortApp
    {
        // Application initialization
        static void Main (string[] szArgs)
        {
            // Print startup banner
            Console.WriteLine ("\nQuickSort C#.NET Sample Application");
            Console.WriteLine ("Copyright (c)2001-2002 Microsoft Corporation. All rights reserved.\n");
            Console.WriteLine ("MSDN ACADEMIC ALLIANCE [http://www.msdnaa.net/]\n");
            // Describe program function
            Console.WriteLine ("This example demonstrates the QuickSort algorithm by reading an input file,");
            Console.WriteLine ("sorting its contents, and writing them to a new file.\n");
            // Prompt user for filenames
            Console.Write ("Source: ");
            string szSrcFile = Console.ReadLine ();
            Console.Write ("Output: ");
            string szDestFile = Console.ReadLine ();
            // Read contents of source file
            string szSrcLine;
            ArrayList szContents = new ArrayList ();
            FileStream fsInput = new FileStream (szSrcFile, FileMode.Open, FileAccess.Read);
            StreamReader srInput = new StreamReader (fsInput);
            while ((szSrcLine = srInput.ReadLine ()) != null)
            {
                // Append to array
                szContents.Add (szSrcLine);
            }
            srInput.Close ();
            fsInput.Close ();
            // Pass to QuickSort function
            QuickSort (szContents, 0, szContents.Count - 1);
            // Write sorted lines
            FileStream fsOutput = new FileStream (szDestFile, FileMode.Create, FileAccess.Write);
            StreamWriter srOutput = new StreamWriter (fsOutput);
            for (int nIndex = 0; nIndex &lt; szContents.Count; nIndex++)
            {
                // Write line to output file
                srOutput.WriteLine (szContents[nIndex]);
            }
            srOutput.Close ();
            fsOutput.Close ();
            // Report program success
            Console.WriteLine ("\nThe sorted lines have been written to the output file.\n\n");
        }
        // QuickSort implementation
        private static void QuickSort (ArrayList szArray, int nLower, int nUpper)
        {
            // Check for non-base case
            if (nLower &lt; nUpper)
            {
                // Split and sort partitions
                int nSplit = Partition (szArray, nLower, nUpper);
                QuickSort (szArray, nLower, nSplit - 1);
                QuickSort (szArray, nSplit + 1, nUpper);
            }
        }
        // QuickSort partition implementation
        private static int Partition (ArrayList szArray, int nLower, int nUpper)
        {
            // Pivot with first element
            int nLeft = nLower + 1;
            string szPivot = (string) szArray[nLower];
            int nRight = nUpper;
            // Partition array elements
            string szSwap;
            while (nLeft &lt;= nRight)
            {
                // Find item out of place
                while (nLeft &lt;= nRight &amp;&amp; ((string) szArray[nLeft]).CompareTo (szPivot) &lt;= 0)
                    nLeft = nLeft + 1;
                while (nLeft &lt;= nRight &amp;&amp; ((string) szArray[nRight]).CompareTo (szPivot) &gt; 0)
                    nRight = nRight - 1;
                // Swap values if necessary
                if (nLeft &lt; nRight)
                {
                    szSwap = (string) szArray[nLeft];
                    szArray[nLeft] = szArray[nRight];
                    szArray[nRight] = szSwap;
                    nLeft = nLeft + 1;
                    nRight = nRight - 1;
                }
            }
            // Move pivot element
            szSwap = (string) szArray[nLower];
            szArray[nLower] = szArray[nRight];
            szArray[nRight] = szSwap;
            return nRight;
        }
    }
}
</pre>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
		</div>
		<a name="E6JAC">
		</a>
		<h2>补遗：关于 QuickSort C# .NET</h2>
		<p>为了演示 QuickSort Visual C# .NET 示例应用程序实际是如何运行的，我们提供了编译好的可执行文件。您可以通过编译这些项目文件来创建自己的可执行文件。单击 <a href="http://download.microsoft.com/download/f/f/8/ff8c8040-d1a7-4402-90df-5d1aaa7d37af/Quicksort_Visual_CSharp_.NET.exe" target="_blank">Quicksort_Visual_CSharp_.NET.exe</a>，下载源代码项目文件和可执行文件包。</p>
		<h3>使用应用程序</h3>
		<p>启动 <b>Command Prompt</b>（从"开始"菜单运行"cmd.exe"）。使用 CD 命令将目录更改为可执行文件所在的目录。然后运行"quicksort.exe"。</p>
		<p>程序将提示您提供输入和输出文件的名称。任何包含多行的文本文件均可使用。如果需要，可以使用记事本来创建一个此类文件。然后，该程序将对输入文件的内容进行排序，并且将其写入输出文件。</p>
		<h3>示例程序输出</h3>
		<p>下面是来自此 QuickSort C# .NET 应用程序的一个实例的输出。此示例演示了 QuickSort 算法，方法是读取输入文件、对文件的内容进行排序，然后将其写入新的文件。用户输入的文本以下划线标记。</p>
		<p>您可以查看下面的示例输入文件 <a href="http://msdn.microsoft.com/library/en-us/dnaa/html/getstart_vcpp.asp?FRAME=true#getstart_vcpp_topic12a" target="_blank">'example.txt'</a> 和输出文件 <a href="http://msdn.microsoft.com/library/en-us/dnaa/html/getstart_vcpp.asp?FRAME=true#getstart_vcpp_topic12b" target="_blank">'output.txt'</a>。</p>
		<pre class="codeSample">QuickSort C# .NET Sample Application
Copyright (c)2001-2002 Microsoft Corporation. All rights reserved.
MSDN ACADEMIC ALLIANCE [http://www.msdn.microsoft.com/academic]
This example demonstrates the QuickSort algorithm by reading an input file,
sorting its contents, and writing them to a new file.
Source: example.txt
Output: output.txt
The sorted lines have been written to the output file.
</pre>
		<p>查看示例输入文件"example.txt"：</p>
		<pre class="codeSample">Visual C#
Windows Embedded
JavaScript
Speech API
ASP.NET
VBScript
Windows Media
Visual Basic
.NET Framework
BizTalk Server
XML Parser
Internet Explorer
Visual C#
SQL Server
Windows XP
DirectX API
</pre>
		<p>查看示例输出文件"output.txt"：</p>
		<pre class="codeSample">.NET Framework
ASP.NET
BizTalk Server
DirectX API
Internet Explorer
JavaScript
Speech API
SQL Server
VBScript
Visual Basic
Visual C#
Visual C#
Windows Embedded
Windows Media
Windows XP
XML Parser
</pre>
		<p>
				<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaa/html/getstart_vcsharp.asp" target="_blank">转到原英文页面</a>
		</p>
		<br style="FONT-SIZE: 0pt" clear="all" />
		<div style="MARGIN-TOP: 16px; MARGIN-BOTTOM: 20px; WIDTH: 100%">
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<a href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">
														<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
												</a>
												<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.mspx#top">返回页首</a>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-19 15:41 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]C#锐利体验</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24279.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Mon, 19 Mar 2007 07:37:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24279.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24279.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24279.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24279.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 发布日期： 2/4/2002 | 更新日期： 6/22/2004						南京邮电学院 李建忠（jzli@china.com）				C#语言是一门简单，现代，优雅，面向对象，类型安全，平台独立的一门新型组件编程语言。其语法风格源自C/C++家族，融合了Visual Basic的高效和C/C++强大，是微软为奠定其下一互联网霸主地位而打造的Microsoft.Net平台的主流语言。其...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24279.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-19 15:37 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/19/24279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c/c++ 资源</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24190.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Sat, 17 Mar 2007 11:46:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24190.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24190.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24190.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24190.html</trackback:ping><description><![CDATA[
		<font size="7">个人主页<br /></font>
		<font size="2">Dennis Ritchie's home page<br />http://cm.bell-labs.com/cm/cs/who/dmr/index.html<br /><br />Brian Kernighan's home page<br />http://cm.bell-labs.com/cm/cs/who/bwk/index.html<br /><br />W. Richard Stevens' Home Page<br />http://www.kohala.com/start/<br /><br />Bjarne Stroustrup's homepage<br />http://www.research.att.com/~bs/homepage.html<br />http://akpublic.research.att.com/~bs/homepage.html<br /><br />Stanley Lippman<br />http://staff.develop.com/slip/<br /><br />Edsger W. Dijkstra's home page<br />http://www.cs.utexas.edu/users/EWD/welcome.html<br /><br />Andrew S. Tanenbaum's home page<br />http://www.cs.vu.nl/~ast/<br /><br />Donald E. Knuth's home page<br />http://www-cs-faculty.stanford.edu/~knuth/<br /><br />Linus Torvalds' home page<br />http://www.cs.helsinki.fi/u/torvalds/<br /><br />Bruce Eckel<br />http://mindview.net/<br /><br />Douglas Comer<br />http://www.cs.purdue.edu/people/comer<br /><br />Thomas H. Cormen<br />http://www.cs.dartmouth.edu/~thc/<br /><br />Charles E. Leiserson<br />http://supertech.lcs.mit.edu/~cel/<br /><br />Ronald L. Rivest<br />http://theory.lcs.mit.edu/~rivest/<br /><br />Clifford Stein<br />http://www.ieor.columbia.edu/~cs2035/<br /><br />Nicolai M. Josuttis（《c++标准程序库》作者）<br />http://www.josuttis.com/<br /><br />候捷主页<br />http://jjhou.csdn.net/<br /><br />裘宗燕主页<br />http://www.math.pku.edu.cn/teachers/qiuzy/</font>
		<br />
		<br />
		<br />
		<span style="FONT-SIZE: 13px">
				<font size="18">c/c++常用资源</font>
				<br />
				<br />aix在线文档：<br />http://publib16.boulder.ibm.com/cgi-bin/ds_rslt#1<br /><br />各种c/c++编译器<br />http://www.clipx.net/norton.php<br /><br />UNIX Programming FAQ v1.37<br />http://www.erlenstar.demon.co.uk/unix/faq_toc.html<br /><br />UNIX Programming FAQ 中文版 v0.1.0<br />http://www.linuxforum.net/books/upfaq/book1.htm<br /><br />C++ Coding Standard <br />http://www.possibility.com/Cpp/CppCodingStandard.html<br /><br />GNU编码标准<br />http://www.linuxforum.net/books/gcodestd.html<br /><br />C/C++ Reference <br />http://www.cppreference.com/<br /><br />C/C++<br />http://www.cplusplus.com/<br /><br />C++ Standard Template Library<br />http://www.msoe.edu/eecs/ce/courseinfo/stl/<br /><br />C Standard Library<br />http://www.infosys.utas.edu.au/info/documentation/C/CStdLib.html<br /><br />GCC的主页<br />http://gcc.gnu.org<br /><br />喜欢算法的朋友，这里有CLRS和TAOCP的讨论<br />http://online.ysu.edu.cn/personal/yyf/weitao/taocp/<br />http://online.ysu.edu.cn/personal/yyf/weitao/taocp/clrs.htm<br /><br />RFC<br />http://www.rfc-editor.org/<br /><br />SGI STL<br />http://www.sgi.com/tech/stl/<br /><br />Blitz++，一个针对科学计算的C++ class library<br />http://www.oonumerics.org/blitz/</span>
		<br />
		<br />
		<br />
		<span style="FONT-SIZE: 13px">
				<font size="18">c/c++书籍下载</font>
				<br />
				<br />大量c/c++书籍下载的ftp（匿名访问）<br />ftp.math.nankai.edu.cn<br />ftp://ftp.cdut.edu.cn/pub3/uncate_doc （uiibono提供）<br /><br />UNIX环境高级编程，TCP/IP详解，C++ Primer 3rd Edition 中文版下载<br />http://www.mamiyami.com/<br /><br />Advanced Linux Programming<br />http://www.advancedlinuxprogramming.com/<br /><br />Object-oriented Programming with ANSI-C<br />http://www.planetpdf.com/codecuts/pdfs/ooc.pdf</span>
		<br />
		<br />
		<br />
		<br />
		<font size="2">The Linux Programmer's Guide<br /></font>
		<a href="http://www.tldp.org/LDP/lpg/node1.html" target="_blank">
				<font color="#000000" size="2">http://www.tldp.org/LDP/lpg/node1.html</font>
		</a>
		<br />
		<br />
		<font size="2">COM 书籍下载：<br /></font>
		<a href="http://bbs.chinaunix.net/forum/viewtopic.php?t=299207" target="_blank">
				<font color="#000000" size="2">http://bbs.chinaunix.net/forum/viewtopic.php?t=299207</font>
		</a>
		<br />
		<br />
		<br />
<img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-17 19:46 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]写给C语言初学者的话</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24187.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Sat, 17 Mar 2007 11:24:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24187.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24187.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24187.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24187.html</trackback:ping><description><![CDATA[
		<span style="FONT-SIZE: 13px">写给C语言初学者的话<br />                                 --www.chinaunix.net(ldap)<br /><br />    前些天我写了一篇“Unix C语言值得注意的地方”一贴，回贴中谈到学习国外的开源软件中的高质量代码的问题，但是有朋友跟我说，在看代码的过程中感觉难度很大，想想也是如此，动辄十几万行的程序如果没有人指点的话是很难找到切入点的，所以我撰写了此文希望能对广大C语言爱好者有所帮助，在文章中有很多煽情的地方还请大家原谅，因为这篇文章使我想到了刚刚毕业的时候，所以有点感慨。同时文章中还有一些个人偏见存在，希望持反方向意见的人多多包涵，既然是偏见，那它只是偏见。<br /><br />    学习C语言不要心急，要循序渐进，须知欲速则不达的道理。千万不要盲目的写大量的代码，这样做只会堆出大量的低档次代码，同时使你形成不好的代码习惯。先买本基础的教材来看看，使得对C语言有个初步的认识，其实我现在手头上还放着《The C Programming Language》和《C程序设计（第二版）》（大学教材）呢，有些时候我还会为了一些基本性的概念来翻翻看呢。<br /><br />    如果你的身边有高水平的开发人员，那么再好不过了，多多向别人请教。但是就我了解的情况来看，大部分的初学者并没有在进入IT行业后得到一个资深的软件工程师的指导，而恰恰是在入司后就被推向前线，替老板们骗取客户口袋里的钱，在这个过程中很多人都是在苦苦的堆代码，赚着可怜的薪资。尽管我也是在拿着可怜的钱，但是有一点我是幸运的，因为我在我的第一家公司里遇到了带领我走向Unix和C语言领域的导师，正是他的一句“Unix和C语言是你一生都要去学习的技术”让我狂热的爱上了它们，正是他的一句“你有root口令，并不是你有root口令这么简单，更多的是一种责任”（说这句话的前提是我用root口令进入SUN服务器后删除了别人的东西，因为我认为这些是无用的东西）使我对责任这两个字有一个非常具体的认识。所以在这里请广大读者允许我用一些篇幅来对我neusoft的导师yuhj表示深深的感谢。同时也对CU的朋友们表示深深的感谢，可以说，你们是我的第二导师，我已经离不开你们了。<br /><br />    希望大家都比我幸运，没有得到幸运之神垂青的朋友们也不要灰心，多上CU上来和大家交流交流，讨论讨论吧，但是注意在论坛上讨论的时候不要刨根问底，很多事情不是一句话就说的清楚的，别人只能给你一个指引，再具体的只有靠自己多研究研究、琢磨琢磨。闲暇的时候去精华区看看，你会有意外的收获的。<br /><br />    千万不要一看到英文就头大，尽管我也是这样，并不是看不懂（毕竟也接受过CET4、6级哑巴英语的教育，还是能看懂的）。man的帮助是最好的教材并且很多国外的论坛对技术的描述是很清楚的，也是很简单的，更重要的是，你会在上面看到些在国内论坛上看不到的东西（计算机的技术一直都是由西方向东方传递，希望有朝一日老外都到我们中国的论坛上来寻找技术资料）。<br /><br />    学习C语言有一件事情也是必须要学的，而且最好是同时学，有的朋友可能已经猜出来了，没错，是Unix。Unix和C语言可以说大家提的很多了，有Unix的地方就有C语言，同时也正是有了C语言，才有了Unix（我们还是先讨论讨论鸡生蛋还是蛋生鸡的哲学问题吧，谁拿西红柿打我），甚至有人说C语言就是为了Unix而设计的，可见Unix和C语言之间的非同寻常的关系。学习Unix现在容易多了，以前Unix都是运行在大型的服务器上的，可是现在有了Linux（按照GNU的意思，Linux就是Linux还不能叫Unix），大家可以在自己的PC上装一套Linux来学习，注意学习Linux不要拿Linux和Windows来比较，它们不可同日而语。Linux会让你知道什么是经典，永远让你在一个方向上大展宏图，Windows只会让你在别人的套子里耍上大刀，不时的还要换一个套子耍耍。下面罗列了一些我在学习Unix的一些经验：<br /><br />    1、学习Unix和C语言，先向大家推荐一本书《Unix高级环境编程》，这本书是学习Unix和C的经典之作，尽量把书中提到的系统调用都写个练习程序，先感性的认识一下Linux系统提供给用户的系统调用都是干什么的，怎么用。系统调用是内核提供给用户的功能用以申请内核服务，对于Linux内核的学习，从系统调用入手是个不错的办法。学习过程可以参看Linux的联机帮助，和网络上的资料。当你觉得差不多了的时候，那我给大家出一道联系题目吧：实现一个ftp服务器和客户端的功能，完全可以自己定义一些应用层的协议，只要能实现用简单的命令传输文件就可以了。<br /><br />    这个题目可以使你练习到TCP/IP的基本编程方法和文件操作的基本方法对于后面学习内核的文件系统会有帮助的。<br /><br /><br />    2、当你对Unix系统有了些了解后，同时对于大部分的系统调用（关键是关于文件的系统调用，对于Linux系统的内核来说从文件系统入手相对容易一些）也有了清楚的认识后，再推荐你一本书《Linux内核情景分析》，该书是关于Linux内核的经典之作唯一美中不足的是没有关于网络子系统的详细介绍。你可以从文件系统的系统调用入手，慢慢的你就会对Linux有了一个更深入的认识。同时注意很多经典的方法和思想在Linux中的运用。你会认识到为什么Unix把所有的东西都看成文件，对什么东西操作都是对文件操作，你会慢慢体会到Unix的经典之处了。<br /><br />    3、当你对Linux内核有了些了解后，你就可以找个方向来专门发展了，如果你想对眼下流行的网络编程感兴趣，那么再推荐你一本书《TCP/IP详细解释》，这本书是关于TCP/IP协议的经典之作。你会学习到TCP/IP协议栈是如果实现的，为什么，各层协议之间是如何工作的。你看完了这本书后，你就可以自己写一个dos攻击程序和sniffer了。<br /><br />    我说的简单，其实我提到的每本书至少都够你研究很长时间的，所以希望初学者别着急不骄不躁，相信只要努力过，一定会成为高手的。<br /><br />    在写代码的时候大家要注意养成好的代码习惯和风格还有抽象能力。<br /><br />下面给出大家在写代码的时候的20字方针：<br /><br />    <font color="red">函数要小</font><br />    尽量的把函数弄的通用点，代码行少点，一个函数只完成一个简单的功能，一眼就能看出来此函数有没有代码错误，每个函数都是健壮的，那么你的程序就是健壮的。<br /><br />    <font color="red">代码要少</font>    完成一个功能的时候在逻辑清楚的情况下代码越少越好，千万不要比代码谁写的多啊。<br /><br />    <font color="red">算法要好</font>    在完成一个功能的时候要考虑效率，目前计算机的内存很大，所以内存已经不是首要考虑的因素了，但是在某些特殊的地方效率还是很重要的。有效率高的算法，就不用效率低的算法，看看本版有一篇精华贴子是关于把一个字符窜两边的空格去掉的帖子（trim），很多人都提出了算法，但是有一个算法是最好的，效率最高，代码最少，是算法要好的最好体现<br /><br />    <font color="red">命名要清</font>    命名要清楚，最要用汉语中的谓宾结构如set_buffsize()<br /><br />     <font color="red">文件要多</font>    尽量把一个大的程序安功能分成多个文件，一个文件尽量不要超作1000行，这样就很清楚的知道那个文件代码是健壮的，那个文件有可能有隐患，在代码检查的时候可以有针对性的检查某几个文件</span>
		<br />
<img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-17 19:24 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/17/24187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp编程实例</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24144.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Fri, 16 Mar 2007 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24144.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24144.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24144.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24144.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24144.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一课.用ASP实现网上“五子棋”大赛						“五子棋”是大家都非常熟悉的一种益智类游戏，相关的游戏软件也非常多，在此我向大家隆重推出一款新的纯“网络版”的五子棋，它利用ASP做为开发环境，因此在Internet上对战的时候无需下载客户端软件，只要你有一个浏览器就可以了。你也可以在局域网上进行这个游戏。 对于ASP，我不想做过多的说明，在以前的文章中，我已经说过很多。 游戏的过程是...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24144.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-16 21:06 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp编程经验谈</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24143.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Fri, 16 Mar 2007 13:04:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24143.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24143.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24143.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24143.html</trackback:ping><description><![CDATA[
		<table class="t_msg" cellspacing="0" cellpadding="4" border="0">
				<tbody>
						<tr>
								<td class="line" style="PADDING-TOP: 10px" valign="top" height="100%">
										<a title="评分 10" href="http://bbs.hackbase.com/misc.php?action=viewratings&amp;tid=3048181&amp;pid=4076924" name="pid4076924">
												<img alt="" src="http://bbs.hackbase.com/images/blacknoble/agree.gif" align="right" border="0" />
												<img alt="" src="http://bbs.hackbase.com/images/blacknoble/agree.gif" align="right" border="0" />
												<img alt="" src="http://bbs.hackbase.com/images/blacknoble/agree.gif" align="right" border="0" />
												<img alt="" src="http://bbs.hackbase.com/images/blacknoble/agree.gif" align="right" border="0" />
												<img alt="" src="http://bbs.hackbase.com/images/blacknoble/agree.gif" align="right" border="0" />
										</a>
										<span class="bold">第一课.ASP开发10条经验总结</span>
										<br />
										<br />
										<div style="FONT-SIZE: 11px">历时半年，我独自一人完成了一个局级单位的管理信息系统，共发布BETA版29次，正式版本3次。ASP+ORACLE环境，285个ASP文件，功能涉及数据录入、修改、模糊查询、自动统计、数据分析和报表，这个项目正在申报省级成果，现将我的10条经验总结如下，不对之处欢迎批评指正: <br /><br />1. 不要再做ASP是否过时的讨论，重要的不是你是否使用先进的技术，而是你的设计思想是否先进；<br /><br />2. 设计时要考虑项目的通用性，永远不要做没有推广价值的东西；<br /><br />3. 程序设计要简洁，足够好的面向过程远远优于蹩脚的面向对象；<br /><br />4. 理论是为实践服务的，所以不要被理论（尤其是设计模式）束缚；<br /><br />5. 分工合理的情况下尽可能少的人员构成项目小组，通信的开销实在太大了；<br /><br />6.没有不变的需求，要为你的程序留下足够多的拓展空间，同时要考虑在系统向其它平台移植时尽量减少工作量和难度的途径；<br /><br />7. 千万不要忽视界面设计，很多情况下这成为对你项目评价的唯一标准；<br /><br />8. 用正规文档记下你的变量使用情况，随着系统的增大，DEBUG的成本几乎成倍增长；<br /><br />9. 能用机器生成的代码就不要去手写，最宝贵的就是时间；<br /><br />10.选数据库还是要选ORACLE！</div>
								</td>
						</tr>
						<tr>
								<td valign="bottom">
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<span class="bold">第二课.ASP开发准则</span>
		<br />
		<br />
		<div style="FONT-SIZE: 11px">应用程序服务器被,或最终将被 Web 服务器所使用，它通常是运行 ASP 页面的 IIS 计算机。ASP 是您的对象的唯一客户机。它带来了专门的线程和安全考虑。<br /><br />虽然许多使用 ASP 的 Web 站点根本就不用组件，但在这篇文章中假定 ASP 是 Internet 客户机和组件之间的桥梁。下面的 asp/server01242000.asp"&gt;ASP 组件准则（英文）提供<br /><br />ASP 和组件之间的划分服务 <br /><br />ASP 最常用于在服务器上创建供客户机使用的 HTML 或 XML 文件，因此我们主要讨论这种使用方案。这就引出了一个常见的问题，如果 ASP 页面在服务器上，那么它们是否属于业务层的一部分呢？在组件世界中，答案通常是否。虽然 ASP 确实在服务器上运行，而且可能与应用程序服务器在同一个空间，但是这不能使它成为业务逻辑的一部分。<br /><br />随着用户界面工具的发展或者随着启用更多的业务对业务方案，拥有这种明确的区别将获得巨大的回报。<br /><br />话说到此，让我们来看一些最重要的业务层和表示层划分准则： <br /><br />令 UI 代码与业务逻辑分离。这包括编写与 UI 耦合的代码，例如使用 ASP 内部组件的 MTS 对象，让它与业务逻辑代码分离，如同在不同的 DLL 中。 <br /><br /><br />将事务与 ASP 页面分离。事务 ASP 在某些情况下非常好，但是组件和多层应用程序会改变这种情况。组件不应该依赖由客户机层来管理它们的事务和业务逻辑语义。 <br /><br /><br />将表示组件（使用请求和响应的组件）与 Web 服务器放在相同的机器和/或进程中。如果将使用 ASP 内部组件对象的对象放在远程机器上，那么对内部组件的所有调用将以回调形式发生。调用 IIS 客户机的是 COM+ 服务器，它显著降低了性能并使安全配置复杂化。可以将这些调整对象放在标记为“库激活”的 COM+ 应用程序中。 <br /><br />ASP 存在于服务器上，因此 ASP 页面必须符合资源共享规则，并且记住可伸缩性。请看下面的详细内容： <br /><br />在“会话”中，管理应尽量避免用户特定的状态。 <br /><br /><br />保持 ASP 无状态，并在可能的情况下允许资源池。 <br /><br />操作方式 <br /><br />在评价某个代码段是否属于业务逻辑或者表示层时，请问一下自己，“如果我必须用按键式电话应用程序代替我的 ASP 页面，那么该代码是否还有用？”如果答案为“是”，那么可以尝试将它划分为业务逻辑代码或者用户界面帮助器代码。 <br /><br />如果改变了客户机后该代码不能用，或者如果它是构造用户界面的帮助器，则该代码属于表示服务层。它在 ASP 页面中，或在使用 ASP 内部组件的组件中。它不属于业务对象组件。<br /><br />理解桌面与 ASP 客户机的区别 <br /><br />ASP 是组件的特殊客户机，不同于桌面上的传统单线程 Win32 应用程序。主要区别概括如下。 <br /><br />线程管理：ASP 是多线程客户机。这意味着可以有许多并发活动一起运行，也许在同一时刻处理不同的 ASP 页面。这说明不能使对象伪称它是唯一的使用者来独占系统。这样做可能有意外的反应，例如，养成一个坏习惯：将对象存储在 ASP 会话或者应用程序变量中。 <br /><br /><br />安全环境：ASP 是由 Web 站点中的 Internet Information Services 5.0 执行的，有低、中、高三种隔离度。甚至这些 Web 站点可以有不同的安全设置、允许或拒绝匿名访问、验证客户等等。所有这些设置产生了大量的方案，即不同的用户帐户最终用的是您的对象。 <br /><br /><br />轻松增长：这不是技术问题，而是 Web 应用程序所提供设施的副效应。传统上，为桌面应用程序增加用户基，要求仔细计划好向已知数量客户机的转出。ASP 已经改变了该过程。在启动和运行后，ASP-Visual Basic 应用程序可以方便地打开，供当地的或世界范围的所有职员、所有业务伙伴和所有客户使用。可以用这种方式描述 — 拥有超链接的单个电子邮件可以使用户基成十倍地增长。您的应用程序为此作好准备了吗？唯一了解的方式是对 Web 站点进行强度测试，以获得实际性能的预期值。关于强度测试的详细信息，请参阅“应用程序生命周期”一节。 <br /><br />在 ASP 内应该如何使用 Visual Basic 对象？在页面范围内创建和取消您的对象。也就是说，尽可能使 ASP 页面无状态，只在暂时状态下依赖会话或应用程序变量。不要将对象存储在会话或应用程序变量中。这将 ASP 线程锁定到您的会话、取消所有可伸缩性的预期值。也就是说，Web 服务器处理的用户数不会超过几十个。如果需要在会话或应用程序中存储内容，请使之成为数据而不是对象。<br /><br />还有可以遵守的许多其他准则。我们建议您阅读 MSDN Voices 上 J. D. Meier 撰写的专栏“Servin' it Up”。该专栏包括了大量的技术、实践和技巧，有助于开发可扩展的、可靠的 ASP 和组件应用程序。<br /><br />参考 <br /><br />asp#server"&gt;MSDN Voices: Servin' it Up Column（英文）<br /><br />SeminarOnline：在 ASP 下使用自定义 COM 组件（英文）<br /><br />asp"&gt;MSDN 杂志（英文）不要将引用存储在会话或应用程序中的 VB 对象中<br /><br />所有 Visual Basic 6.0 组件都是“单元线程”的，就是说它们都运行在 STA 单元中。这意味着如果在线程中创建对象，那么对该对象的所有调用都必须用同一线程服务。许多线程（来自并发 Web 站点用户）使用 STA 对象的同一实例，会引起一连串的活动，有可能成为应用程序中的瓶颈。<br /><br />此外，在会话范围内存储用 Server.CreateObject 创建的 STA 对象，可以有效地将执行线程联系到当前用户，从而将应用程序的最大并发用户数限制到默认的 20xN（N = 处理器数量）。<br /><br />操作方式 <br /><br />如果您按照我们的建议使对象无状态，则不需要存储引用以供客户机复用，并在应用程序范围内存储它们。客户机将能够独立创建、使用和取消它们自己的对象。这就减少了保持会话特有对象的需要，原因是它们不保留会话特有的状态。<br /><br />推荐的方式是使对象无状态，它在需要时访问数据库或其他存储区（例如 cookies 和 LDAP）。<br /><br />如果需要使用会话或应用程序范围的数据，请将数据，而不是处理数据的对象，存储在此。您可以创建一个类，来封装对所需值的处理。<br /><br />参考 <br /><br />asp"&gt;信息：不要在会话或应用程序中存储 STA 对象 (Q243543)（英文）<br /><br />PRB：将 STA COM 组件存储在会话中，会将会话锁定在单线程中 (Q243815)（英文）<br /><br />信息：ASP 下的组件线程模型概要 (Q243544)（英文）<br /><br />学习 IIS 5.0 中的新内容 <br /><br />Internet Information Server 5.0 增加了许多新功能。这些改进均已写入 J.D. Meier 的 MSDN 文章中：asp/server02282000.asp"&gt;沿用 IIS 5.0 中的 ASP（英文）。下面是该文中最重要改进的概述。 <br /><br />改进的、出色的性能 <br /><br /><br />Server.Transfer 和 Server.Execute 方法 <br /><br /><br />集中式错误处理 <br /><br /><br />改进的浏览器功能 <br /><br /><br />改进的脚本引擎 <br /><br /><br />正则表达式分析器 <br /><br /><br />与 ADO 记录集 XML 功能的集成 <br /><br /><br />新的安全性、缓冲、隔离和管理功能</div>
		<div style="FONT-SIZE: 11px"> </div>
		<div style="FONT-SIZE: 11px">
				<span class="bold">第三课.Asp及Web开发中的常见问题</span>
				<br />
				<br />
				<div style="FONT-SIZE: 11px">表格的折行处理.<br /><font face="新宋体">＜table style="TABLE-LAYOUT: fixed" width="200" border="0" cellspacing="0" cellpadding="7" bgcolor="#f7f7f7"＞ <br />＜tr＞ <br />＜td style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"＞ <br />dffadfdaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfd<br />ffadfdasfdffadfdasfdffadfdasfdffadfdasf <br />＜/td＞ <br />＜/tr＞ <br />＜/table＞ <br /></font><br />此处主要是用css样式进行控制在＜table＞标签中有个style="TABLE-LAYOUT: fixed",其说明如下<br />语法： <br />table-layout : auto | fixed <br />参数： <br />auto : 　默认的自动算法。布局将基于各单元格的内容。表格在每一单元格读取计算之后才会显示出来。速度很慢 <br />fixed : 　固定布局的算法。在这算法中，水平布局是仅仅基于表格的宽度，表格边框的宽度，单元格间距，列的宽度，而和表格内容无关,此时在＜td＞标签中如果没有WORD-WRAP: break-word样式,表格中的内容将只能显示一部份,具体看表格的宽度了.word-wrap说明如下:<br />语法： <br />word-wrap : normal | break-word <br />参数： <br />normal : 　允许内容顶开指定的容器边界 <br />break-word : 　内容将在边界内换行。如果需要，词内换行（word-break）也会发生 <br />VBSCRIPT标记索引 <br />基本运算 <br />+ 数字加法及字符串连接 <br />- 数字减法 <br />* 数字乘法 <br />/ 数字除法 <br />Mod 求余数 <br />\ 求商数 <br />&amp; 字符串连接 <br />^ 次方 <br />= 相等 <br />＜＞ 不相等 <br />＞= 大于或等于 <br />＞ 大于 <br />＜= 小于或等于 <br />＜ 小于 <br />Not 非 <br />And 且 <br />Or 或 <br />Xor 异或 <br />循环及决策 <br />if ....then 若...则... <br />if ...then...else 若...则...非 <br />else if... 非若 <br />select case... 群组选择条件 <br />end select <br />for ... next 计数循环 <br />while...wend 条件循环(一) <br />do while...loop 条件循环(二) <br />do...loop while 条件循环(三) <br />do until...loop 条件循环(四) <br />do...loop until 条件循环(五) <br />数学函数 <br />Abs 绝对值 <br />Sgn 正负号 <br />Hex 转换成十六进制 <br />Oct 转换成八进制 <br />Sqr 平方根 <br />Int 取整数 <br />Fix 取整数 <br />Round 取整数 <br />Log 以e为底的对数 <br />Sin 正弦函数 <br />Cos 余弦函数 <br />Tan 正切函数 <br />字符串处理函数 <br />Len 字符串长度 <br />Mid 取部分字符串 <br />Left 从字符串开头取部分字符串 <br />Right 从字符串结尾取部分字符串 <br />Lcase 转换成小写 <br />Ucase 转换成大写 <br />Trim 清除字符串开头及结尾的空格符 <br />Ltrim 清除字符串开头空格符 <br />Rtrim 清除字符串结尾空格符 <br />Replace 替换字符串部分字符 <br />Instr 判断是否包含于另一个字符串(从起始搜寻) <br />InstrRev 判断是否包含于另一个字符串(从结尾搜寻) <br />Space 任意字符数的空格符 <br />String 任意字符数的任一字符 <br />StrReverse 反转字符串 <br />Split 以某字符分割字符串 <br />数据类型转换函数 <br />Cint 转换成整形 <br />Cstr 转换成字符串 <br />Clng 转换成常整数 <br />Cbool 转换成布尔函数 <br />Cdate 转换成日期函数 <br />CSng 转换成单精度 <br />CDbl 转换成双精度 <br />日期时间函数 <br />Date 现在日期 <br />Time 现在时间 <br />NOw 现在日期时间 <br />DateAdd 增加日期 <br />DateDiff 两日期差 <br />DateSerial 日期设定 <br />DateValue 日期设定 <br />Year 现在年份 <br />Month 现在月份 <br />Day 现在天 <br />Hour 现在时刻 <br />Minute 现在分钟 <br />Second 现在秒钟 <br />Timer 午夜距现在秒数 <br />TimeSerial 时间设定 <br />TimeValue 时间所属部分 <br />WeekDay 星期名称 <br />MonthName 月份名称 <br />其它函数 <br />Array 产生数组 <br />Asc 字符ASCII码 <br />Chr ASCII码字符 <br />Filter 过滤数组 <br />InputBox 输入窗口 <br />Join 合并数组中的元素 <br />MsgBox 信息窗口 <br />Lbound 数组下界 <br />Ubound 数组上界 <br />指令 <br />Const 设定常数 <br />Dim 定义变量或者数组 <br />Erase 清除数组 <br />ReDim 重新声明数组 <br />Randomize 起始随机数 <br />Rnd 取得随机数 <br />ASP对象 <br />Session对象 <br />IsEmpty 测试Session变量是否存在 <br />TimeOut 设定Session变量生存周期 <br />Abandon 强制清除Session变量 <br />Application对象 <br />IsEmpty 测试Application变量是否存在 <br />Lock 锁定Application变量 <br />Unlock 解除Lock指令的锁定 <br />Cookies对象 <br />Expires 设定Cookies变量的生存周期 <br />Connection对象 <br />Open 打开与数据库的连接 <br />Execute 打开Recordset对象 <br />Close 关闭Connection对象 <br />Recordset对象 <br />movefirst 将记录指针移至第一条 <br />movelast 将记录指针移至最后一条 <br />movenext 将记录指针移至下一条 <br />moveprevious 将记录指针移至上一条 <br />bof 测试是否为recordset的起始 <br />eof 测试是否为recordset的结束 <br />open 打开Recoreset对象 <br />close 关闭recordset对象 <br />fields 读取数据的子对象 <br />fileds.count 字段个数 <br />pagesize 每页记录条数 <br />absolutepage 设定为某页 <br />pagecount 总页数 <br />Absoluteposition 直接跳至某条记录 <br />MicrosoftVBscript运行时错误列表（10进制表示） <br />error # 5 无效的过程调用或参数 <br />error # 5 无效的过程调用或参数 <br />error # 6 溢出 <br />error # 7 内存不够 <br />error # 9 下标越界 <br />error # 10 该数组为定长的或临时被锁定 <br />error # 11 被零除 <br />error # 13 类型不匹配 <br />error # 14 字符串空间不够 <br />error # 17 不能执行所需的操作 <br />error # 28 堆栈溢出 <br />error # 35 未定义过程或函数 <br />error # 48 加载 DLL 时出错 <br />error # 51 内部错误 <br />error # 52 错误的文件名或号码 <br />error # 53 文件未找到 <br />error # 54 错误的文件模式 <br />error # 55 文件已经打开 <br />error # 57 设备 I/O 错误 <br />error # 58 文件已存在 <br />error # 61 磁盘已满 <br />error # 62 输入超出了文件尾 <br />error # 67 文件过多 <br />error # 68 设备不可用 <br />error # 70 没有权限 <br />error # 71 磁盘没有准备好 <br />error # 74 重命名时不能带有其他驱动器符号 <br />error # 75 路径/文件访问错误 <br />error # 76 路径未找到 <br />error # 91 对象变量未设置 <br />error # 92 For 循环未初始化 <br />error # 94 无效使用 Null <br />error # 322 不能创建必要的临时文件 <br />error # 424 缺少对象 <br />error # 429 ActiveX 部件不能创建对象 <br />error # 430 类不支持 Automation 操作 <br />error # 432 Automation 操作中文件名或类名未找到 <br />error # 438 对象不支持此属性或方法 <br />error # 440 Automation 操作错误 <br />error # 445 对象不支持此操作 <br />error # 446 对象不支持已命名参数 <br />error # 447 对象不支持当前区域设置选项 <br />error # 448 未找到已命名参数 <br />error # 449 参数是必选项 <br />error # 450 错误的参数个数或无效的参数属性值 <br />error # 451 对象不是一个集合 <br />error # 453 未找到指定的 DLL 函数 <br />error # 455 代码资源锁定错误 <br />error # 457 此键已与该集合的一个元素关联 <br />error # 458 变量使用了一个 VBScript 中不支持的 Automation 类型 <br />error # 462 远程服务器不存在或不可用 <br />error # 481 无效图片 <br />error # 500 变量未定义 <br />error # 501 非法赋值 <br />error # 502 对象不能安全用 Script 编程 <br />error # 503 对象不能安全初始化 <br />error # 504 对象不能安全创建 <br />error # 505 无效的或无资格的引用 <br />error # 506 类没有被定义 <br />error # 507 出现一个意外错误 <br />error # 1001 内存不够 <br />error # 1002 语法错误 <br />error # 1003 缺少 ':' <br />error # 1005 缺少 '(' <br />error # 1006 缺少 ')' <br />error # 1007 缺少 ']' <br />error # 1010 缺少标识符 <br />error # 1011 缺少 '=' <br />error # 1012 缺少 'If' <br />error # 1013 缺少 'To' <br />error # 1014 缺少 'End' <br />error # 1015 缺少 'Function' <br />error # 1016 缺少 'Sub' <br />error # 1017 缺少 'Then' <br />error # 1018 缺少 'Wend' <br />error # 1019 缺少 'Loop' <br />error # 1020 缺少 'Next' <br />error # 1021 缺少 'Case' <br />error # 1022 缺少 'Select' <br />error # 1023 缺少表达式 <br />error # 1024 缺少语句 <br />error # 1025 语句未结束 <br />error # 1026 缺少整型常数 <br />error # 1027 缺少 'While' 或 'Until' <br />error # 1028 缺少 'While' 和 'Until'或语句未结束 <br />error # 1029 缺少 'With' <br />error # 1030 标识符过长 <br />error # 1031 无效数字 <br />error # 1032 无效字符 <br />error # 1033 未结束的字符串常量 <br />error # 1034 注释未结束 <br />error # 1037 无效使用 'Me' 关键字 <br />error # 1038 'loop' 语句缺少 'do' <br />error # 1039 无效的 'exit' 语句 <br />error # 1040 循环控制变量 'for' 无效 <br />error # 1041 名称重定义 <br />error # 1042 必须是行中的第一个语句 <br />error # 1043 不能为 non-ByVal 参数赋值 <br />error # 1044 调用子程序时不能使用括号 <br />error # 1045 缺少文字常数 <br />error # 1046 缺少 'In' <br />error # 1047 缺少 'Class' <br />error # 1048 必须在一个类的内部定义 <br />error # 1049 在属性声明中缺少 Let , Set 或 Get <br />error # 1050 缺少 'Property' <br />error # 1051 在所有属性的规范中，变量的数目必须一致 <br />error # 1052 在一个类中不允许有多个缺省的属性/方法 <br />error # 1053 类的初始化或终止程序没有变量 <br />error # 1054 属性的 set 或 let 必须至少有一个变量 <br />error # 1055 错误的 'Next' <br />error # 1056 'Default' 只能在 'Property' , 'Function' 或 'Sub' 中指定 <br />error # 1057 指定 'Default' 时必须同时指定 'Public' <br />error # 1058 只能在 Property Get 中指定 'Default' <br />error # 4096 Microsoft VBScript 编译器错误 <br />error # 4097 Microsoft VBScript 运行时错误 <br />error # 5016 缺少正则表达式对象 <br />error # 5017 正则表达式语法错误 <br />error # 5018 错误的数量词 <br />error # 5019 正则表达式中缺少 ']' <br />error # 5020 正则表达式中缺少 ')' <br />error # 5021 字符集越界 <br />树形菜单:<br /><font face="新宋体">＜SCRIPT language="JavaScript"＞ <br />var lastObj <br />function expandIt(obj) <br />{ <br />if(lastObj != null) <br />{ <br />if(obj == lastObj) <br />{ <br />if(obj.style.display == "none") <br />{ <br />obj.style.display = ""; <br />} <br />else <br />{ <br />obj.style.display = "none" <br />} <br />} <br />else <br />{ <br />lastObj.style.display = "none"; <br />obj.style.display = ""; <br />} <br />} <br />else <br />{ <br />obj.style.display = ""; <br />} <br />lastObj = obj <br />} <br />＜/SCRIPT＞ <br />＜table width="100%" border="0" cellspacing="0" cellpadding="0"＞ <br />＜% <br />dim id <br />id = request("id") <br />dim strsql,rs <br />strsql="select * from p_type where slanguage=1 and typelevel=1 order by typename" <br />set rs=fgetrslist(strsql) <br />do while not rs.eof <br />%＞ <br />＜tr＞ <br />＜td height="25" class="LEFTLINKS"＞＜img width="30" height="0" align="absmiddle" /＞＜b＞＜%if rs("isleaf")=0 then%＞＜a href="#" id")%＞);return false"＞＜%else%＞＜a href="＜%=request.ServerVariables("SCRIPT_NAME")%＞?idtree=＜%=rs("idtree")%＞" ＞＜%end if%＞＜%=server.HTMLEncode(right((rs("typename")&amp;""),len(rs("typename")&amp;"")-2))%＞＜/a＞＜/b＞＜/td＞ <br />＜/tr＞ <br />＜% <br />IF clng(id)=clng(rs("id")) then <br />%＞ <br />＜tr id="kb＜%=rs("id")%＞"＞ <br />＜% <br />else <br />%＞ <br />＜tr id="kb＜%=rs("id")%＞" style="display:none;"＞ <br />＜% <br />end if <br />%＞ <br />＜td＞ <br />＜table＞ <br />＜% <br />dim rs1 <br />strsql="select * from p_type where parentid="&amp;rs("id")&amp;" and slanguage=1 order by typename" <br />set rs1=fgetrslist(strsql) <br />do while not rs1.eof <br />%＞ <br />＜tr＞＜td height="20" class="LEFTLINKS"＞ <br />＜img width="40" height="0" align="absmiddle" /＞＜a href="＜%=request.ServerVariables("SCRIPT_NAME")%＞?idtree=＜%=rs1("idtree")%＞&amp;id=＜%=rs("id")%＞" ＞＜%=server.HTMLEncode(right((rs1("typename")&amp;""),len(rs1("typename")&amp;"")-2))%＞＜/a＞＜/td＞＜/tr＞ <br />＜% <br />rs1.movenext <br />loop <br />rs1.close <br />set rs1=nothing <br />%＞ <br />＜/table＞ <br />＜/td＞ <br />＜/tr＞ <br />＜% <br />rs.movenext <br />loop <br />rs.close <br />set rs=nothing <br />%＞ <br />＜/table＞ <br /><br /><br /><table class="t_msg" cellspacing="0" cellpadding="4" border="0"><tbody><tr><td class="line" style="PADDING-TOP: 10px" valign="top" height="100%"><a title="评分 0" href="http://bbs.hackbase.com/misc.php?action=viewratings&amp;tid=3048181&amp;pid=4076929" name="pid4076929"></a><span class="bold">第四课.ASP文件中的安全问题</span><br /><br /><div style="FONT-SIZE: 11px"><b>ASP中可能有哪些安全问题？<br /></b>ASP具有简单、易用、多功能，可扩充性等强大功能，但也存在一些问题。譬如，如果使用ASP的话，可能会导致网络的安全性大大降低了！下面为大家举一个例子，请按照下面的步骤： <br />（1）从http：//home.gbsource.net/xuankong/dll.zip下载这个文件，解压缩后把其中的test.dll文件拷贝到c：\windows\system（如果你使用的是NT的话，请拷贝到相应的目录中）；<br />（2）接下来打开"开始/运行"菜单输入"regsvr32 test.dll"命令；<br />（3）拷贝解压后的文件包中的那个index.asp到你的服务器目录（如果你使用的是PWS调试可以拷贝到"c:\inetpub\wwwroot"，NT请拷贝到相应的目录）；<br />（4）换一台机器用IE浏览index.asp文件看一看（你看到的是出错代码，但是实际上程序已经运行了），你再返回你的机器看一看c:\下面是不是多了一个文件？一个名为xuankong.dat的文件（其实如果我愿意，你的c:\autoexec.bat文件页可以被我打开并写进去一些像"format c:/q/u"等命令，那么等你下次重新启动的时候，结果就不言自明了）。<br /><b>ASP页面的安全问题是如何产生的？<br /></b><br />下面我们来看一下到底是怎么回事，你刚才拷贝的那些dll文件其实是我使用Visul Basic5开发的一个主件，这个文件是通过以下步骤产生的：<br />（1）打开VB5新建一个"ActiveX.dll"文件，吧下面的代码输入进去：<br />Private Declare Function ExitWindowsEx Lib "user32"_(ByVal uFlags As Long,ByVal dwReserved As Long)_As LongSub Xuankong ( ) "请不要加上"private"a$ = InputBox ("请输入你的姓名，如果你输入的是"xuankong""+Chr(13)+Chr(10)+"则会在你的系统中生成一个"xuankong"文件"+Chr(10)+Chr(13)+"否则你的机器可能会重起","请输入","xuankong")If a$ = "xuankong" ThenOpen "c:\xuankong.dat" For Append As #Write#1,"我的朋友，这是一个asp主件测试程序"#Write#1,"hello world!this is a test"#Write#1,"如果你看到这个文件测试就成功！"elseExitWindowsEx&amp;H43,0使用API函数重新启动机器End ifClose #1End sub<br />（2）把工程名改为dll，类模块改为test，然后把这个工程生成dll文件到c:\windows\system目录下面。<br />（3）新建一个index.asp文件下面的代码输入进去：<br />＜html＞ ＜/html＞<br />（4）拷贝index.asp到你的服务器内，按照上面的方法调试！<br /><b>总结：</b><br />上面所说的是ASP主件的安全问题！另外如果有些作者再写ASP主件的时候不小心留下系统bug！那就更加不容易发现了！也可能会带来意想不到的问题。</div></td></tr><tr><td valign="bottom"><br /></td></tr></tbody></table><br /><span class="bold">第五课.关于如何保障Winnt +asp +sql web站点的安全经验</span><br /><br /><div style="FONT-SIZE: 11px">以下是我的一些经验，希望对你有用，但你要知道，绝对的安全是没有的。这才是一个网管存在的理由。所以。未雨绸缪是件好事。但亡羊补牢也不是下策。 <br /><br />请看我的经验： <br /><br />1。多看看ms的安全公告，这是首选。订阅安全技术杂志。（MS免费的！）如果是正版的nt，则会有最新的安全E-mail。保证及时更新。 <br /><br />2。多大补丁，一定要注意顺序，如果安装了系统软件，则还要重补。（如后面加上了smtp服务，则还要重补sp1等等，否则可能导致旧文件不会被覆盖）。 <br /><br />3。提高安全策略，也可以用微软的安全模板。有一些很好的自动模板。可以根据需要自动加上。 <br /><br />4。加大审核力度，审核权限比较大的操作。 <br /><br />5。密码按时更改。必须符合策略。 <br /><br />6。常上一些安全论坛。如：绿盟科技，妖狐站点。 <br /><br />7。账号的级别一定要多分一些，如果可一实现功能，就不要给更大权限。 <br /><br />8。去掉多余的服务。如:(ftp，smtp,nntp,telnet）多余的脚本，例子。如IIS中好多的脚本库，都可以不要。 <br /><br />9。去掉一些危险的命令。不要共享c盘。 <br /><br />10。常看看日志，事件。 <br /><br />11。不要安装html的远端管理。 <br /><br />12。最好安装一些黑客工具，模拟攻击。看看是否出了问题。 <br /><br />13。安装端口扫描工具。看看是否有些不用的开放端口。 <br /><br />14。安装一些防止窃听的工具，去除一些隐藏在端口的sniffer，防止密码数据被截获。 <br /><br />15。远程管理时最好调试端管理。密码加密策略高一些。防止被截获。 <br /><br />16。用注册表修改掉某些选项。如自动显示最后一个登录着的姓名。 <br /><br />17。改掉administrator的缺省姓名。这样可以多一级保护！ <br /><br />18。密码策略 <br /><br />19。密码的安全策略。多少位的密码是安全的。这个很怪。按照ms的加密算法。只有14位以上的密码是可能安全的。但实际上很少有人能记住那么多位的密码。但14位一下。7位密码比较安全。（很怪吧。）微软工程师说有时7位比10位还要保险。呵呵，具体原因说起来比较复杂。我是给我老弟讲课的。省略吧。 <br /><br />20。建议密码有字母。数字。大小写组成。最好加上一些如！·#￥%（）等的字符。也很难被猜到。 <br /><br />21。用户名改掉缺省的admini.....后，可以建一个14位长的管理员名。可以全部用字母。这样就加大了一级保护。 <br /><br />22。加大策略。防止用枚举法猜出账号名。 <br /><br />23。加入防止5次登录失败后，自动锁定账号20分中。防止暴力法突破。 <br /><br />24。建立分类的密码策略。不要用一些内置账号。如“sa”。 <br /><br />25。将sa的密码加大。最好不要常用他。建一个另外的管理员账号。然后对每一个自建的数据库都建一个分类账号。asp中最好用他来连接。这样就可以保障其他数据库的安全。 <br /><br />26。去掉一些权限。不允许普通用户用比较危险的存储过程。 <br /><br />27。不允许除管理员外的账号远程连接。或是加上命名管道。 <br /><br />27。asp如果能用dsn，就不要用连接字符串。并采取包含文件的模式包含进来。<br /><br /><span class="bold">第六课.Web程序中网页间数据传递方法小结</span><br /><br /><div style="FONT-SIZE: 11px">介绍 <br /><br />我们总是会遇到这样的情况，需要将数值从一个网页传递到另一个网页。在这篇文章中，向你展示了几种从一个网页向另一个网页传递数值的几种方法。在此例子中，创建的网页由一个文本控件和几个按钮控件组成。在文本框中输入的数据通过被标识在按钮控件中的不同方法从一个网页传递到另一个网页。 <br /><br />Response.Redirect <br /><br />让我们首先看一看如何使用Response.Redirect方法传递数据。这是它们之中最简单的方法。在文本框中输入一些数据，并且当你输入完成数据后，按下“Respose.Redirect”按钮。我们会得到一个提示，有时我们想在catch程序中传递另一个网页，意味着捕捉到例外程序并且向另一个网页传递。如果你试图这样做，它会给你一个System.Threading例外程序。因为你想遗留下一个线程向另一个网页传递数据，所以这个例外程序就会被抛出。 <br /><br />Response.Redirect("WebForm5.aspx",false); <br /><br />这个语句告诉编译器定位到“WebForm5.aspx”，这里的“false”意味着在当前网页不能结束你正在做的事情。应该看一看线程发布命令的System.Threading类。在下面，看一看按钮事件的C#代码。“txtName”文本控件的名字，文本框的内的值传递到一个叫做“WebForm5.aspx”的网页。在“？”之后的“Name”符号只是一个临时的响应变量，这个变量保持着文本的数值。 <br /><br />private void Button1_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />// Value sent using HttpResponse <br /><br />Response.Redirect("WebForm5.aspx?Name="+txtName.Text); <br /><br />} <br /><br />好的，到这种观点为止，你使用Response发送了数值。刚刚，在此我收集到了这些数值，所以在“WebForm5.aspx”page_Load事件中，写入这些代码。首先，我们检查到输入的值不为null。如果不是这样，我们只是简单地在网页上使用Label控件显示数值。注意：如果你使用Response.Redirect方法来传递这些数值，所有这些数值在浏览器的URL中都是不可见的。你绝不能使用Response.Redirect来传递信用证号码和机密信息。 <br /><br />if (Request.QueryString["Name"]!= null) <br /><br />Label3.Text = Request.QueryString["Name"]; <br /><br />Cookies <br /><br />接下来使用Cookies。Cookies在服务器端创建，但是客户端省略。在此 “Cookies” 按钮的click事件中，写入以下代码： <br /><br />HttpCookie cName = new HttpCookie("Name"); <br /><br />cName.Value = txtName.Text; <br /><br />Response.Cookies.Add(cName); <br /><br />Response.Redirect("WebForm5.aspx"); <br /><br />首先，创建一个cookie命名为“cName”。既然一个cookie实例可以拥有许多数值，告诉编译器这个cookie持有“Name”数值。我们将它赋值给TextBox并且最结后将它加入Response流，再使用Response.Redirect方法传递给其它网页。 <br /><br />让我们看一看如何得到被另一个网页传递的cookie数值。 <br /><br />if (Request.Cookies["Name"] != null ) <br /><br />Label3.Text = Request.Cookies["Name"].Value; <br /><br />如你所看到的，象我们以前做一的一样正是使用同一种方法，刚刚我们在Request.QueryString之内，使用了Request.Cookies。记注一些浏览器不接收cookies。 <br /><br /><b>Session Variables</b><br />接下来我们看一看session变量，这些变量由服务器来处理。第一个响影一从客户端传递到服务器，Sessions就创建了，并且当用户关闭浏览器窗口或者一些异常操作发生，session就会结束。给你一些可以使用session变量来传递数值的方法。在下面你看到为用户创建的Session和 “Name”是关键字，也如知名的Session关键字一样，关键字被赋给TextBox数值。 <br />// Session Created <br />Session["Name"] = txtName.Text; <br />Response.Redirect("WebForm5.aspx"); <br />// The code below shows how to get the session value. <br />// This code must be placed in other page. <br />if(Session["Name"] != null) <br />Label3.Text = Session["Name"].ToString(); <br />Application Variables <br />有时，我们需要存取来自网页任何地方的数值。因为那样，可以使用Application变量。这里有一小段代码，这段代码显示如何做到那些事情。一旦创建Application变量并且为其赋值，在应用程序的任何地方都可以重新得到它的值。 <br />// This sets the value of the Application Variable <br />Application["Name"] = txtName.Text; <br />Response.Redirect("WebForm5.aspx"); <br />// This is how we retrieve the value of the Application Variable <br />if( Application["Name"] != null ) <br />Label3.Text = Application["Name"].ToString(); <br /><b>HttpContext</b><br />可以使用HttpContext从网页中重新得到数值。通过使用方法的属性获得那些数值。既然它们易于编写代码和修改，使用属性是一种好方法。在你的第一个网页中，制造一个属性，这个属性可以返回TextBox的值。 <br />public string GetName <br />{ <br />get { return txtName.Text; } <br />} <br />我们使用Server.Transfer来将此控件发送到一个新网页。注意：Server.Transfer仅仅将此控件传递到新的网页并且不重新定位该网页，这意味着你会看到在URL中旧网页的地址。简单地在“Server.Transfer”按钮单击事件，并且增加下列代码。 <br />Server.Transfer("WebForm5.aspx"); <br />现在，让我们定位网页，数值就传递到该网页上，在这种情况下使用的该网页是“webForm5.aspx”。 <br />// You can declare this Globally or in any event you like <br />WebForm4 w; <br />// Gets the Page.Context which is Associated with this page <br />w = (WebForm4)Context.Handler; <br />// Assign the Label control with the property "GetName" which returns string <br />Label3.Text = w.GetName; <br />Special Note <br />特别注意 与你看到的一样，从一个网页向别一网页传递数值时有不同的方法。每一个方法有它自己的优点也有其缺点。所以，当你传递数值时，选择好你所需要的所以你就会有一种好方法，这种方法对你是最为可行的。</div></div></font></div>
		</div>
<img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-16 21:04 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp优化</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24142.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Fri, 16 Mar 2007 13:03:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24142.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24142.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24142.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24142.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一课.Asp编码优化技巧8则						ASP(Active Server Page)是Microsoft公司推出的基于PWS(Personal Web Server)&amp;IIS(Internet Information Server)平台的、基于ISAPI(InternetServiceAPI)原理的动态网页开发技术，目前日趋成熟完善。在这里仅就代码优化进行一些简单讨论。 1...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24142.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-16 21:03 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp网络编程</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24141.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Fri, 16 Mar 2007 13:00:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24141.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24141.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24141.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24141.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一课.用ASP编程实现网络内容快速查找						有一天我突发奇想，要是我每到一个网站，那里都能立刻调出我需要看的信息，那岂非美妙得很。接下来我想更深入地考虑这个问题，坐到椅子上拿一支铅笔，却不知道自己写什么。如此一来，我还是得着手对付代码它们。 我的朋友开了一个小型站点，原本是我设计的。这是个检验我想法的好平台。所以我写出代码，上传了文件。真叫人兴奋，程序工作起来煞是圆满，同时...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24141.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-16 21:00 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp数据库编程</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24140.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Fri, 16 Mar 2007 12:57:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24140.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24140.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24140.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24140.html</trackback:ping><description><![CDATA[
		<span class="bold">第一课.在ASP中使用数据库</span>
		<br />
		<br />
		<div style="FONT-SIZE: 11px">ASP有一个最重要的功能，就是它可以让你非常轻松地连接数据库。通常都是和一个Access或者一个SQL数据库相连。因为Access是最容易起步的，同时，在你的机器上也许已经都装有Access了，所以，在下面的例子中，我们都将使用Access来做例子。一旦你学习了ASP和Access数据库连接的核心技术方法，当你开始使用SQL server的时候，你就会发现，两者所需要的关键技术是基本相同的。当你要连接数据库的时候，你需要在服务器上将这个数据库打开。你可以通过使用数据源名（DSN）或者通过在你的脚本语言中直接使用一个DSN-less连接的方法来连接和打开数据库。 创建一个数据源名（DSN） 你可以通过在控制面板中给你的数据库建立一个系统DSN来使你的数据库可以在ASP中连接使用。你可以在你的本地计算机上建立若干个DSN，每个DSN对应你使用的不同的数据库。在建立完DSN之后，你就可以在你的本地服务器上测试你的页面了。如果你的网站是由 ISP提供服务的，并且这个ISP支持ASP，那么很有可能它就会提供一个GUI接口，来给你的数据库创建一个DSN。 在Windows 95/98/NT中，打开控制面板（开始菜单－&gt;设置－&gt;控制面板），双击ODBC进入。 选择系统DSN，点击Add。 选择“Microsoft Access Driver”，点击结束。 填写数据源名。这是你给你的数据库起的名字，所以和一个alias是同样的操作。 在数据库选择中点击选择按钮，浏览系统中你创建的Access数据库所存放的位置。 点击OK 现在，新的DSN现在就会在系统DSN中显示，并且可以在你的本地服务器上使用了。连接数据库 让我们建立一个DSN-less连接，并且看看是如何连接数据库的。当你创建一个DSN的时候，你就已经存储了关于这个数据库的一些信息，所以你不需要在每次需要使用一些信息的时候重复它们，这些信息如：数据库类型、名称、存放地点和可选性、用户和密码。 要创建一个DSN-less连接，你就需要提供同样的信息。下面这个例子就显示了如何给一个叫products的数据库建立一个DSN-less连接： 第二行定义了数据库的驱动和物理路径。为了要使用一个DSN-less连接，你就需要知道实际的文件存放地点（绝对路径）。Server.MapPath给任何一个使用主机服务的人提供了一个简单的工作环境来查找出那些难于查到的实际访问路径。 如果我们已经建立了一个系统DSN，并命名为products，则连接码应该为： 现在，数据库就已经打开了，那么你可以做些什么呢？第一件事情当然就是阅读数据库中的一系列记录，并将它们放到你的页面中去。但是，在这之前，你需要一个recordset。 Recordset 一个recordset是存储在特殊数据库表上的所有信息。所以，当你打开这个recordset的时候，表中所有的行和列的内容都是可访问的。你需要打开这个recordeset，正如你需要打开数据库连接一样。它们的命令是相似的： Set objRec = Server.CreateObject ("ADODB.Recordset") objRec.Open "downloadable", strConnect, 0,1,2 这个语句就创建了一个名为downloadable表的recordset(objRec)，这个表在products数据库的strConnect中定义。使用Recordset open, 我们就可以循环浏览这个表，并且可以将它的所有内容都显示到屏幕上。或者，我们可以测试特定字段的内容，也可以只将我们关注的内容写到屏幕上去。 每一列代表一个字段。所以，如果数据库表如下所示： Product ID SKU Name File 1 PR12345 Product A install_a.exe 2 PR12346 Product B Install_b.exe 那么，我们就有如下字段的内容：ProductID, SKU, Name, 和File。你的表很可能会有许多额外的字段内容，可能包含很多东西，如价格或者是产品（商品）描述。但是这个示意图可以给你提供最基本的数据库表的概念。填写recordset内容 使用recordset是非常容易的一件事情。如果你想要循环浏览数据库，并将所有的信息都打印到屏幕上显示，你可以按照下面来操作： While NOT objRec.EOF \\\\\\\' says to do this as long as we haven\\\\\\\'t reached the end of the file Response.WriteobjRec("ProductID") &amp; ", " Response.WriteobjRec("SKU") &amp; ", " Response.WriteobjRec("Name") &amp; ", " Response.WriteobjRec("File") &amp; " " objRec.MoveNext Wend ; 即使你没有如此使用过loop，你仍然可以通过阅读这个代码来将信息写到comma-delimited字符串里，并且当数据库表中创建了一个新行的时候，就重新创建一个新的行，来记录表中的那一行。你可以使用同样的方法将数据写到HTML表格中去。通过使用Response.Write添加你的TABLE标签，需要记住以下几点： <font face="楷体_GB2312">你的HTML 标签和引号中的内容。 如果你的标签或者内容使用了引号，注意使用双引号： . 使用&amp;来连接变量和HTML/内容信息 选择recordset中的字段假设我们的products数据库同样包含一个叫OS的字段，假设这个字段是一个平台分界符。同样，让我们假设存储在这个字段的数据只能是如下的数据：Windows NT, Windows 95, Windows 98, Windows, Mac, Unix, 或者 Linux。</font> 下面，我们就可以确认我们需要将哪个字段打印到屏幕上，而要忽略哪些那些字段。或者，我们可以选择哪些字段用一种格式，而另外的字段用其它的格式，如，使用不同的颜色。 使用一个简单的If...，循环就可以给我们提供更多的数据库控制权利。首先让我们来打印有关Windows NT产品的记录： Windows NT Products If objRec("OS") = "Windows NT" THEN \\\\\\\' specifies the criteria Response.Write "" &amp; objRec("ProductID") &amp; "" Response.Write "" &amp; objRec("SKU") &amp; "" Response.Write "" &amp; objRec("Name") &amp; "" Response.Write "" &amp; objRec("File") &amp; "" end if objRec.MoveNext Wend %&gt; 添加一个记录 一旦你开始使用recordset和ASP了，你就会十分希望能够通过网络将数据添加到数据库中去。添加内容是非常重要的，如，当你需要你的网页浏览者留下它们的观点和看法，或者，当你想要进行管理更新的时候。 下面的代码打开了一个recordset，这个recordset是有关一个有着书本和它们作者名字的数据库表格。你可能曾经看到过这个，但是这次，最后三个说明书定义的指针类型是不同的：adOpenStatic, adLockOptimistic, adCmdTable: (如果你没有使用adovbs.inc的复制文件，第三行应该为：objRec.Open "books", bookdb, 3,3,2). recordset现在就准备好接收数据了，你只需要告诉它添加什么。在这个情况下，假设我们从表格中取出变量：strBookTitle和strBookAuthor。我们的table, books有两个字段，称作Title 和 Author，所以我们可以通过使用下面的语句来添加一个新的记录： strBookTitle和strBookAuthor代表值，通常被用户访问。如果你只是想测试add功能，你可以给title和author添加一个变量――只是需要记住使用引号。在你第一次使用它的时候，你可能会立即打开你的数据库，以确保更新的发生。 Recordset类型 在显示的objRec.Open例子中，你会发现在末尾有0，1，2的字样。这些数字代表不同的指针类型。你是用的类型依赖于你将使用它来干什么。例如，如果你不需要修改或增加任何的记录，你可以使用一个Lock类型。而当你计划要修改或者更新数据库的时候，你所选择的类型就会不同。 0,1,2 实际上代表： adOpenForwardOnly, adLockReadOnly, adCmdTable 当然，如果在你的服务器上已经有了adovbs.inc的备份，那么，你也可以不使用数字，直接使用这些单词。adovbs.inc 包括了这三个常量和其它常量的一个列表。</div>
		<div style="FONT-SIZE: 11px">
				<br />
				<br />
				<span class="bold">第二课.Oracle大文本在ASP中存取问题的解决</span>
				<br />
				<br />
				<div style="FONT-SIZE: 11px">在我开发BS结构程序中，由于经常需要在ORACLE中处理一些容量较大的文本数据，所以经过反复测试终于用ASP成功解决了大文本数据在ORACLE下存取问题。<br />　　<br />　<b>　一、运行环境：<br /></b>　　1、Microsoft Windows 2000 Server + IIS 5.0<br />2、Oracle8i中文标准版<br />　　<br /><b>　　二、建立数据表：</b><br />　　CREATE TABLE SYSTEM.TEST(<br />BLOB LONG,<br />ID NUMBER)<br />/<br />　<b>　三、源程序：</b><br />1、数据存入程序：test.asp<br /><font face="新宋体">＜%<br />'表单提交处理部分<br />'--------------------------------------------------<br />If request("ok")=1 then<br />'字符转换函数<br />function tansstr(sstr) <br />sstr=replace(sstr," "," ")<br />sstr=replace(sstr,chr(13) &amp; chr(10),"＜br＞")<br />tansstr=sstr<br />end function<br />'提交数据赋值<br />a=lenb(request("text"))<br />b=len(request("text"))<br />c=tansstr(request("text"))<br />'打开数据库，打开test数据表以Rs为记录集<br />Set OraSession=CreateObject("OracleInProcServer.XOraSession")<br />Set OraDatabase=OraSession.DbOpenDatabase("autop","system/manager",0)<br />Set rs=OraDatabase.CreateDynaset("select * from test order by id desc",0) <br />'求ID值<br />if rs.eof then<br />id=1<br />else<br />id=rs("id")+1<br />end if<br />'因为受SQL语句长度大小限制所以，以非SQL语句存入数据<br />'--------------------------------------------------------<br />'新建记录<br />rs.DbAddNew<br />'经典就在本句：以RS记录集的Fields对象的DbAppendChunk方法处理大字段存入问题。<br />rs.Fields("blob").DbAppendChunk(c)<br />'存入ID值<br />rs("id")=id<br />'刷新记录集<br />rs.DbUpdate<br />'显示结果部分<br />'--------------------------------------------------------- <br />Response.write "数据已经存入数据库中。＜br＞"<br />Response.write "总计占用字符数： ＜font color=blue＞" &amp; formatnumber(b,2,-2,-2,-1) &amp; "＜/font＞ 字＜br＞"<br />Response.write "总计占用字节数： ＜font color=blue＞" &amp; formatnumber(a,2,-2,-2,-1) &amp; "＜/font＞ Byte＜br＞"<br />Response.write "＜a href='view.asp'＞请调阅……＜/a＞"<br />'关闭数据连接。<br />rs.close<br />set rs=nothing<br />Set OraSession=nothing<br />Response.end<br />End If<br />%＞<br />＜html＞<br />＜body＞<br />＜form method="POST" action="test.asp"＞<br />＜p＞＜font color="#FF0000"＞＜b＞Oracle大字段在ASP中存取问题的解决：＜/b＞＜/font＞＜/p＞<br />＜p＞＜textarea rows="13" name="text" cols="104"＞＜/textarea＞＜/p＞<br />＜p＞＜input type="submit" value="存入" name="B1"＞＜/p＞<br />＜input type="hidden" name="ok" value="1"＞<br />＜/form＞<br />＜/body＞<br />＜/html＞<br /></font><br />　　2、数据调出程序：view.asp<br /><font face="新宋体">＜%<br />'连接数据库，以只读方式打开数据表<br />Set OraSession=CreateObject("OracleInProcServer.XOraSession")<br />Set OraDatabase=OraSession.DbOpenDatabase("autop","system/manager",0)<br />Set Rs=OraDatabase.DbCreateDynaset("select * from test order by id desc",4)<br />'赋初值：定义每次截取字节大小为1024byte,最大可以设为65280byte （64K）<br />Size=65280<br />I=0<br />Do<br />'以Rs记录集的Fields对象的DbGetChunk方法在循环中读出数据<br />Text=Rs.Fields("Blob").DbGetChunk(I*Size,Size)<br />Response.write Text<br />'求出每次取出数据的详细字节数<br />Text_Size=Lenb(Text)<br />I=I+1<br />'如果每次取出数据的详细字节数小于欲定义的截取字节大小则说明该条数据已经完毕，退出循环。 <br />Loop until Text_Size＜Size<br />'关闭数据连接<br />Set OraSession=nothing<br />%＞<br /><br /><table class="t_msg" cellspacing="0" cellpadding="4" border="0"><tbody><tr><td class="line" style="PADDING-TOP: 10px" valign="top" height="100%"><a title="评分 0" href="http://bbs.hackbase.com/misc.php?action=viewratings&amp;tid=3047439&amp;pid=4069112" name="pid4069112"></a><span class="bold">第二课.在ASP中使用Oracle数据库</span><br /><br /><div style="FONT-SIZE: 11px">Oracle是世界上用得最多的数据库之一，活动服务器网页（ASP）是一种被广泛用于创建动态网页的功能强大的服务器端脚本语言。许多ASP开发人员一直在考虑，能否在开发互联网应用、电子商务网站、互联网管理系统时结合使用ASP和Oracle数据库？这个问题的答案是肯定的，我们还可以使用VB访问Oracle数据库。在本篇文章中，我们将主要讨论如何使用ASP来处理Oracle数据库中数据的方法。 <br />　　在开始讨论这个问题前，我们需要了解几个背景知识，Oracle Objects for OLE就是其中之一。Oracle Objects for OLE是Oracle开发的一个中间件，它允许使用微软的OLE标准的客户端应用程序访问Oracle的数据库。也许会有读者说，我们也可以使用ODBC访问Oracle的数据库。当然，可以使用ODBC访问Oracle数据库，但我认为，Oracle Objects for OLE比ODBC更安全，而且完全支持PL/SQL。PL/SQL是Oracle对SQL命令集的扩展，开发人员能够利用它对非结构化的SQL命令块进行流控制和逻辑设计。如果安装的是Oracle8i数据库，我相信你已经在使用Oracle Objects for OLE。如果还没有使用Oracle Objects for OLE，可以从Oracle的网站上下载它。 <br />　　另外，我们还需要了解Oracle针对Visual Basic开发的二个对象和一个接口：OraSession、OraDynaset对象和OraDatabase接口。OraSession对象管理应用程序的OraDatabase、OraConnection和OraDynaset，它是由ASP的CreateObject而不是Oracle Objects for OLE创建的一个对象。OraDatabase接口向Oracle数据库表示表现用户对话，并为SQL、PL/SQL的执行提供方法。它们每个都有一些属性和方法。例如，OraDynaset对象有BOF、EOF、Bookmark、Connection等属性以及AddNew、Update、Delete、Edit、Refresh、Clone等10个方法。 <br />　　下面我们就开始切入主题，讨论如何使用ASP处理Oracle数据库中的数据。 <br />　　 <b>准备工作 </b><br />　　我们需要什么样的环境和工具？ <br />　　1）我使用了Oracle8i、IIS5.0、Windows2000专业版作为应用程序的开发和运行环境。 <br />　　2）在Oracle数据库中建立一个名字为MYTABLE1或类似的表。 <br />ID (type: number) <br />User Name(type: varchar2) <br />Phone(type: varchar2) <br />Email(type: varchar2) <br />100 <br />Colin Tong <br />999-999-8888 <br /><a href="mailto:colinjava@hotmail.com"><font color="#002c99">colinjava@hotmail.com</font></a><br />111 <br />John White <br />888-888-8888 <br /><a href="mailto:johnw@yahoo.com"><font color="#002c99">johnw@yahoo.com</font></a><br />101 <br />Don Wod <br />416-333-3344 <br /><a href="mailto:donwod@test.com"><font color="#002c99">donwod@test.com</font></a><br /><b>数据的访问和存取 </b><br />　　 1) Instantiate OO4O Object, OraSession and interface OraDatabase for connecting to ORACLE. <br />　　 1）初始化Oracle Objects for OLE、OraSession对象和OraDatabase接口，为连接ORACLE数据库作准备。 <br />　　首先，使用CreateObject创建OraSession对象，然后通过打开一个与Oracle的连接创建OraDatabase对象，如下所示： <br /><font face="新宋体">＜% <br />Set OraSession = CreateObject("OracleInProcServer.XOraSession") <br />Set OraDatabase = OraSession.OpenDatabase("", _ <br />"username/password", Cint(0)) <br />%＞ </font><br />　　 “username”和“password”是你所使用的关系数据库的用户名和口令。 <br />　　 2）创建OraDynaset对象执行SQL命令。我们可以使用CreateDynaset或DbCreateDynaset创建记录集。 <br /><font face="新宋体">＜% <br />'execute SQL <br />Set OraDynaset = OraDatabase.DbCreateDynaset( _ <br />"select * from mytable1", cint(0)) <br />%＞ </font><br />　　3）存取数据并删除创建的对象。 <br /><font face="新宋体">＜% <br />Do While(OraDynaset.EOF = FALSE) <br />Response.write(OraDynaset.Fields("ID")) <br />Response.write(OraDynaset.Fields("UserName")) <br />... others ... <br />... ... <br />OraDynaset.MoveNext <br />Loop <br />'remove OraSession <br />Set OraSession = Nothing <br />%＞ </font><br />　　 <b>编辑数据记录 </b><br />　　 我们将使用OraDynaset的方法实现对数据记录的编辑。 <br />　　 1）使用SQL语句创建OraDynaset对象。 <br /><font face="新宋体">＜% <br />'创建ID= fID的记录的OraDynaset对象。 <br />Set OraDynaset = OraDatabase.CreateDynaset(_ <br />"select * from MYTABLE1 where ID= "&amp; fID, cint(0)) <br />%＞ </font><br />　　fID是想插入更更新的记录的ID值。 <br />　　 2）执行OraDynaset更新或添加数据记录。 <br /><font face="新宋体">＜% <br />'使用Edit方法更新ID=fID记录的域。 <br />'或使用AddNew插入一个新记录 <br />OraDynaset.Edit <br />OraDynaset.Fields("Phone").Value = fPhone <br />OraDynaset.Update </font><br />' 删除创建的对话 <br />Set OraSession = Nothing <br />%＞ <br /><b>删除数据记录 </b><br />　　 如果已经真正地理解了我们在上面讨论的一些方法（Edit、Update和AddNew），也许有的读者已经知道该如何在Oracle数据库中删除记录了。 <br /><font face="新宋体">＜% <br />'删除所有符合上面条件的记录 <br />OraDynaset.Delete <br />%＞ </font><br />　　在Oracle8i中搜索和更新数据记录的代码 <br />　　1）搜索 <br /><font face="新宋体">＜% <br />'RetriveRecProc.asp -使用ASP的Oracle Objects for OLE更新数据记录%＞ <br />＜% <br />'定义作为OLE对象的变量 <br />Dim OraSession <br />Dim OraDatabase <br />Dim OraDynaset'创建OraSession对象 <br />Set OraSession = CreateObject("OracleInProcServer.XOraSession")'通过打开Oracle数据库的一个连接创建OraDatabase对象 <br />'一定要使用自己的用户名和口令访问Oracle数据库 <br />Set OraDatabase = OraSession.OpenDatabase("", "user/password", _ <br />Cint(0)) <br />'创建OraDynaset对象执行SQL语句 <br />Set OraDynaset = OraDatabase.DbCreateDynaset(_ <br />"select * from mytable1", cint(0)) <br />%＞ <br />＜html＞＜body＞ <br />＜H3＞Retrieve All Records in MYTABLE1 Table ( in Oracle) <br />Using oo4o＜/H3＞ <br />＜table border=1 ID="Table1"＞ <br />＜% <br />Do While(OraDynaset.EOF = FALSE) <br />Response.Write("＜tr＞＜td＞") <br />Response.write(OraDynaset.Fields("ID")) <br />Response.Write("＜/td＞＜td＞") <br />Response.write(OraDynaset.Fields("UserName")) <br />Response.Write("＜/td＞＜td＞") <br />Response.write(OraDynaset.Fields("Phone")) <br />Response.Write("＜/td＞＜td＞") <br />Response.write(OraDynaset.Fields("Email")) <br />Response.Write("＜/td＞＜/tr＞") <br />OraDynaset.MoveNext <br />Loop <br />'删除OraSession <br />Set OraSession = Nothing <br />%＞ <br />＜/table＞ <br />＜a href="javascript:window.history.go(-1)"＞ <br />Back previous Page＜/a＞ | <br />＜a href="index.html"＞ Back home Page＜/a＞ <br />＜/body＞＜/html＞ </font><br />　　2）更新 <br /><font face="新宋体">＜% <br />'UpdateRecProc.asp -使用ASP的Oracle Objects for OLE更新数据记录 <br />%＞ <br />＜% <br />'定义作为OLE对象的变量。 <br />Dim OraSession <br />Dim OraDatabase <br />Dim OraDynaset <br />'从提交的表格中获取字段值 <br />fID = request.form("ID") <br />fUserName = request.form("UserName") <br />fPhone = request.form("Phone") <br />fEmail = request.form("Email") <br />'创建OraSession对象 <br />Set OraSession = CreateObject("OracleInProcServer.XOraSession") <br />'通过打开Oracle数据库的一个连接创建OraDatabase对象 <br />Set OraDatabase = OraSession.OpenDatabase("", "user/password", _ <br />Cint(0)) <br />'创建ID= fID的记录的OraDynaset对象 <br />Set OraDynaset = OraDatabase.CreateDynaset(_ <br />"select * from MYTABLE1 where ID= "&amp; fID, cint(0)) <br />'使用Edit方法更新ID=fID记录的字段 <br />Do While(OraDynaset.EOF = FALSE) <br />OraDynaset.Edit <br />OraDynaset.Fields("UserName").Value = fUserName <br />OraDynaset.Fields("Phone").Value = fPhone <br />OraDynaset.Fields("Email").Value = fEmail <br />OraDynaset.Update <br />OraDynaset.MoveNext <br />Loop <br />%＞ <br />＜html＞＜body＞ <br />＜H3＞Update A Record in MYTABLE1 Table (Oracle) Using oo4o＜/H3＞ <br />The record (ID=＜%=fID%＞) has been updated successfully!＜br＞ <br />You can view the result ＜a href="RetrieveAllRec.asp"＞ here＜/a＞ <br />＜p＞ <br />＜a href="javascript:window.history.go(-1)"＞ Back previous Page＜/a＞ <br />&amp;bnsp;&amp;bnsp; <br />＜a href="javascript:window.history.go(-2)"＞ Back home Page＜/a＞ <br />＜% <br />'删除OraSession对象 <br />Set OraSession = Nothing <br />%＞ <br />＜/body荆?html＞ </font><br />　　至此，我们已经讨论了如何在ASP代码中使用Oracle Objects for OLE来处理Oracle数据库中的数据。 <br />　　 <b>使用 </b><b>存储过程 </b><br />　　 我们已经讨论了如何在ASP中访问Oracle数据库，所有的SQL语句都可以嵌入在ASP网页中。如果在ASP中使用存储过程，将更能够更有效地处理数据。我建议读者除在ASP中嵌入SQL语句外，还应当使用PL/SQL存储过程。在Oracle数据库中创建存储过程已经超出了本文章的范围，在这里就不再进行介绍了。 <br />　　 ASP和Oracle数据库是二种比较流行的技术，都有相当广泛的用户群，如果能够有机地将二者结合起来，将能够给工作带来许多方便，希望这篇文章能够起到抛砖引玉的作用，使读者能够更好地探索将这二种技术结合使用的途径。</div></td></tr><tr><td valign="bottom"><br /></td></tr></tbody></table></font></div>
		</div>
		<div style="FONT-SIZE: 11px"> </div>
		<span class="bold">第五课.随机访问Recordset的一条记录</span>
		<br />
		<br />
		<div style="FONT-SIZE: 11px">假设这个数据表有一个唯一的ID字段，并至少有一条记录。随机存取其中一条记录的方法是非常简单的，可以分为四步：<br />1、取得记录总数n。<br />2、把所有的ID号存储到一个数组中<br />3、产生一个不大于n的随机数m<br />4、从数组中取出第m个ID号，查询数据表，取得记录数据。<br />　　下面是部分代码：<br /><font face="新宋体">$#@60;% <br />set conn = Server.CreateObject(‘ADODB.Connection‘) <br />conn.open ‘$#@60;conn string$#@62;‘ <br />‘ ***** (step 1) ***** <br />set rs = conn.execute(‘Select count(id) from someTable‘) <br />rCount = rs(0) <br />‘ ***** (step 2) ***** <br />set rs = conn.execute(“select id from someTable”) <br />cnt = 1 <br />dim RRs <br />redim RRs(rCount) <br />do while not rs.eof <br />RRs(cnt) = rs(0) <br />cnt = cnt + 1 <br />rs.movenext <br />loop <br />‘ ***** (step 3) ***** <br />randomize <br />currentRR = cLng(rnd*rCount+0.5) <br />ID = RRs(currentRR) <br />‘ ***** (step 4) ***** <br />sql = “select otherfield from someTable where id=” &amp; ID <br />set rs = conn.execute(sql) <br />response.write “ID # ” &amp; ID &amp; “ = ” &amp; rs(0) <br />rs.close: set rs = nothing <br />conn.close: set conn = nothing <br />%$#@62;<br /></font><br />　　对于SQL Server，还有更加有效率的方法。比如设计两个存储过程。我这里只是阐明一些思路，并希望这种思路可以同时用在Access和SQL Server中。<br /><br /><span class="bold">第六课.ADO 存取数据库时如何分页显示</span><br /><br /><div style="FONT-SIZE: 11px">∈裁词?ADO 存取数据库时的分页显示？如果你使用过目前众多网站上的电子公告板程序的话，那你应该会知道电子公告板程序为了提高页面的读取速度，一般不会将所有的帖子全部在一页中罗列出来，而是将其分成多页显示，每页显示一定数目的帖子数，譬如 20 条。想不想了解如何实现分页显示？请看本文！<br />　　《动态网站设计十八般武艺 --ASP 篇》一文从第一期至今已和朋友们一起度过了大半个年头，相信通过在这一段时间中的学习、实践到再学习、再实践，大家已经能够熟练运用 ASP 的内建对象、 ActiveX 组件去编写一些基本的 ASP 应用程序。从我收到的朋友们的来信中可以明显的感觉到，大家的 ASP 功力正不断地提升。最近很多朋友来信希望我写一些 ASP 在现实运用中的实例。因此，从本期开始我决定将《动态网站设计十八般武艺 --ASP 篇》的定位从介绍和学习 ASP 基础知识转向到 ASP 实际运行的探讨和深化。应朋友们的要求，在本期中我将给大家着重谈一谈“ADO 存取数据库时如何分页显示”的问题。 <br />　　什么是 ADO 存取数据库时的分页显示？如果你使用过目前众多网站上的电子公告板程序的话，那你应该会知道电子公告板程序为了提高页面的读取速度，一般不会将所有的帖子全部在一页中罗列出来，而是将其分成多页显示，每页显示一定数目的帖子数，譬如 20 条。这就是数据库查询的分页显示，如果你还不明白，去看看 yahoo 等搜索引擎的查询结果就会明白了。 <br />　　那么究竟如何才能做到将数据库的查询结果分页显示呢？其实方法有很多，但主要有两种： <br />　　一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中，存放在内存中，然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性： PageSize( 页大小 )、 PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。 <br />　　二、根据客户的指示，每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。 <br />　　两者的主要差别在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示的效果，而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存，从而直接达到分页显示的功能。 <br />　　我们可以很明显的感觉到，当数据库中的记录数达到上万或更多时，第一种方法的执行效率将明显低于第二种方法，因为当每一个客户查询页面时都要将所有符合条件的记 娣旁诜衿髂诖嬷校缓笤诮蟹忠车却恚绻庇谐? 100 个的客户在线查询，那么 ASP 应用程序的执行效率将大受影响。但是，当服务器上数据库的记录数以及同时在线的人数并不是很多时，两者在执行效率上是相差无几的，此时一般就采用第一种方法，因为第一种方法的 ASP 程序编写相对第二种方法要简单明了得多。<br />　　在这里作者就以我们常见的 ASP BBS 程序为例，来给大家分析一下如何在 BBS 程序里实现分页显示功能，由于我们一般使用的 BBS 程序的数据库记录数和同时访问的人数都不会太多，所以以下程序实例是使用的先前所介绍的第一种分页显示方法。<br />　　 进行 ADO 存取数据库时的分页显示，其实就是对 Recordset 的记录进行操作。所以我们首先必须了解 Reordset 对象的属性和方法： <br />　　 BOF 属性：目前指标指到 RecordSet 的第一笔。 <br />　　 EOF 属性：目前指标指到 RecordSet 的最后一笔。 <br />　　 Move 方法：移动指标到 RecordSet 中的某一条记录。 <br />　　 AbsolutePage 属性：设定当前记录的位置是位于哪一页 AbsolutePosition 属性：目前指标在 RecordSet 中的位置。 <br />　　 PageCount 属性：显示 Recordset 对象包括多少“页”的数据。 <br />　　 PageSize 属性：显示 Recordset 对象每一页显示的记录数。 <br />　　 RecordCount 属性：显示 Recordset 对象记录的总数。 <br />　　 下面让我们来详细认识一下这些重要的属性和方法 <br />　　 一、 BOF 与 EOF 属性 <br />　　 通常我们在 ASP 程序中编写代码来检验 BOF 与 EOF 属性，从而得知目前指标所指向的 RecordSet 的位置，使用 BOF 与 EOF 属性，可以得知一个 Recordset 对象是否包含有记录或者得知移动记录行是否已经超出该 Recordset 对象的范围。 <br />　　 如： <br />[url=mailto:$#@60]$#@60[/url]<br />; % if not rs.eof then ... <br />[url=mailto:%$#@62]%$#@62[/url]<br />; <br />　　 <br />[url=mailto:$#@60]$#@60[/url]<br />; % if not (rs.bof and rs.eof) <br />[url=mailto:%$#@62]%$#@62[/url]<br />; <br />　　若当前记录的位置是在一个 Recordset 对象第一行记录之前时， BOF 属性返回 true，反之则返回 false。 <br />　　若当前记录的位置是在一个 Recordset 对象最后一行记录之后时， EOF 属性返回 true，反之则返回 false。 <br />　　BOF 与 EOF 都为 False：表示指标位于 RecordSet 的当中。 <br />　　BOF 为 True：目前指标指到 RecordSet 的第一笔记录。 EOF 为 True：目前指标指到 RecordSet 的最后一笔记录。 <br />　　BOF 与 EOF 都为 True：在 RecordSet 里没有任何记录。 <br />　　二、 Move 方法 <br />　　您可以用 Move 方法移动指标到 RecordSet 中的某一笔记录，语法如下： <br />　　rs.Move NumRecords,Start <br />　　这里的“rs”为一个对象变量，表示一个想要移动当当前记录位置的 Recordset 对象；“NumRecords”是一个正负数运算式，设定当前记录位置的移动数目；“start”是一个可选的项目，用来指定记录起始的标签。 <br />　　 所有的 Recordset 对象都支持 Move 方法，如果 NumRecords 参数大于零，当前记录位置向末尾的方向移动；如果其小于零，则当前记录位置向开头的方向移动；如果一个空的 Recordset 对象调用 Move 方法，将会产生一个错误。 <br />　　 MoveFirst 方法：将当前记录位置移至第一笔记录。 <br />　　 MoveLast 方法：将当前记录位置移至最后一笔记录。 <br />　　 MoveNext 方法：将当前记录位置移至下一笔记录。 MovePrevious 方法：将当前记录位置移至上一笔记录。 <br />　　 Move [n] 方法：移动指标到第 n 笔记录， n 由 0 算起。 <br />　　三、 AbsolutePage 属性 <br />　　AbsolutePage 属性设定当前记录的位置是位于哪一页的页数编号；使用 PageSize 属性将 Recordset 对象分割为逻辑上的页数，每一页的记录数为 PageSize( 除了最后一页可能会有少于 PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性，因此使用时要小心。 <br />　　与 AbsolutePosition 属性相同， AbsolutePage 属性是以 1 为起始的，若当前记录为 Recordset 的第一行记录， AbsolutePage 为 1。可以设定 AbsolutePage 属性，以移动到一个指定页的第一行记录位置。 <br />　　四、 AbsolutePosition 属性 <br />　　若您需要确定目前指标在 RecordSet 中的位置，您可以用 AbsolutePosition 属性。 <br />　　AbsolutePosition 属性的数值为目前指标相对於第一笔的位置，由 1 算起，即第一笔的 AbsolutePosition 为 1。 <br />　　注意 , 在存取 RecordSet 时，无法保证 RecordSet 每次都以同样的顺序出现。 <br />　　若要启用 AbsolutePosition，必须先设定为使用用户端 cursor( 指针 )， asp 码如下： <br />　　rs2.CursorLocation = 3 <br />　　五、 PageCount 属性 <br />　　使用 PageCount 属性，决定 Recordset 对象包括多少“页”的数据。这里的“页”是数据记录的集合，大小等于 PageSize 属性的设定，即使最后一页的记录数比 PageSize 的值少，最后一页也算是 PageCount 的一页。必须注意也并不是所有的数据提供者都支持此项属性。 <br />　　六、 PageSize 属性 <br />　　PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键，使用它就可以决定多少记录组成一个逻辑上的“一页”。设定并建立一个页的大小，从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。 <br />　　七、 RecordCount 属性 <br />　　这也是一个非常常用和重要的属性，我们常用 RecordCount 属性来找出一个 Recordset 对象包括多少条记录。如： <br />[url=mailto:$#@60]$#@60[/url]<br />; % totle=RS.RecordCount <br />[url=mailto:%$#@62]%$#@62[/url]<br />; <br />　　在了解了 Recordset 对象的以上属性和方法后，我们来考虑一下，如何运用它们来达到我们分页显示的目的。首先，我们可以为 PageSize 属性设置一个值，从而指定从记录组中取出的构成一个页的行数；然后通过 RecordCount 属性来确定记录的总数；再用记录总数除以 PageSize 就可得到所显示的页面总数；最后通过 AbsolutePage 属性就能完成对指定页的访问。好象很并不复杂呀，下面让我们来看看程序该如何实现呢？<br />　　我们建立这样一个简单的 BBS 应用程序，它的数据库中分别有以下五个字段：“ID”，每个帖子的自动编号；“subject”，每个帖子的主题；“name”，加帖用户的姓名；“email”，用户的电子邮件地址；“postdate”，加帖的时间。数据库的 DSN 为“bbs”。我们将显示帖子分页的所有步骤放在一个名为“ShowList()”的过程中，方便调用。程序如下： <br />----BBS 显示帖子分页----<br />[url=mailto:$#@60]$#@60[/url]<br />; % Sub ShowList() <br />[url=mailto:%$#@62]%$#@62[/url]<br />;<br />[url=mailto:$#@60]$#@60[/url]<br />; %<br />PgSz=20 设定开关，指定每一页所显示的帖子数目，默认为20帖一页<br />Set Conn = Server.CreateObject("ADODB.Connection")<br />Set RS = Server.CreateObject("ADODB.RecordSet")<br />sql = "SELECT * FROM message order by ID DESC"<br />查询所有帖子，并按帖子的ID倒序排列<br />Conn.Open "bbs"<br />RS.open sql,Conn,1,1<br />If RS.RecordCount=0 then<br />response.write "<br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:P$#@62;$#@60]P$#@62;$#@60[/url]<br />; <br />[url=mailto:center$#@62]center$#@62[/url]<br />;对不起，数据库中没有相关信息！<br />[url=mailto:$#@60]$#@60[/url]<br />; /center$#@62;$#@60; /P$#@62;"<br />else<br />RS.PageSize = Cint(PgSz) 设定PageSize属性的值<br />Total=INT(RS.recordcount / PgSz * -1)*-1 计算可显示页面的总数<br />PageNo=Request("pageno")<br />if PageNo="" Then<br />PageNo = 1<br />else<br />PageNo=PageNo+1<br />PageNo=PageNo-1<br />end if<br />ScrollAction = Request("ScrollAction")<br />if ScrollAction = " 上一页 " Then<br />PageNo=PageNo-1<br />end if<br />if ScrollAction = " 下一页 " Then<br />PageNo=PageNo+1<br />end if<br />if PageNo <br />[url=mailto:$#@60]$#@60[/url]<br />; 1 Then <br />PageNo = 1<br />end if<br />n=1<br />RS.AbsolutePage = PageNo<br />Response.Write "<br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:CENTER$#@62]CENTER$#@62[/url]<br />;"<br />position=RS.PageSize*PageNo<br />pagebegin=position-RS.PageSize+1<br />if position <br />[url=mailto:$#@60]$#@60[/url]<br />; RS.RecordCount then<br />pagend=position<br />else <br />pagend= RS.RecordCount<br />end if <br />Response.Write "<br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:P$#@62;$#@60]P$#@62;$#@60[/url]<br />; font <br />[url=mailto:color=Navy$#@62;$#@60]color=Navy$#@62;$#@60[/url]<br />; <br />[url=mailto:B$#@62]B$#@62[/url]<br />;数据库查询结果:$#@60; /B$#@62;"<br />Response.Write "(共有"&amp;RS.RecordCount &amp;"条符合条件的信息,显示"&amp;pagebegin&amp;"-"&amp;pagend&amp;")$#@60; /font$#@62;$#@60; /p$#@62;"<br />Response.Write "<br />[url=mailto:$#@60]$#@60[/url]<br />; TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 <br />[url=mailto:BGCOLOR=#FFFFFF$#@62]BGCOLOR=#FFFFFF$#@62[/url]<br />;"<br />Response.Write "<br />[url=mailto:$#@60]$#@60[/url]<br />; TR <br />[url=mailto:BGCOLOR=#5FB5E2$#@62;$#@60]BGCOLOR=#5FB5E2$#@62;$#@60[/url]<br />; FONT <br />[url=mailto:SIZE=2$#@62;$#@60]SIZE=2$#@62;$#@60[/url]<br />; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; <br />[url=mailto:B$#@62]B$#@62[/url]<br />;主题<br />[url=mailto:$#@60]$#@60[/url]<br />; /B$#@62;$#@60; /TD$#@62;$#@60; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; <br />[url=mailto:B$#@62]B$#@62[/url]<br />;用户<br />[url=mailto:$#@60]$#@60[/url]<br />; /B$#@62;$#@60; /TD$#@62;$#@60; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; <br />[url=mailto:B$#@62;Email$#@60]B$#@62;Email$#@60[/url]<br />; /B$#@62;$#@60; /TD$#@62;$#@60; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; <br />[url=mailto:B$#@62]B$#@62[/url]<br />;发布日期<br />[url=mailto:$#@60]$#@60[/url]<br />; /B$#@62;$#@60; /TD$#@62;$#@60; /FONT$#@62;$#@60; TR <br />[url=mailto:BGCOLOR=#FFFFFF$#@62]BGCOLOR=#FFFFFF$#@62[/url]<br />;"<br />Do while not (RS is nothing) <br />RowCount = RS.PageSize<br />Do While Not RS.EOF and rowcount <br />[url=mailto:$#@62]$#@62[/url]<br />; 0 <br />If n=1 then<br />Response.Write "<br />[url=mailto:$#@60]$#@60[/url]<br />; TR <br />[url=mailto:BGCOLOR=#FFFFFF$#@62]BGCOLOR=#FFFFFF$#@62[/url]<br />;"<br />ELSE<br />Response.Write "<br />[url=mailto:$#@60]$#@60[/url]<br />; TR <br />[url=mailto:BGCOLOR=#EEEEEE$#@62]BGCOLOR=#EEEEEE$#@62[/url]<br />;"<br />End If<br />n=1-n <br />[url=mailto:%$#@62]%$#@62[/url]<br />;<br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; span style="font-size:9pt"<br />[url=mailto:$#@62;$#@60]$#@62;$#@60[/url]<br />; A <br />[url=view.asp?key=$#@60]href=view.asp?key=$#@60[/url]<br />; % =RS("ID")%$#@62;$#@62;$#@60; % =RS("subject")%$#@62;$#@60; /A$#@62;$#@60; /span$#@62;$#@60; /td$#@62; <br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; span style="font-size:9pt"<br />[url=mailto:$#@62;$#@60]$#@62;$#@60[/url]<br />; % =RS("name")%$#@62;$#@60; /A$#@62;$#@60; /span$#@62;$#@60; /td$#@62; <br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; span style="font-size:9pt"<br />[url=mailto:$#@62;$#@60]$#@62;$#@60[/url]<br />; a href="<br />[url=mailto:$#@60]mailto:$#@60[/url]<br />; % =RS("email")%$#@62;"<br />[url=mailto:$#@62;$#@60]$#@62;$#@60[/url]<br />; % =RS("email")%$#@62;$#@60; /a$#@62;$#@60; /span$#@62; <br />[url=mailto:$#@60]$#@60[/url]<br />; /TD$#@62;<br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:TD$#@62;$#@60]TD$#@62;$#@60[/url]<br />; span style="font-size:9pt"<br />[url=mailto:$#@62;$#@60]$#@62;$#@60[/url]<br />; % =RS("postdate")%$#@62;$#@60; /span$#@62; <br />[url=mailto:$#@60]$#@60[/url]<br />; /td$#@62;<br />[url=mailto:$#@60]$#@60[/url]<br />; /TR$#@62;<br />[url=mailto:$#@60]$#@60[/url]<br />; %<br />RowCount = RowCount - 1<br />RS.MoveNext<br />Loop<br />set RS = RS.NextRecordSet<br />Loop<br />Conn.Close<br />set rs = nothing<br />set Conn = nothing<br />[url=mailto:%$#@62]%$#@62[/url]<br />;<br />[url=mailto:$#@60]$#@60[/url]<br />; /TABLE$#@62;<br />[url=mailto:$#@60]$#@60[/url]<br />; FORM METHOD=GET ACTION="list.asp"<br />[url=mailto:$#@62]$#@62[/url]<br />;<br />[url=mailto:$#@60]$#@60[/url]<br />; INPUT TYPE="HIDDEN" NAME="pageno" VALUE="<br />[url=mailto:$#@60]$#@60[/url]<br />; % =PageNo <br />[url='mailto:%$#@62;]%$#@62;"$#@62[/url]<br />;<br />[url=mailto:$#@60]$#@60[/url]<br />; % <br />if PageNo <br />[url=mailto:$#@62]$#@62[/url]<br />; 1 Then <br />response.write "<br />[url=mailto:$#@60]$#@60[/url]<br />; INPUT TYPE=SUBMIT NAME=ScrollAction VALUE= 上一页 <br />[url=mailto:$#@62]$#@62[/url]<br />;"<br />end if <br />if RowCount = 0 and PageNo <br />[url=mailto:$#@60]$#@60[/url]<br />; <br />[url=mailto:$#@62;Total]$#@62;Total[/url]<br />then <br />response.write "<br />[url=mailto:$#@60]$#@60[/url]<br />; INPUT TYPE=SUBMIT NAME=ScrollAction VALUE= 下一页 <br />[url=mailto:$#@62]$#@62[/url]<br />;"<br />end if <br />response.write "<br />[url=mailto:$#@60]$#@60[/url]<br />; /FORM$#@62;"<br />End if<br />[url=mailto:%$#@62]%$#@62[/url]<br />;<br />[url=mailto:$#@60]$#@60[/url]<br />; % End Sub <br />[url=mailto:%$#@62]%$#@62[/url]<br />;<br />　　相信大家都应该能完全读懂上面的程序，因此作者就不在此详细解释了。值得注意的是在这段程序中运用了一个小技巧 <br />[url=mailto:$#@60]$#@60[/url]<br />; INPUT TYPE="HIDDEN" NAME="pageno" VALUE="<br />[url=mailto:$#@60]$#@60[/url]<br />; % =PageNo <br />[url='mailto:%$#@62;]%$#@62;"$#@62[/url]<br />;，这是用来在每次调用该 ASP 文件时传递数据的“暗道”，由于我们需要在每次调用程序时传递代表当前页码的参数，可能大家会想到使用 session，但是从节省系统资源和通用性来讲，用这样一个隐藏的 form 来传递数据将会达到更好的效果。<br />　　好了，又到了说再见的时候了，如果你没完全看懂本篇中所列的程序，那你必须加把油，看一看 VbScript 的语法；如果你还有某些疑问，可以“妹儿”我，我将尽力解答；如果你有什么更好的建议也千万要来信告诉我哦 :)<br /><br /><br /><span class="bold">第七课.用纯ASP代码实现图片上传并存入数据库中</span><br /><br /><div style="FONT-SIZE: 11px">用ＡＳＰ编写网站应用程序时间长了，难免会遇到各式各样的问题，其中<br />　　关于如何上传文件到服务器恐怕是遇见最多的问题了，尤其是上传图片，比如你想要在自己的社区里面实现类似网易虚拟社区提供的“每日一星”的功能，就要提供给网友上传照片的功能。上传图片文件到服务器可以使用各种免费的文件上传组件，使用起来功能虽然很强大，但是由于很多情况下，我们只能使用免费的支持ＡＳＰ的空间或者租用别人的虚拟空间，对于第一种情况，我们根本就没有可能来使用文件上传组件；至于第二种情况，我们也要付出不少的“银子”才可以。除非你拥有自己的虚拟主机，你就可以随便的在服务器上面安装自己所需要的组件，这种情况对于大多数人来说是可望而不可及的。那我们就没有办法了吗？呵呵，答案是肯定的（当然是肯定的了，要不然我也没法写出这篇文章啊）。下面就让我们一起来使用纯ＡＳＰ代码来实现图片的上传以及保存到数据库的功能（顺便也实现显示数据库中的图片到网页上的功能）。<br />　　首先我们先来熟悉一下将要使用的对象方法。我们用来获取上一个页面传递过来的数据一般是使用Request对象。同样的，我们也可以使用Request对象来获取上传上来的文件数据，使用的方法是Request.BinaryRead()。而我们要从数据库中读出来图片的数据显示到网页上面要用到的方法是：<br />　　Request.BinaryWrite()。在我们得到了图片的数据，要保存到数据库中的时候，不可以直接使用Insert语句对数据库进行操作，而是要使用ADO的AppendChunk方法，同样的，读出数据库中的图片数据，要使用GetChunk方法。各个方法的具体语法如下：<br />* Request.BinaryRead语法：<br />variant = Request.BinaryRead(count)<br />参数<br />variant<br />返回值保存着从客户端读取到数据。<br />count<br />指明要从客户端读取的数据量大小，这个值小于或者等于使用方法<br />Request.TotalBytes得到的数据量。<br />* Request.BinaryWrite语法：<br />Request.BinaryWrite data<br />参数<br />data<br />要写入到客户端浏览器中的数据包。<br />* Request.TotalBytes语法：<br />variant = Request.TotalBytes<br />参数<br />variant<br />返回从客户端读取到数据量的字节数。<br />* AppendChunk语法<br />将数据追加到大型文本、二进制数据 Field 或 Parameter 对? <br />object.AppendChunk Data<br />参数<br />object Field 或 Parameter 对象<br />Data 变体型，包含追加到对象中的数据。<br />说明<br />　　使用 Field 或 Parameter 对象的 AppendChunk 方法可将长二进制或字符数据填写到对象中。在系统内存有限的情况下，可以使用 AppendChunk 方法对长整型值进行部分而非全部的操作。<br />* GetChunk语法<br />返回大型文本或二进制数据 Field 对象的全部或部分内容 。<br />variable = field.GetChunk( Size )<br />返回值<br />返回变体型。<br />参数<br />Size 长整型表达式，等于所要检索的字节或字符数。<br />说明<br />　　使用 Field 对象的 GetChunk 方法检索其部分或全部长二进制或字符数据。在系统内存有限的情况下，可使用 GetChunk 方法处理部分而非全部的长整型值。<br />GetChunk 调用返回的数据将赋给“变量”。如果 Size 大于剩余的数据，则<br />GetChunk 仅返回剩余的数据而无需用空白填充“变量”。如果字段为空，则<br />GetChunk 方法返回 Null。<br />　　每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数据。但是，如果从一个字段检索数据然后在当前记录中设置或读取另一个字段的值，ADO 将认为已从第一个字段中检索出数据。如果在第一个字段上再次调用 GetChunk 方法，ADO 将把调用解释为新的 GetChunk 操作并从记录的起始处开始读取。如果其他 Recordset 对象不是首个 Recordset 对象的副本，则访问其中的字段不会破坏 GetChunk 操作。如果 Field 对象的 Attributes 属性中的 adFldLong 位设置为 True，则可以对该字段使用 GetChunk 方法。如果在 Field 对象上使用 Getchunk 方法时没有当前记录，将产生错误 3021（无当前记录）。接下来，我们就要来设计我们的数据库了，作为测试我们的数据库结构如下（Ａｃｃｅｓｓ９７）：<br />字段名称　　　　类型　　　　描述<br />　　id 　　　自动编号　　　主键值<br />img OLE对象　　　用来保存图片数据　<br />对于在MS SQL Server7中，对应的结构如下：<br />字段名称　　　　类型　　　　描述<br />　　id 　　　　int(Identity)　主键值<br />img 　　image　　　 　用来保存图片数据　<br />　　现在开始正式编写我们的纯ＡＳＰ代码上传部分了，首先，我们有一个提供给用户的上传界面，可以让用户选择要上传的图片。代码如下<br /><font face="新宋体">（upload.htm）：<br />$#@60;html$#@62;<br />$#@60;body$#@62;<br />$#@60;center$#@62;<br />　　 $#@60;form name="mainForm" enctype="multipart/form-data"<br />action="process.asp" method=post$#@62;<br />　　　　$#@60;input type=file name=mefile$#@62;$#@60;br$#@62;<br />　　 $#@60;input type=submit name=ok value="OK"$#@62;<br />　　 $#@60;/form$#@62;<br />$#@60;/center$#@62;<br />$#@60;/body$#@62;<br />$#@60;/html$#@62;<br /></font><br />　　注意代码中黑色斜体的部分，一定要在Form中有这个属性，否则，将无法得到上传上来的数据。<br />　　接下来，我们要在process.asp中对从浏览器中获取的数据进行必要的处理，因为我们在process.asp中获取到的数据不仅仅包含了我们想要的上传上来的图片的数据，也包含了其他的无用的信息，我们需要剔除冗余数据，并将处理过的图片数据保存到数据库中，这里我们以Ａｃｃｅｓｓ９７为例。具体代码如下（process.asp）：<br /><font face="新宋体">$#@60;%<br />response.buffer=true<br />formsize=request.totalbytes<br />formdata=request.binaryread(formsize)<br />bncrlf=chrB(13) &amp; chrB(10)<br />divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1)<br />datastart=instrb(formdata,bncrlf &amp; bncrlf)+4<br />dataend=instrb(datastart+1,formdata,divider)-datastart<br />mydata=midb(formdata,datastart,dataend)<br />set connGraph=server.CreateObject("ADODB.connection")<br />connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" &amp;<br />server.MapPath("images.mdb") &amp; ";uid=;PWD=;"<br />connGraph.Open<br />set rec=server.createobject("ADODB.recordset")<br />rec.Open "SELECT * FROM [images] where id is null",connGraph,1,3<br />rec.addnew<br />rec("img").appendchunk mydata<br />rec.update<br />rec.close<br />set rec=nothing<br />set connGraph=nothing<br />%$#@62;<br /></font><br />　　好了，这下我们就把上传来的图片保存到了名为images.mdb的数据库中了，剩下的工作就是要将数据库中的图片数据显示到网页上面了。一般在ＨＴＭＬ中，显示图片都是使用$#@60;IMG$#@62;标签，也就是$#@60;IMG SRC="图片路径"$#@62;，但是我们的图片是保存到了数据库中，“图片路径”是什么呢？呵呵，其实这个SRC属性除了指定路径外，也可以这样使用哦：<br /><font face="新宋体">$#@60;IMG SRC="showimg.asp?id=xxx"$#@62;<br /></font><br />　　所以，我们所要做的就是在showimg.asp中从数据库中读出来符合条件的数据，并返回到SRC属性中就可以了，具体代码如下（showimg.asp）：<br /><font face="新宋体">$#@60;%<br />set connGraph=server.CreateObject("ADODB.connection")<br />connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" &amp;<br />server.MapPath("images.mdb") &amp; ";uid=;PWD=;"<br />connGraph.Open<br />set rec=server.createobject("ADODB.recordset")<br />strsql="select img from images where id=" &amp; trim(request("id"))<br />rec.open strsql,connGraph,1,1<br />Response.ContentType = "image/*"<br />Response.BinaryWrite rec("img").getChunk(7500000)<br />rec.close<br />set rec=nothing<br />set connGraph=nothing<br />%$#@62;<br /></font><br />　　注意在输出到浏览器之前一定要指定Response.ContentType = "image/*"，以便正常显示图片。<br />　　最后要注意的地方是，我的process.asp中作的处理没有考虑到第一页(upload.htm)中还有其他数据，比如$#@60;INPUT type=tesxt name=userid$#@62;等等，如果有这些项目，你的process.asp就要注意处理掉不必要的数据。怎么样，其实上传图片并保存到数据库很简单吧，这样再也不用为自己的空间无法使用各类的上传组件发愁了吧。还等什么？赶快试一试吧。<br /><br /><span class="bold">第八课.ASP进阶教程Ⅷ：数据库版本的留言簿</span><br /><br /><div style="FONT-SIZE: 11px">在前面我们介绍了文件版本的留言簿，现在我们不妨来设想一下：如果留言文件里面的留言很多，而你又急于想寻找其中的某条留言时，这时打开txt留言文件，对着一段段的留言记录，你敢担保你不会当场晕倒吗？而且文件留言簿最令人讨厌还远不只是这个原因，更气人的是：譬如你已经找到了你要找的留言，而且是非要将其删除不可（当然是因为那段留言竟毫不留情地往你脸上抹黑的缘由啦），那么此时其余想对你大发赞赏之言的朋友，就会因为你正在做留言删除的操作而不能留言了。看，这有多可惜！不过，你也无须叹气，虽然留言文件不能供多人共用，但是改成数据库来管理留言记录，当你在做删除留言的期间，访问者的留言还是可以加进来的。既然数据库留言簿能对你的系统如此照顾入微，我们现在就事不宜迟，立即来揭开她的庐山真面目。<br />至于如何建立自已的数据库版本的留言簿，我们还是通过分步骤的方法来说明吧。要编写一个数据库版本的留言簿，我们大致可以从以下三个步骤来完成。<br /><b>步骤一：使用Access先建立用来存放留言的数据表。</b>（当然，如果你想使你的数据库能很好地工作在高需求、高质量的Web应用程序的客户-服务器数据库，而且无论是在性能还是在可靠性上都能经受得起严格的考验，那么你最好是用服务器等级的数据库，如：SQL server、Oracle等。对于非服务器等级的数据库，我推荐使用Access中文版来建立。凡是用Access来建立的数据表，都是以.mdb为后缀名，如：book0.mdb。)<br />Access的界面非常友好，操作也非常简便，相信聪明的读者们，即使以往从未用过Access的，只要动手试试，也定能很快对其驽驾自如，所以我在这里也就不再赘述（当然也不排除有那么几分懒惰的成份）。<br /><b>步骤二：设计一个留言表单的网页也同样是不可或缺的。</b>（如：guestbook0.htm)。 <br /><b>步骤三：又到编写处理留言的ASP程序了。</b>（我们可以将下述代码COPY下来，然后另存为manage0a.asp文件。）<br /><font face="新宋体">$#@60; !--#include file="adovbs.inc" --$#@62; <br /></font><br />调用adovbs.inc文件，所谓inc 文件顾名思义是include file的意思,adovbs.inc是IIS/PWS所提供的文件，存放着ADO相关常数的定义，使用inc文件可以使我们的程序，增加可读性，更易于开发和维护。<br /><font face="新宋体">$#@60; % Function SqlStr( data ) <br />SqlStr = "" &amp; Replace( data ", "" ) &amp; "" <br />End Function <br /></font><br />这里用了SqlStr函数，其作用是将数据中的一个单引号改成两个单引号，并且在前后加上单引号。之所以要用该函数是由于上网者输入的数据必须以用单引号括起来的形式输入的数据与Insert Into命令组合在一起，但是如果用户输入的数据含有单引号，则输入的数据将会产生错误，因此输入的数据必须经过SqlStr的切换（将单引号切换成两个单引号）才是正确的。<br /><font face="新宋体">Name = Request("Name") <br />Tel=Request("Tel") <br />Email = Request("Email") <br />Subject = Request("Subject") <br />Memo = Request("Memo")<br /></font><br />从留言表单取得数据 <br /><font face="新宋体">If Name = "" Or Tel="" Or Email = "" Or Subject = "" Or Memo = "" Then Response.Write "输入框不能为空白!" <br />Response.End <br />End If<br /></font><br />检查表单的各输入框是否有信息输入，若留有空输入框没填则显示说明信息："输入框不能为空白!" 并停止执行下面的程序。 <br /><font face="新宋体">Set conn = Server.CreateObject("ADODB.Connection") <br /></font><br />用Server.CreateObject取得对象ADODB.Connection。因为在ASP中，如果要访问数据必须首先创建与数据库的链接，因此建立连接是存取Web数据库不可缺少的步骤，执行以上语句之后，conn便是一个Connection对象。<br /><font face="新宋体">DBPath = Server.MapPath("book0.mdb") <br /></font><br />通过调用服务器对象的MapPath方法来获取book0.mdb的完整路径。 <br /><font face="新宋体">conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" &amp; DBPath<br /></font><br />因为我们想打开的是Access(.mdb)数据库，所以我们要透过Access的ODBC驱动程序{Microsoft Access Driver (*.mdb)}来存取数据库，dbp参数则是用来指定想打开的数据库文件，因为它必须是完整路径名称，所以我们上一语句用了Server.MapPath 函数 。<br /><font face="新宋体">Name = Left( Name, 40 ) <br />Tel = Left(Tel,10) <br />Email = Left( Email, 80 ) <br />Subject = Left( Subject, 127 )<br /></font><br />截短输入到各字段里数据的长度，以避免因输入到某一字段中的数据超长而引发的错误，当然假如我们将数据库book0.mdb中的各字段的数据类型都有设为“备注”，我们则再无需担心上网者所输入的数据有多长。 <br /><font face="新宋体">sql = "Insert Into GuestBook (姓名, 电话, Email, 主题, 留言) Values( " <br />sql = sql &amp; SqlStr(Name) &amp; ", " <br />sql = sql &amp; SqlStr(Tel) &amp; ", " <br />sql = sql &amp; SqlStr(Email) &amp; ", " <br />sql = sql &amp; SqlStr(Subject) &amp; ", " <br />sql = sql &amp; SqlStr(Memo) &amp; ")"<br /></font><br />在"guestbook"数据表中增加一个数据记录，然后把其中的各字段 (姓名, 电话, Email, 主题, 留言)分别设置成从留言表单上取下的对应的数据。<br />conn.Execute sql<br />执行sql指令。 <br />%$#@62;<br /><br /><table class="t_msg" cellspacing="0" cellpadding="4" border="0"><tbody><tr><td class="line" style="PADDING-TOP: 10px" valign="top" height="100%"><a title="评分 0" href="http://bbs.hackbase.com/misc.php?action=viewratings&amp;tid=3047439&amp;pid=4069159" name="pid4069159"></a><span class="bold">第九课.ASP＋Access的安全隐患及对策</span><br /><br /><div style="FONT-SIZE: 11px">随着Internet的发展，Web技术日新月异。继通用网关接口（CGI）之后，“ASP”(Active Server Pages)作为一种典型的服务器端网页设计技术，被广泛地应用在网上银行、电子商务、搜索引擎等各种互联网应用中。同时Access数据库作为微软推出的以标准JET为引擎的桌面型数据库系统，由于具有操作简单、界面友好等特点，具有较大的用户群体。因此ASP＋Access成为许多中小型网上应用系统的首选方案。但ASP＋Access解决方案在为我们带来便捷的同时，也带来了不容忽视的安全问题。 <br />ASP＋Access的安全隐患ASP＋Access解决方案的主要安全隐患来自Access数据库的安全性，其次在于ASP网页设计过程中的安全漏洞。 <br />1.Access数据库的存储隐患 <br />在ASP＋Access应用系统中，如果获得或者猜到Access数据库的存储路径和数据库名，则该数据库就可以被下载到本地。例如：对于网上书店的Access数据库，人们一般命名为book.mdb、store.mdb等，而存储的路径一般为“URL/database”或干脆放在根目录（“URL/”）下。这样，只要在浏览器地址栏中敲入地址：“URL/database/store.mdb”，就可以轻易地把store.mdb下载到本地的机器中。 <br />2.Access数据库的解密隐患 <br />由于Access数据库的加密机制非常简单，所以即使数据库设置了密码，解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥进行异或来形成一个加密串，并将其存储在＊.mdb文件中从地址“＆H42”开始的区域内。由于异或操作的特点是“经过两次异或就恢复原值”，因此，用这一密钥与＊.mdb文件中的加密串进行第二次异或操作，就可以轻松地得到Access数据库的密码。基于这种原理，可以很容易地编制出解密程序。 <br />由此可见，无论是否设置了数据库密码，只要数据库被下载，其信息就没有任何安全性可言了。 <br />3.源代码的安全隐患 <br />由于ASP程序采用的是非编译性语言，这大大降低了程序源代码的安全性。任何人只要进入站点，就可以获得源代码，从而造成ASP应用程序源代码的泄露。 <br />4.程序设计中的安全隐患 <br />ASP代码利用表单（form）实现与用户交互的功能，而相应的内容会反映在浏览器的地址栏中，如果不采用适当的安全措施，只要记下这些内容，就可以绕过验证直接进入某一页面。例如在浏览器中敲入“……page.asp?x=1”，即可不经过表单页面直接进入满足“x=1”条件的页面。因此，在设计验证或注册页面时，必须采取特殊措施来避免此类问题的发生。 <br />提高数据库的安全性由于Access数据库加密机制过于简单，因此，如何有效地防止Access数据库被下载,就成了提高ASP＋Access解决方案安全性的重中之重。 <br />1.非常规命名法 <br />防止数据库被找到的简便方法是为Access数据库文件起一个复杂的非常规名字，并把它存放在多层目录下。例如，对于网上书店的数据库文件，不要简单地命名为“book.mdb”或“store.mdb”，而是要起个非常规的名字，例如： <br />faq19jhsvzbal.mdb，再把它放在如./akkjj16t/kjhgb661/acd/avccx55 之类的深层目录下。这样，对于一些通过猜的方式得到Access数据库文件名的非法访问方法起到了有效的阻止作用。 <br />2.使用ODBC数据源 <br />在ASP程序设计中，应尽量使用ODBC数据源，不要把数据库名直接写在程序中，否则，数据库名将随ASP源代码的失密而一同失密。例如： DBPath = Server.MapPath(“./akkjj16t/ <br />kjhgb661/acd/avccx55/faq19jhsvzbal.mdb ”) <br />conn.Open “driver={Microsoft Access Driver (＊.mdb)};dbq=” ＆ DBPath 可见，即使数据库名字起得再怪异，隐藏的目录再深，ASP源代码失密后，数据库也很容易被下载下来。如果使用ODBC数据源，就不会存在这样的问题了： <br />conn.open “ODBC－DSN名” <br />对ASP页面进行加密为有效地防止ASP源代码泄露，可以对ASP页面进行加密。一般有两种方法对ASP页面进行加密。一种是使用组件技术将编程逻辑封装入DLL之中；另一种是使用微软的Script Encoder对ASP页面进行加密。笔者认为，使用组件技术存在的主要问题是每段代码均需组件化，操作比较烦琐，工作量较大；而使用Script Encoder对ASP页面进行加密，操作简单、收效良好。 <br />Script Encoder方法具有许多优点： <br />1.HTML仍具有很好的可编辑性。Script Encoder只加密在HTML页面中嵌入的ASP代码，其他部分仍保持不变，这就使得我们仍然可以使用FrontPage或Dreamweaver等常用网页编辑工具对HTML部分进行修改、完善，只是不能对ASP加密部分进行修改，否则将导致文件失效。 <br />2.操作简单。只要掌握几个命令行参数即可。Script Encoder的运行程序是screnc.exe，其使用方法如下： <br />screnc [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputfile <br />其中的参数含义如下： <br />s：屏蔽屏幕输出； <br />f：指定输出文件是否覆盖同名输入文件； <br />xl：是否在.asp文件的顶部添加@Language指令； <br />l：defLanguag指定缺省的脚本语言； <br />e：defExtension 指定待加密文件的扩展名。 <br />3.可以批量加密文件。使用Script Encoder可以对当前目录中的所有的ASP 文件进行加密，并把加密后的文件统一输出到相应的目录中。例如： <br />screnc ＊.asp c:\temp <br />4. Script Encoder是免费软件。该加密软件可以从微软网站下载： <br /><a href="http://msdn.microsoft.com/scripting/vbscript/download/x86/sce10en.exe" target="_blank"><font color="#002c99">http://msdn.microsoft.com/script ... oad/x86/sce10en.exe</font></a>。下载后，运行安装即可。 <br />利用Session对象进行注册验证 <br />为防止未经注册的用户绕过注册界面直接进入应用系统，可以采用Session对象进行注册验证。Session对象最大的优点是可以把某用户的信息保留下来，让后续的网页读取。例如，要设计如图1所示的注册页面。 <br />设计要求用户注册成功后系统启动hrmis.asp?page=1页面。如果不采用Session对象进行注册验证，则用户在浏览器中敲入“URL/hrmis.asp?page=1”即可绕过注册界面，直接进入系统。利用Session对象可以有效阻止这一情况的发生。相关的程序代码如下： <br />“hrmis” Or Password  <br />“password” Then <br />Response.Write “账号错误！” <br />Response.End <br />End If <br />'将Session 对象设置为通过验证状态 <br />Session(“Passed”) = True <br />％&gt; <br />进入应用程序后，首先进行验证：</div></td></tr><tr><td valign="bottom"><br /></td></tr></tbody></table></div></div></div></div>
<img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-16 20:57 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp提高篇</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24139.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Fri, 16 Mar 2007 12:55:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24139.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24139.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24139.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24139.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一课.全面解析Server对象						Server对象提供对服务器上访问的方法和属性.大多数方法和属性是作为实用程序的功能提供的。 　　语法:　　　Server.property|method　　属性（property）　　　Server对象只有一个属性：ScriptTimeout 程序能够运行的最大时间 　　方法（Methods）　　　CreateObject 建立一个对象实例...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24139.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-16 20:55 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP系列之基础入门</title><link>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24137.html</link><dc:creator>求勿求</dc:creator><author>求勿求</author><pubDate>Fri, 16 Mar 2007 12:50:00 GMT</pubDate><guid>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24137.html</guid><wfw:comment>http://www.cnitblog.com/qiuwuqiu/comments/24137.html</wfw:comment><comments>http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24137.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/qiuwuqiu/comments/commentRss/24137.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/qiuwuqiu/services/trackbacks/24137.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一课ASP入门与实例---IIS的安装与配置										1、运行环境与软件要求				Windows 2000 以上 （不包括Windows XP Home版）IIS 4.0 以上Microsoft Access 2000 Dreamweaver MX2、IIS的安装与配置a.安装IIS若操作系统中还未安装IIS服务器，可打开“控制面板”，然后单击启动 “添加/删除程...&nbsp;&nbsp;<a href='http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24137.html'>阅读全文</a><img src ="http://www.cnitblog.com/qiuwuqiu/aggbug/24137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/qiuwuqiu/" target="_blank">求勿求</a> 2007-03-16 20:50 <a href="http://www.cnitblog.com/qiuwuqiu/archive/2007/03/16/24137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>