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

<channel>
	<title>JohnZon 世界 &#187; ASP.NET</title>
	<atom:link href="http://www.johnzon.cn/category/computer-technology/asp-donet/feed" rel="self" type="application/rss+xml" />
	<link>http://www.johnzon.cn</link>
	<description>计算机技术 &#124; 生活随笔</description>
	<lastBuildDate>Wed, 23 Jun 2010 08:45:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Visual Studio 2008中文正式版下载和破解</title>
		<link>http://www.johnzon.cn/visual-studio-2008-crack-download.html</link>
		<comments>http://www.johnzon.cn/visual-studio-2008-crack-download.html#comments</comments>
		<pubDate>Mon, 23 Jun 2008 05:57:51 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[软件分享]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>
		<category><![CDATA[破解]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/visual-studio-2008-crack-download.html</guid>
		<description><![CDATA[Visual Studio 2008中文正式版官方下载地址:
下载压缩分卷：（7个分卷压缩包均需下载才能正常安装，包含MSDN。解压后是一个ISO文件，前面6个压缩包均为700M，最后一个压缩包为142M）
分卷1
分卷2
分卷3
分卷4
分卷5
分卷6
分卷7
Visual Studio 2008团队资源管理器：
http://download.microsoft.com/download/d/7/2/d72f8415-7b4b-4168-ba3b-65c3ca4c1f81/VS2008TeamExplorerCHS.iso
另附两个Visual Studio 2008非官方下载地址： 
alimama_pid="mm_10977757_1034654_4021114"; 
alimama_type="f";
alimama_sizecode ="tl_1x3_8"; 
alimama_fontsize=12; 
alimama_bordercolor="FFFFFF"; 
alimama_bgcolor="FFFFFF"; 
alimama_titlecolor="313131"; 
alimama_underline=0; 
alimama_height=23; 
alimama_width=308; 

 

首先声明这和MSDN上提供的90days-trial是不同的版本。电驴上已经有ZWT放出的VSTS2008了，下载中，目前还无法验证其真实性。另外还有一个BT下载的种子，同样是ZWT放出的这个版本，似乎连接数不多。之前公布的Visual Studio Team System 2008 正式版下载，确认是真货。
eMule下载：Visual.Studio.Team.System.2008-ZWTiSO
BT下载：Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.zip
把Visual Studio 2008九十天试用版本升级成正式版的办法：
第一种：
升级正式版的方法是把Setupsetup.sdb文件中的[Product Key](用UltraISO编辑），
由
T2CRQGDKBVW7KJR8C6CKXMW3D
修改为
PYHYPWXB3BB2CCMV9DX9VDY8T
因为九十天试用版本已经是 rtm版本。所以改变序列号以后的升级或者安装，就会变成正式版。不再有使用期限。
第二种：在开始&#62;设置&#62;控制面版&#62;添加或删除程序&#62;卸载Visual Studio 2008＞出现卸载界面＞点击Next＞输入上面CD-key -&#62;出现成功画面即可完美将试用版升级成为正式版。
Visual Studio 2008正式版序列号CDKEY：PYHYP-WXB3B-B2CCM-V9DX9-VDY8T
另附   Visual Studio 2008 SP1
Copyright © 2007-2009 JohnZon 世界去除昆山宽带认证客户端自动弹出网页发几个合并、分割、转换精品软件Visual Studio 2008 Service Pack 1 BETA发布Borland JBuilder 9企业版下载和破解Borland JBuilder 2005 企业版下载和破解Borland JBuilder [...]]]></description>
			<content:encoded><![CDATA[<p>Visual Studio 2008中文正式版官方下载地址:</p>
<p>下载压缩分卷：（7个分卷压缩包均需下载才能正常安装，包含MSDN。解压后是一个ISO文件，前面6个压缩包均为700M，最后一个压缩包为142M）<br />
<a href="http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part1.exe">分卷1</a><br />
<a href="http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part2.rar">分卷2</a><br />
<a href="http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part3.rar">分卷3</a><br />
<a href="http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part4.rar">分卷4</a><br />
<a href="http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part5.rar">分卷5</a><br />
<a href="http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part6.rar">分卷6</a><br />
<a href="http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part7.rar">分卷7</a><br />
Visual Studio 2008团队资源管理器：<br />
<a href="http://download.microsoft.com/download/d/7/2/d72f8415-7b4b-4168-ba3b-65c3ca4c1f81/VS2008TeamExplorerCHS.iso">http://download.microsoft.com/download/d/7/2/d72f8415-7b4b-4168-ba3b-65c3ca4c1f81/VS2008TeamExplorerCHS.iso</a></p>
<p>另附两个Visual Studio 2008非官方下载地址：<script type="text/JavaScript"> 
alimama_pid="mm_10977757_1034654_4021114"; 
alimama_type="f";
alimama_sizecode ="tl_1x3_8"; 
alimama_fontsize=12; 
alimama_bordercolor="FFFFFF"; 
alimama_bgcolor="FFFFFF"; 
alimama_titlecolor="313131"; 
alimama_underline=0; 
alimama_height=23; 
alimama_width=308; 
</script><br />
<script src="http://a.alimama.cn/inf.js" type="text/javascript"> 
</script><br />
<span id="more-97"></span>首先声明这和MSDN上提供的90days-trial是不同的版本。电驴上已经有ZWT放出的VSTS2008了，下载中，目前还无法验证其真实性。另外还有一个BT下载的种子，同样是ZWT放出的这个版本，似乎连接数不多。之前公布的Visual Studio Team System 2008 正式版下载，确认是真货。<br />
eMule下载：<a href="ed2k://%7Cfile%7CMicrosoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.iso%7C4112060416%7C7730FC9FFA4E1A1AB2A070C61BFD634B%7Ch=YDLIF7QGESBVMJNATFOZA47X4YLBLY6H%7C/">Visual.Studio.Team.System.2008-ZWTiSO</a></p>
<p>BT下载：<a href="http://www.cnblogs.com/Files/RobertLee/Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.zip">Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.zip</a><br />
<strong>把Visual Studio 2008九十天试用版本升级成正式版的办法：</strong><br />
第一种：<br />
升级正式版的方法是把Setupsetup.sdb文件中的[Product Key](用UltraISO编辑），<br />
由</p>
<blockquote><p>T2CRQGDKBVW7KJR8C6CKXMW3D</p></blockquote>
<p>修改为</p>
<blockquote><p>PYHYPWXB3BB2CCMV9DX9VDY8T</p></blockquote>
<p>因为九十天试用版本已经是 rtm版本。所以改变序列号以后的升级或者安装，就会变成正式版。不再有使用期限。</p>
<p>第二种：在开始&gt;设置&gt;控制面版&gt;添加或删除程序&gt;卸载Visual Studio 2008＞出现卸载界面＞点击Next＞输入上面CD-key -&gt;出现成功画面即可完美将试用版升级成为正式版。<br />
Visual Studio 2008正式版序列号CDKEY：PYHYP-WXB3B-B2CCM-V9DX9-VDY8T</p>
<p>另附   <a href="http://www.johnzon.cn/visual-studio-2008-sp1-release.html" title="Visual Studio 2008 SP1">Visual Studio 2008 SP1</a></p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/removed-broadband-authentication-client-pop-page-of-kunshan.html" title="去除昆山宽带认证客户端自动弹出网页">去除昆山宽带认证客户端自动弹出网页</a></li><li><a href="http://www.johnzon.cn/joiner-splitter-converter-software.html" title="发几个合并、分割、转换精品软件">发几个合并、分割、转换精品软件</a></li><li><a href="http://www.johnzon.cn/visual-studio-2008-sp1-release.html" title="Visual Studio 2008 Service Pack 1 BETA发布">Visual Studio 2008 Service Pack 1 BETA发布</a></li><li><a href="http://www.johnzon.cn/jbuilder9-crack-download.html" title="Borland JBuilder 9企业版下载和破解">Borland JBuilder 9企业版下载和破解</a></li><li><a href="http://www.johnzon.cn/jbuilder2005-crack-download.html" title="Borland JBuilder 2005 企业版下载和破解">Borland JBuilder 2005 企业版下载和破解</a></li><li><a href="http://www.johnzon.cn/jbuilder2006-crack-download.html" title="Borland JBuilder 2006 企业完整版下载和破解">Borland JBuilder 2006 企业完整版下载和破解</a></li><li><a href="http://www.johnzon.cn/jbuilder2007-crack-download.html" title="JBuilder2007下载与破解">JBuilder2007下载与破解</a></li><li><a href="http://www.johnzon.cn/powerdesigner-125-crack-download.html" title="power designer 12.5和破解补丁下载">power designer 12.5和破解补丁下载</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/visual-studio-2008-crack-download.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>剖析ASP.NET AJAX的面向对象思想</title>
		<link>http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html</link>
		<comments>http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html#comments</comments>
		<pubDate>Fri, 20 Jun 2008 14:23:25 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html</guid>
		<description><![CDATA[人们期待已久的ASP.NET AJAX v1.0正式版终于发布了。现在你能用Microsoft ASP.NET AJAX的javascript很容易的写出丰富的、交互式的web应用。尤其值得关注的是Microsoft AJAX Library增加了面向对象的支持，而以前javascript是不支持面向对象开发的。现在icrosoft AJAX Library能很好的支持类、名字空间、继承、接口、枚举、反射等特征。这些新增加的功能类似于.NET Framework，这使得开发ASP.NET AJAX应用变得容易维护，容易扩充。现在我们看看Microsoft AJAX Library是如何支持以上特征的。
1.类、成员和名字空间
在Microsoft AJAX Library中，所有的JavaScript类都继承自object(类似于.NET Framework库，都继承自object)，在ASP.NET AJAX应用中你可以运用面向对象的编程模式创建继承自Microsoft AJAX基类的对象和组件，类有四种成员：字段、属性、方法、事件。字段和属性是名/值对，用于描述一个类的一个实例的特性的。字段是由简单类型构成且可 直接访问，例如：
myClassInstance.name=&#8221;Fred&#8221;。
属性可以是任何简单类型或引用类型，通过get和set方法访问。在ASP.NET AJAX中，get和set是独立的函数，并规定在函数名中使用前缀&#8221;get_&#8221; 或 &#8220;set_&#8221; ，例如要获取或设置cancel属性的值时，你可以调用get_cancel或set_cancel方法。
一个方法是完成一个活动的函数而不是返回一个属性的值。属性和方法在下面的例子里都有示范。
事件指示特指的动作发生。当一个事件发生时，它可以调用一个或多个函数。事件所有者可以完成等待事件发生的任何任务。
名字空间是对关联类的逻辑分组。名字空间使你可以对公共功能进行分组。
为了使ASP.NET Web页面具有ASP.NET AJAX功能，你必须添加控件到页面上，当页面启动时，参照ASP.NET AJAX库的脚本自动产生。
下面的例子显示了页面使用了控件。
&#60; asp:ScriptManager runat=&#8221;server&#8221; ID=&#8221;scriptManager&#8221; /&#62;
下面的例子演示了如何使用Type.registerNamespace和.registerClass方法来把Person类增加到Demo名字空间中、创建类然后注册类。
Type.registerNamespace(&#8220;Demo&#8221;);
Demo.Person = function(firstName, lastName, emailAddress) {
this._firstName = firstName;
this._lastName = lastName;
this._emailAddress = emailAddress;
}
Demo.Person.prototype = {
getFirstName: function() {
return this._firstName;
},
getLastName: function() {
return this._lastName;
},
getName: function() {
return this._firstName + &#8216; &#8216; [...]]]></description>
			<content:encoded><![CDATA[<p>人们期待已久的ASP.NET AJAX v1.0正式版终于发布了。现在你能用Microsoft ASP.NET AJAX的javascript很容易的写出丰富的、交互式的web应用。尤其值得关注的是Microsoft AJAX Library增加了面向对象的支持，而以前javascript是不支持面向对象开发的。现在icrosoft AJAX Library能很好的支持类、名字空间、继承、接口、枚举、反射等特征。这些新增加的功能类似于.NET Framework，这使得开发ASP.NET AJAX应用变得容易维护，容易扩充。现在我们看看Microsoft AJAX Library是如何支持以上特征的。</p>
<p>1.类、成员和名字空间</p>
<p>在Microsoft AJAX Library中，所有的JavaScript类都继承自object(类似于.NET Framework库，都继承自object)，在ASP.NET AJAX应用中你可以运用面向对象的编程模式创建继承自Microsoft AJAX基类的对象和组件，类有四种成员：字段、属性、方法、事件。字段和属性是名/值对，用于描述一个类的一个实例的特性的。字段是由简单类型构成且可 直接访问，例如：</p>
<p>myClassInstance.name=&#8221;Fred&#8221;。</p>
<p><span id="more-95"></span>属性可以是任何简单类型或引用类型，通过get和set方法访问。在ASP.NET AJAX中，get和set是独立的函数，并规定在函数名中使用前缀&#8221;get_&#8221; 或 &#8220;set_&#8221; ，例如要获取或设置cancel属性的值时，你可以调用get_cancel或set_cancel方法。</p>
<p>一个方法是完成一个活动的函数而不是返回一个属性的值。属性和方法在下面的例子里都有示范。</p>
<p>事件指示特指的动作发生。当一个事件发生时，它可以调用一个或多个函数。事件所有者可以完成等待事件发生的任何任务。</p>
<p>名字空间是对关联类的逻辑分组。名字空间使你可以对公共功能进行分组。</p>
<p>为了使ASP.NET Web页面具有ASP.NET AJAX功能，你必须添加控件到页面上，当页面启动时，参照ASP.NET AJAX库的脚本自动产生。</p>
<p>下面的例子显示了页面使用了控件。</p>
<blockquote><p>&lt; asp:ScriptManager runat=&#8221;server&#8221; ID=&#8221;scriptManager&#8221; /&gt;</p></blockquote>
<p>下面的例子演示了如何使用Type.registerNamespace和.registerClass方法来把Person类增加到Demo名字空间中、创建类然后注册类。</p>
<blockquote><p>Type.registerNamespace(&#8220;Demo&#8221;);</p>
<p>Demo.Person = function(firstName, lastName, emailAddress) {</p>
<p>this._firstName = firstName;</p>
<p>this._lastName = lastName;</p>
<p>this._emailAddress = emailAddress;</p>
<p>}</p>
<p>Demo.Person.prototype = {</p>
<p>getFirstName: function() {</p>
<p>return this._firstName;</p>
<p>},</p>
<p>getLastName: function() {</p>
<p>return this._lastName;</p>
<p>},</p>
<p>getName: function() {</p>
<p>return this._firstName + &#8216; &#8216; + this._lastName;</p>
<p>},</p>
<p>dispose: function() {</p>
<p>alert(&#8216;bye &#8216; + this.getName());</p>
<p>}</p>
<p>}</p>
<p>Demo.Person.registerClass(&#8216;Demo.Person&#8217;, null, Sys.IDisposable);</p></blockquote>
<p>详细内容请查看原文                                                                                                               <a href="http://webservices.ctocio.com.cn/wsnettec/285/8096285.shtml">原文</a></p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/ajax-lectures-download.html" title="asp.net ajax视频教程下载">asp.net ajax视频教程下载</a></li><li><a href="http://www.johnzon.cn/c-sharp-rule.html" title="解读C＃中的规则表达式">解读C＃中的规则表达式</a></li><li><a href="http://www.johnzon.cn/aspnet-establish-write.html" title="ASP.NET创建文件并写入内容">ASP.NET创建文件并写入内容</a></li><li><a href="http://www.johnzon.cn/aspnet-new-characteristic.html" title="ASP.NET新特性系列讲座">ASP.NET新特性系列讲座</a></li><li><a href="http://www.johnzon.cn/jsp-aspnet-session.html" title="JSP与ASP.NET之间的session值共享">JSP与ASP.NET之间的session值共享</a></li><li><a href="http://www.johnzon.cn/aspnet-connect-sqlserver.html" title="ASP.NET2.0连接SQL Server数据库详解">ASP.NET2.0连接SQL Server数据库详解</a></li><li><a href="http://www.johnzon.cn/donet-login-kongjian.html" title="第一次用.net2.0 LOGIN登陆控件的困惑和解决方法">第一次用.net2.0 LOGIN登陆控件的困惑和解决方法</a></li><li><a href="http://www.johnzon.cn/aspnet-web-page-yingyong.html" title="ASP.NET Web Page应用深入探讨">ASP.NET Web Page应用深入探讨</a></li><li><a href="http://www.johnzon.cn/regularexpressionvalidator-rule.html" title="RegularExpressionValidator控件中正则表达式用法">RegularExpressionValidator控件中正则表达式用法</a></li><li><a href="http://www.johnzon.cn/aptech-aspnet-download.html" title="北大青鸟ASP.NET视频教程32讲下载">北大青鸟ASP.NET视频教程32讲下载</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解读C＃中的规则表达式</title>
		<link>http://www.johnzon.cn/c-sharp-rule.html</link>
		<comments>http://www.johnzon.cn/c-sharp-rule.html#comments</comments>
		<pubDate>Sat, 07 Jun 2008 05:12:47 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/24463</guid>
		<description><![CDATA[多少年来，许多的编程语言和工具都包含对规则表达式的支持，.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类，而且它们也都与未来的Perl 5中的规则表达式兼容。
此外，regexp类还能够完成一些其他的功能，例如从右至左的结合模式和表达式的编辑等。
在这篇文章中，我将简要地介绍System.Text.RegularExpression中的类和方法、一些字符串匹配和替换的例子以及组结构的详细情况，最后，还会介绍一些你可能会用到的常见的表达式。
应该掌握的基础知识
规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中，我们将假定你已经掌握了规则表达式的用法，尤其是Perl 5中 表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集，因此，从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和. NET架构的基本知识。
如果你没有规则表达式方面的知识，我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里·弗雷德尔编写的《掌握表达式》一书，对于希望深刻理解表达式的读者，我们强烈建议阅读这本书。
RegularExpression组合体
regexp规则类包含在System.Text.RegularExpressions.dll文件中，在对应用软件进行编译时你必须引用 这个文件，例如，csc r:System.Text.RegularExpressions.dll foo.cs命令将创建foo.exe文件，它就 引用了System.Text.RegularExpressions文件。
名字空间简介
在名字空间中仅仅包含着6个类和一个定义，它们是：
Capture: 包含一次匹配的结果；
CaptureCollection: Capture的序列；
Group: 一次组记录的结果，由Capture继承而来；
Match: 一次表达式的匹配结果，由Group继承而来；
MatchCollection: Match的一个序列；
MatchEvaluator: 执行替换操作时使用的代理；
Regex：编译后的表达式的实例。
Regex类中还包含一些静态的方法：
Escape: 对字符串中的regex中的转义符进行转义；
IsMatch: 如果表达式在字符串中匹配，该方法返回一个布尔值；
Match: 返回Match的实例；
Matches: 返回一系列的Match的方法；
Replace: 用替换字符串替换匹配的表达式；
Split: 返回一系列由表达式决定的字符串；
Unescape:不对字符串中的转义字符转义。
简单匹配
我们首先从使用Regex、Match类的简单表达式开始学习。
Match m = Regex.Match(&#8220;abracadabra&#8221;, &#8220;(a&#124;b&#124;r)+&#8221;);
我们现在有了一个可以用于测试的Match类的实例，例如：if (m.Success)&#8230;
如果想使用匹配的字符串，可以把它转换成一个字符串：
Console.WriteLine(&#8220;Match=&#8221;+m.ToString());
这个例子可以得到如下的输出: Match=abra。这就是匹配的字符串了。
字符串的替换
简单字符串的替换非常直观。例如下面的语句：
string s = Regex.Replace(&#8220;abracadabra&#8221;, &#8220;abra&#8221;, &#8220;zzzz&#8221;);
它返回字符串zzzzcadzzzz，所有匹配的字符串都被替换成了zzzzz。
现在我们来看一个比较复杂的字符串替换的例子：
string s = Regex.Replace(&#8221; abra &#8220;, @&#8221;^\s*(.*?)\s*$&#8221;, &#8220;$1&#8243;);
这个语句返回字符串abra，其前导和后缀的空格都去掉了。
上面的模式对于删除任意字符串中的前导和后续空格都非常有用。在C#中，我们还经常使用字母字符串，在一个字母字符串中，编译程序不把字符 “ \” 作为转义字符处理。在使用字符“\”指定转义字符时，@&#8221;&#8230;&#8221;是非常有用的。另外值得一提的是$1在字符串替换方面的使用，它表明替换字符 串只能包含被替换的字符串。
匹配引擎的细节
现在，我们通过一个组结构来理解一个稍微复杂的例子。看下面的例子：
string text = &#8220;abracadabra1abracadabra2abracadabra3&#8243;;
string pat = @&#8221;
( # 第一个组的开始
abra # 匹配字符串abra
( [...]]]></description>
			<content:encoded><![CDATA[<p>多少年来，许多的编程语言和工具都包含对规则表达式的支持，.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类，而且它们也都与未来的Perl 5中的规则表达式兼容。</p>
<p>此外，regexp类还能够完成一些其他的功能，例如从右至左的结合模式和表达式的编辑等。</p>
<p>在这篇文章中，我将简要地介绍System.Text.RegularExpression中的类和方法、一些字符串匹配和替换的例子以及组结构的详细情况，最后，还会介绍一些你可能会用到的常见的表达式。</p>
<p><span id="more-83"></span>应该掌握的基础知识<br />
规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中，我们将假定你已经掌握了规则表达式的用法，尤其是Perl 5中 表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集，因此，从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和. NET架构的基本知识。</p>
<p>如果你没有规则表达式方面的知识，我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里·弗雷德尔编写的《掌握表达式》一书，对于希望深刻理解表达式的读者，我们强烈建议阅读这本书。</p>
<p>RegularExpression组合体<br />
regexp规则类包含在System.Text.RegularExpressions.dll文件中，在对应用软件进行编译时你必须引用 这个文件，例如，csc r:System.Text.RegularExpressions.dll foo.cs命令将创建foo.exe文件，它就 引用了System.Text.RegularExpressions文件。</p>
<p>名字空间简介<br />
在名字空间中仅仅包含着6个类和一个定义，它们是：</p>
<p>Capture: 包含一次匹配的结果；</p>
<p>CaptureCollection: Capture的序列；</p>
<p>Group: 一次组记录的结果，由Capture继承而来；</p>
<p>Match: 一次表达式的匹配结果，由Group继承而来；</p>
<p>MatchCollection: Match的一个序列；</p>
<p>MatchEvaluator: 执行替换操作时使用的代理；</p>
<p>Regex：编译后的表达式的实例。</p>
<p>Regex类中还包含一些静态的方法：</p>
<p>Escape: 对字符串中的regex中的转义符进行转义；</p>
<p>IsMatch: 如果表达式在字符串中匹配，该方法返回一个布尔值；</p>
<p>Match: 返回Match的实例；</p>
<p>Matches: 返回一系列的Match的方法；</p>
<p>Replace: 用替换字符串替换匹配的表达式；</p>
<p>Split: 返回一系列由表达式决定的字符串；</p>
<p>Unescape:不对字符串中的转义字符转义。</p>
<p>简单匹配<br />
我们首先从使用Regex、Match类的简单表达式开始学习。</p>
<p>Match m = Regex.Match(&#8220;abracadabra&#8221;, &#8220;(a|b|r)+&#8221;);</p>
<p>我们现在有了一个可以用于测试的Match类的实例，例如：if (m.Success)&#8230;</p>
<p>如果想使用匹配的字符串，可以把它转换成一个字符串：</p>
<p>Console.WriteLine(&#8220;Match=&#8221;+m.ToString());</p>
<p>这个例子可以得到如下的输出: Match=abra。这就是匹配的字符串了。</p>
<p>字符串的替换<br />
简单字符串的替换非常直观。例如下面的语句：</p>
<p>string s = Regex.Replace(&#8220;abracadabra&#8221;, &#8220;abra&#8221;, &#8220;zzzz&#8221;);</p>
<p>它返回字符串zzzzcadzzzz，所有匹配的字符串都被替换成了zzzzz。</p>
<p>现在我们来看一个比较复杂的字符串替换的例子：</p>
<p>string s = Regex.Replace(&#8221; abra &#8220;, @&#8221;^\s*(.*?)\s*$&#8221;, &#8220;$1&#8243;);</p>
<p>这个语句返回字符串abra，其前导和后缀的空格都去掉了。</p>
<p>上面的模式对于删除任意字符串中的前导和后续空格都非常有用。在C#中，我们还经常使用字母字符串，在一个字母字符串中，编译程序不把字符 “ \” 作为转义字符处理。在使用字符“\”指定转义字符时，@&#8221;&#8230;&#8221;是非常有用的。另外值得一提的是$1在字符串替换方面的使用，它表明替换字符 串只能包含被替换的字符串。</p>
<p>匹配引擎的细节<br />
现在，我们通过一个组结构来理解一个稍微复杂的例子。看下面的例子：</p>
<p>string text = &#8220;abracadabra1abracadabra2abracadabra3&#8243;;</p>
<p>string pat = @&#8221;</p>
<p>( # 第一个组的开始</p>
<p>abra # 匹配字符串abra</p>
<p>( # 第二个组的开始</p>
<p>cad # 匹配字符串cad</p>
<p>)? # 第二个组结束（可选）</p>
<p>) # 第一个组结束</p>
<p>+ # 匹配一次或多次</p>
<p>&#8220;;</p>
<p>//利用x修饰符忽略注释</p>
<p>Regex r = new Regex(pat, &#8220;x&#8221;);</p>
<p>//获得组号码的清单</p>
<p>int[] gnums = r.GetGroupNumbers();</p>
<p>//首次匹配</p>
<p>Match m = r.Match(text);</p>
<p>while (m.Success)</p>
<p>{</p>
<p>//从组1开始</p>
<p>for (int i = 1;i</p>
<p>{</p>
<p>Group g = m.Group(gnums[i]);</p>
<p>//获得这次匹配的组</p>
<p>Console.WriteLine(&#8220;Group&#8221;+gnums[i]+&#8221;=["+g.ToString()+"]&#8220;);</p>
<p>//计算这个组的起始位置和长度</p>
<p>CaptureCollection cc = g.Captures;</p>
<p>for (int j = 0; j</p>
<p>{</p>
<p>Capture c = cc[j];</p>
<p>Console.WriteLine(&#8221; Capture&#8221; + j + &#8220;=["+c.ToString()</p>
<p>+ "] Index=&#8221; + c.Index + &#8221; Length=&#8221; + c.Length);</p>
<p>}</p>
<p>}</p>
<p>//下一个匹配</p>
<p>m = m.NextMatch();</p>
<p>}</p>
<p>这个例子的输出如下所示：</p>
<p>Group1=[abra]</p>
<p>Capture0=[abracad] Index=0 Length=7</p>
<p>Capture1=[abra] Index=7 Length=4</p>
<p>Group2=[cad]</p>
<p>Capture0=[cad] Index=4 Length=3</p>
<p>Group1=[abra]</p>
<p>Capture0=[abracad] Index=12 Length=7</p>
<p>Capture1=[abra] Index=19 Length=4</p>
<p>Group2=[cad]</p>
<p>Capture0=[cad] Index=16 Length=3</p>
<p>Group1=[abra]</p>
<p>Capture0=[abracad] Index=24 Length=7</p>
<p>Capture1=[abra] Index=31 Length=4</p>
<p>Group2=[cad]</p>
<p>Capture0=[cad] Index=28 Length=3</p>
<p>我们首先从考查字符串pat开始，pat中包含有表达式。第一个capture是从第一个圆括号开始的，然后表达式将匹配到一个abra。第 二个capture组从第二个圆括号开始，但第一个capture组还没有结束，这意味着第一个组匹配的结果是abracad ，而第二个组的匹配结果仅 仅是cad。因此如果通过使用？符号而使cad成为一项可选的匹配，匹配的结果就可能是abra或abracad。然后，第一个组就会结束，通过指定+符 号要求表达式进行多次匹配。</p>
<p>现在我们来看看匹配过程中发生的情况。首先，通过调用Regex的constructor方法建立表达式的一个实例，并在其中指定各种选项。 在这个例子中，由于在表达式中有注释，因此选用了x选项，另外还使用了一些空格。打开x选项，表达式将会忽略注释和其中没有转义的空格。</p>
<p>然后，取得表达式中定义的组的编号的清单。你当然可以显性地使用这些编号，在这里使用的是编程的方法。如果使用了命名的组，作为一种建立快速索引的途径这种方法也十分有效。</p>
<p>接下来是完成第一次匹配。通过一个循环测试当前的匹配是否成功，接下来是从group 1开始重复对组清单执行这一操作。在这个例子中没有使 用group 0的原因是group 0是一个完全匹配的字符串，如果要通过收集全部匹配的字符串作为一个单一的字符串，就会用到group 0了。</p>
<p>我们跟踪每个group中的CaptureCollection。通常情况下每次匹配、每个group中只能有一个capture，但本例中 的Group1则有两个capture：Capture0和Capture1。如果你仅需要Group1的ToString，就会只得到abra，当然它 也会与abracad匹配。组中ToString的值就是其CaptureCollection中最后一个Capture的值，这正是我们所需要的。如果 你希望整个过程在匹配abra后结束，就应该从表达式中删除+符号，让regex引擎知道我们只需要对表达式进行匹配。</p>
<p>基于过程和基于表达式方法的比较<br />
一般情况下，使用规则表达式的用户可以分为以下二大类：第一类用户尽量不使用规则表达式，而是使用过程来执行一些需要重复的操作；第二类用户则充分利用规则表达式处理引擎的功能和威力，而尽可能少地使用过程。</p>
<p>对于我们大多数用户而言，最好的方案莫过于二者兼而用之了。我希望这篇文章能够说明.NET语言中regexp类的作用以及它在性能和复杂性之间的优、劣点。</p>
<p>基于过程的模式<br />
我们在编程中经常需要用到的一个功能是对字符串中的一部分进行匹配或其他一些对字符串处理，下面是一个对字符串中的单词进行匹配的例子：</p>
<p>string text = &#8220;the quick red fox jumped over the lazy brown dog.&#8221;;</p>
<p>System.Console.WriteLine(&#8220;text=[" + text + "]&#8220;);</p>
<p>string result = &#8220;&#8221;;</p>
<p>string pattern = @&#8221;\w+|\W+&#8221;;</p>
<p>foreach (Match m in Regex.Matches(text, pattern))</p>
<p>{</p>
<p>// 取得匹配的字符串</p>
<p>string x = m.ToString();</p>
<p>// 如果第一个字符是小写</p>
<p>if (char.IsLower(x[0]))</p>
<p>// 变成大写</p>
<p>x = char.ToUpper(x[0]) + x.Substring(1, x.Length-1);</p>
<p>// 收集所有的字符</p>
<p>result += x;</p>
<p>}</p>
<p>System.Console.WriteLine(&#8220;result=[" + result + "]&#8220;);</p>
<p>正象上面的例子所示，我们使用了C#语言中的foreach语句处理每个匹配的字符，并完成相应的处理，在这个例子中，新创建了一个result字符串。这个例子的输出所下所示：</p>
<p>text=[the quick red fox jumped over the lazy brown dog.]</p>
<p>result=[The Quick Red Fox Jumped Over The Lazy Brown Dog.]</p>
<p>基于表达式的模式<br />
完成上例中的功能的另一条途径是通过一个MatchEvaluator，新的代码如下所示：</p>
<p>static string CapText(Match m)</p>
<p>{</p>
<p>//取得匹配的字符串</p>
<p>string x = m.ToString();</p>
<p>// 如果第一个字符是小写</p>
<p>if (char.IsLower(x[0]))</p>
<p>// 转换为大写</p>
<p>return char.ToUpper(x[0]) + x.Substring(1, x.Length-1);</p>
<p>return x;</p>
<p>}</p>
<p>static void Main()</p>
<p>{</p>
<p>string text = &#8220;the quick red fox jumped over the</p>
<p>lazy brown dog.&#8221;;</p>
<p>System.Console.WriteLine(&#8220;text=[" + text + "]&#8220;);</p>
<p>string pattern = @&#8221;\w+&#8221;;</p>
<p>string result = Regex.Replace(text, pattern,</p>
<p>new MatchEvaluator(Test.CapText));</p>
<p>System.Console.WriteLine(&#8220;result=[" + result + "]&#8220;);</p>
<p>}</p>
<p>同时需要注意的是，由于仅仅需要对单词进行修改而无需对非单词进行修改，这个模式显得非常简单。</p>
<p>常用表达式<br />
为了能够更好地理解如何在C#环境中使用规则表达式，我写出一些对你来说可能有用的规则表达式，这些表达式在其他的环境中都被使用过，希望能够对你有所帮助。</p>
<p>罗马数字<br />
string p1 = &#8220;^m*(d?c{0,3}|c[dm])&#8221; + &#8220;(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$&#8221;;</p>
<p>string t1 = &#8220;vii&#8221;;</p>
<p>Match m1 = Regex.Match(t1, p1);</p>
<p>交换前二个单词<br />
string t2 = &#8220;the quick brown fox&#8221;;</p>
<p>string p2 = @&#8221;(\S+)(\s+)(\S+)&#8221;;</p>
<p>Regex x2 = new Regex(p2);</p>
<p>string r2 = x2.Replace(t2, &#8220;$3$2$1&#8243;, 1);</p>
<p>关健字=值<br />
string t3 = &#8220;myval = 3&#8243;;</p>
<p>string p3 = @&#8221;(\w+)\s*=\s*(.*)\s*$&#8221;;</p>
<p>Match m3 = Regex.Match(t3, p3);</p>
<p>实现每行80个字符<br />
string t4 = &#8220;********************&#8221;</p>
<p>+ &#8220;******************************&#8221;</p>
<p>+ &#8220;******************************&#8221;;</p>
<p>string p4 = &#8220;.{80,}&#8221;;</p>
<p>Match m4 = Regex.Match(t4, p4);</p>
<p>月/日/年 小时:分:秒的时间格式<br />
string t5 = &#8220;01/01/01 16:10:01&#8243;;</p>
<p>string p5 = @&#8221;(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)&#8221;;</p>
<p>Match m5 = Regex.Match(t5, p5);</p>
<p>改变目录（仅适用于Windows平台）<br />
string t6 = @&#8221;C:\Documents and Settings\user1\Desktop\&#8221;;</p>
<p>string r6 = Regex.Replace(t6,@&#8221;\\user1\\&#8221;, @&#8221;\\user2\\&#8221;);</p>
<p>扩展16位转义符<br />
string t7 = &#8220;%41&#8243;; // capital A</p>
<p>string p7 = &#8220;%([0-9A-Fa-f][0-9A-Fa-f])&#8221;;</p>
<p>string r7 = Regex.Replace(t7, p7, HexConvert);</p>
<p>删除C语言中的注释（有待完善）<br />
string t8 = @&#8221;</p>
<p>/*</p>
<p>* 传统风格的注释</p>
<p>*/</p>
<p>&#8220;;</p>
<p>string p8 = @&#8221;</p>
<p>/\* # 匹配注释开始的定界符</p>
<p>.*? # 匹配注释</p>
<p>\*/ # 匹配注释结束定界符</p>
<p>&#8220;;</p>
<p>string r8 = Regex.Replace(t8, p8, &#8220;&#8221;, &#8220;xs&#8221;);</p>
<p>删除字符串中开始和结束处的空格<br />
string t9a = &#8221; leading&#8221;;</p>
<p>string p9a = @&#8221;^\s+&#8221;;</p>
<p>string r9a = Regex.Replace(t9a, p9a, &#8220;&#8221;);</p>
<p>string t9b = &#8220;trailing &#8220;;</p>
<p>string p9b = @&#8221;\s+$&#8221;;</p>
<p>string r9b = Regex.Replace(t9b, p9b, &#8220;&#8221;);</p>
<p>在字符\后添加字符n，使之成为真正的新行</p>
<p>string t10 = @&#8221;\ntest\n&#8221;;</p>
<p>string r10 = Regex.Replace(t10, @&#8221;\\n&#8221;, &#8220;\n&#8221;);</p>
<p>转换IP地址<br />
string t11 = &#8220;55.54.53.52&#8243;;</p>
<p>string p11 = &#8220;^&#8221; +</p>
<p>@&#8221;([01]?\d\d|2[0-4]\d|25[0-5])\.&#8221; +</p>
<p>@&#8221;([01]?\d\d|2[0-4]\d|25[0-5])\.&#8221; +</p>
<p>@&#8221;([01]?\d\d|2[0-4]\d|25[0-5])\.&#8221; +</p>
<p>@&#8221;([01]?\d\d|2[0-4]\d|25[0-5])&#8221; +</p>
<p>&#8220;$&#8221;;</p>
<p>Match m11 = Regex.Match(t11, p11);</p>
<p>删除文件名包含的路径<br />
string t12 = @&#8221;c:\file.txt&#8221;;</p>
<p>string p12 = @&#8221;^.*\\&#8221;;</p>
<p>string r12 = Regex.Replace(t12, p12, &#8220;&#8221;);</p>
<p>联接多行字符串中的行<br />
string t13 = @&#8221;this is</p>
<p>a split line&#8221;;</p>
<p>string p13 = @&#8221;\s*\r?\n\s*&#8221;;</p>
<p>string r13 = Regex.Replace(t13, p13, &#8221; &#8220;);</p>
<p>提取字符串中的所有数字<br />
string t14 = @&#8221;</p>
<p>test 1</p>
<p>test 2.3</p>
<p>test 47</p>
<p>&#8220;;</p>
<p>string p14 = @&#8221;(\d+\.?\d*|\.\d+)&#8221;;</p>
<p>MatchCollection mc14 = Regex.Matches(t14, p14);</p>
<p>找出所有的大写字母<br />
string t15 = &#8220;This IS a Test OF ALL Caps&#8221;;</p>
<p>string p15 = @&#8221;(\b[^\Wa-z0-9_]+\b)&#8221;;</p>
<p>MatchCollection mc15 = Regex.Matches(t15, p15);</p>
<p>找出小写的单词<br />
string t16 = &#8220;This is A Test of lowercase&#8221;;</p>
<p>string p16 = @&#8221;(\b[^\WA-Z0-9_]+\b)&#8221;;</p>
<p>MatchCollection mc16 = Regex.Matches(t16, p16);</p>
<p>找出第一个字母为大写的单词<br />
string t17 = &#8220;This is A Test of Initial Caps&#8221;;</p>
<p>string p17 = @&#8221;(\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b)&#8221;;</p>
<p>MatchCollection mc17 = Regex.Matches(t17, p17);</p>
<p>找出简单的HTML语言中的链接<br />
string t18 = @&#8221;</p>
<p>first tag text</p>
<p>next tag text</p>
<p>&#8220;;</p>
<p>string p18 = @&#8221;]*?HREF\s*=\s*[""']?&#8221; + @&#8221;([^'"" &gt;]+?)[ '""]?&gt;&#8221;;</p>
<p>MatchCollection mc18 = Regex.Matches(t18, p18, &#8220;si&#8221;);</p>
<p><a href="http://www.johnzon.cn/regularexpressionvalidator-rule.html">RegularExpressionValidator控件中正则表达式用法</a></p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/regularexpressionvalidator-rule.html" title="RegularExpressionValidator控件中正则表达式用法">RegularExpressionValidator控件中正则表达式用法</a></li><li><a href="http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html" title="剖析ASP.NET AJAX的面向对象思想">剖析ASP.NET AJAX的面向对象思想</a></li><li><a href="http://www.johnzon.cn/aspnet-establish-write.html" title="ASP.NET创建文件并写入内容">ASP.NET创建文件并写入内容</a></li><li><a href="http://www.johnzon.cn/c-sharp-data-structure.html" title="C#与数据结构—二叉树的遍历精解">C#与数据结构—二叉树的遍历精解</a></li><li><a href="http://www.johnzon.cn/aspnet-new-characteristic.html" title="ASP.NET新特性系列讲座">ASP.NET新特性系列讲座</a></li><li><a href="http://www.johnzon.cn/jsp-aspnet-session.html" title="JSP与ASP.NET之间的session值共享">JSP与ASP.NET之间的session值共享</a></li><li><a href="http://www.johnzon.cn/c-sharp-webpage-form.html" title="C#技巧：网页表单自动填写技术(gmail为例)">C#技巧：网页表单自动填写技术(gmail为例)</a></li><li><a href="http://www.johnzon.cn/aspnet-connect-sqlserver.html" title="ASP.NET2.0连接SQL Server数据库详解">ASP.NET2.0连接SQL Server数据库详解</a></li><li><a href="http://www.johnzon.cn/donet-login-kongjian.html" title="第一次用.net2.0 LOGIN登陆控件的困惑和解决方法">第一次用.net2.0 LOGIN登陆控件的困惑和解决方法</a></li><li><a href="http://www.johnzon.cn/aspnet-web-page-yingyong.html" title="ASP.NET Web Page应用深入探讨">ASP.NET Web Page应用深入探讨</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/c-sharp-rule.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET创建文件并写入内容</title>
		<link>http://www.johnzon.cn/aspnet-establish-write.html</link>
		<comments>http://www.johnzon.cn/aspnet-establish-write.html#comments</comments>
		<pubDate>Sun, 25 May 2008 03:01:47 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[写入]]></category>
		<category><![CDATA[创建]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/21534</guid>
		<description><![CDATA[本文从最基本的操作开始，解释在ASP.NET中文件处理的概念，包括如从一个文件中读取内容、如何向一个文件中写入内容和如何删除一个文件。
前面已经提到，要想在ASP.NET 页面中进行文件处理，必须要有&#8221;System.IO&#8221;名称空间。所以，第一步就是引入这个名称空间：
%@ Import Namespace=&#8221;System.IO&#8221; %
下一步，就是创建一个文本文件，并将这个文本文件分配给一个流书写对象，这样就可以向文本文件中写入内容了。用以下一段代码来完成这个任务：
writefile.aspx
%@ Import Namespace=&#8221;System.IO&#8221; %
%
Response.write(&#8220;Writing the content into Text File in ASP.NET BR&#8221;)
&#8220;声明流书写对象
Dim strwriterobj As StreamWriter
&#8221; 创建文本文件，分配textfile对象
strwriterobj= File.CreateText(&#8220;c:aspnet.txt&#8221; )
&#8221; 写入内容
strwriterobj.WriteLine( &#8220;Welcome to wonderfull world of ASP.NET Programming&#8221; ) &#8221;
完成操作，关闭流对象
strwriterobj.Close
Response.write(&#8220;Done with the creation of text file and writing content into it&#8221;)
%
这样就完成了!现在让我们继续进行下一个任务，从刚才创建的文本文件中读取内容。
从文件中读取内容
从文件中读取内容与向文件中写入内容大致相同，只是要注意一下下面的两件事：
1. 文件读取使用StreamReader类
2. 当使用了Readline方法时，将要被读取的文本文件的结尾处会用一个空字符串(&#8220;&#8221;)来标记。
现在开始编写代码从前面创建的aspnet.txt 文件中读取内容：
在ASP.NET中，文件处理的整个过程都是围绕着System.IO 这个名称空间展开的。这个名称空间中具有执行文件读、写所需要的类。
readfile.aspx
%@ Import Namespace=&#8221;System.IO&#8221; %
%
Response.write(&#8220;Reading the content from the text [...]]]></description>
			<content:encoded><![CDATA[<p>本文从最基本的操作开始，解释在ASP.NET中文件处理的概念，包括如从一个文件中读取内容、如何向一个文件中写入内容和如何删除一个文件。</p>
<p>前面已经提到，要想在ASP.NET 页面中进行文件处理，必须要有&#8221;System.IO&#8221;名称空间。所以，第一步就是引入这个名称空间：</p>
<p>%@ Import Namespace=&#8221;System.IO&#8221; %</p>
<p>下一步，就是创建一个文本文件，并将这个文本文件分配给一个流书写对象，这样就可以向文本文件中写入内容了。用以下一段代码来完成这个任务：</p>
<p>writefile.aspx</p>
<p>%@ Import Namespace=&#8221;System.IO&#8221; %<br />
%</p>
<p>Response.write(&#8220;Writing the content into Text File in ASP.NET BR&#8221;)</p>
<p>&#8220;声明流书写对象</p>
<p>Dim strwriterobj As StreamWriter</p>
<p><span id="more-58"></span>&#8221; 创建文本文件，分配textfile对象</p>
<p>strwriterobj= File.CreateText(&#8220;c:aspnet.txt&#8221; )</p>
<p>&#8221; 写入内容</p>
<p>strwriterobj.WriteLine( &#8220;Welcome to wonderfull world of ASP.NET Programming&#8221; ) &#8221;</p>
<p>完成操作，关闭流对象</p>
<p>strwriterobj.Close</p>
<p>Response.write(&#8220;Done with the creation of text file and writing content into it&#8221;)</p>
<p>%</p>
<p>这样就完成了!现在让我们继续进行下一个任务，从刚才创建的文本文件中读取内容。</p>
<p>从文件中读取内容</p>
<p>从文件中读取内容与向文件中写入内容大致相同，只是要注意一下下面的两件事：</p>
<p>1. 文件读取使用StreamReader类</p>
<p>2. 当使用了Readline方法时，将要被读取的文本文件的结尾处会用一个空字符串(&#8220;&#8221;)来标记。</p>
<p>现在开始编写代码从前面创建的aspnet.txt 文件中读取内容：</p>
<p>在ASP.NET中，文件处理的整个过程都是围绕着System.IO 这个名称空间展开的。这个名称空间中具有执行文件读、写所需要的类。</p>
<p>readfile.aspx</p>
<p>%@ Import Namespace=&#8221;System.IO&#8221; %<br />
%</p>
<p>Response.write(&#8220;Reading the content from the text file ASPNET.TXT br&#8221;)</p>
<p>&#8221; 创建流读取对象</p>
<p>Dim streamreaderobj As StreamReader</p>
<p>&#8221; 声明变量，以存放从文件中读取的内容</p>
<p>Dim filecont As String</p>
<p>&#8221; 打开文本文件，分配给流读取对象</p>
<p>streamreaderobj = File.OpenText( &#8220;c:aspnet.txt&#8221; )</p>
<p>&#8221; 逐行读取文件内容</p>
<p>Do</p>
<p>filecont = streamreaderobj.ReadLine()</p>
<p>Response.Write( filecont &amp; &#8221; br&#8221; )</p>
<p>Loop Until filecont = &#8220;&#8221;</p>
<p>&#8221; 完成读取操作后，关闭流读取对象</p>
<p>streamreaderobj.Close</p>
<p>Response.write(&#8221; br Done with reading the content from the file aspnet.txt&#8221;)</p>
<p>%</p>
<p>删除文件</p>
<p>在ASP.NET中删除文件也非常简单和直观。System.IO名称空间中的&#8221;File&#8221;(文件)类有一个Delete方法用来删除文件，它把文件名作为一个自变量来传递。以下代码就演示了在ASP.NET中进行文件删除的步骤：</p>
<p>Filedelete.aspx</p>
<p>%@ Import Namespace=&#8221;System.IO&#8221;<br />
%</p>
<p>File.Delete(&#8220;c:aspnet.txt&#8221; )</p>
<p>Response.write(&#8220;The File aspnet is deleted successfully !!!&#8221; )</p>
<p>%</p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html" title="剖析ASP.NET AJAX的面向对象思想">剖析ASP.NET AJAX的面向对象思想</a></li><li><a href="http://www.johnzon.cn/c-sharp-rule.html" title="解读C＃中的规则表达式">解读C＃中的规则表达式</a></li><li><a href="http://www.johnzon.cn/aspnet-new-characteristic.html" title="ASP.NET新特性系列讲座">ASP.NET新特性系列讲座</a></li><li><a href="http://www.johnzon.cn/jsp-aspnet-session.html" title="JSP与ASP.NET之间的session值共享">JSP与ASP.NET之间的session值共享</a></li><li><a href="http://www.johnzon.cn/aspnet-connect-sqlserver.html" title="ASP.NET2.0连接SQL Server数据库详解">ASP.NET2.0连接SQL Server数据库详解</a></li><li><a href="http://www.johnzon.cn/donet-login-kongjian.html" title="第一次用.net2.0 LOGIN登陆控件的困惑和解决方法">第一次用.net2.0 LOGIN登陆控件的困惑和解决方法</a></li><li><a href="http://www.johnzon.cn/aspnet-web-page-yingyong.html" title="ASP.NET Web Page应用深入探讨">ASP.NET Web Page应用深入探讨</a></li><li><a href="http://www.johnzon.cn/ajax-lectures-download.html" title="asp.net ajax视频教程下载">asp.net ajax视频教程下载</a></li><li><a href="http://www.johnzon.cn/regularexpressionvalidator-rule.html" title="RegularExpressionValidator控件中正则表达式用法">RegularExpressionValidator控件中正则表达式用法</a></li><li><a href="http://www.johnzon.cn/aptech-aspnet-download.html" title="北大青鸟ASP.NET视频教程32讲下载">北大青鸟ASP.NET视频教程32讲下载</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/aspnet-establish-write.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C#与数据结构—二叉树的遍历精解</title>
		<link>http://www.johnzon.cn/c-sharp-data-structure.html</link>
		<comments>http://www.johnzon.cn/c-sharp-data-structure.html#comments</comments>
		<pubDate>Sun, 25 May 2008 02:58:09 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/21533</guid>
		<description><![CDATA[二叉树的存储可分为两种：顺序存储结构和链式存储结构。
1. 顺序存储结构
把一个满二叉树自上而下、从左到右顺序编号，依次存放在数组内。设满二叉树结点在数组中的索引号为i，那么有如下性质。
（1） 如果i = 0，此结点为根结点，无双亲。
（2） 如果i &#62; 0，则其双亲结点为(i -1) / 2 。（注意，这里的除法是整除，结果中的小数部分会被舍弃。）
（3） 结点i的左孩子为2i + 1，右孩子为2i + 2。
（4） 如果i &#62; 0，当i为奇数时，它是双亲结点的左孩子，它的兄弟为i + 1；当i为偶数时，它是双新结点的右孩子，它的兄弟结点为i – 1。
（5） 深度为k的满二叉树需要长度为2 k-1的数组进行存储。
通过以上性质可知，使用数组存放满二叉树的各结点非常方便，可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号，从而对这些结点进行访问，这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。
为了用结点在数组中的位置反映出结点之间的逻辑关系，存储一般二叉树时，只需要将数组中空结点所对应的位置设为空即可，其效果如图6.8(b)所示。这会造成一定的空间浪费，但如果空结点的数量不是很多，这些浪费可以忽略。
一个深度为k的二叉树需要2 k-1个存储空间，当k值很大并且二叉树的空结点很多时，最坏的情况是每层只有一个结点，再使用顺序存储结构来存储显然会造成极大地浪费，这时就应该使用链式存储结构来存储二叉树中的数据。
Copyright © 2007-2009 JohnZon 世界解读C＃中的规则表达式C#技巧：网页表单自动填写技术(gmail为例)]]></description>
			<content:encoded><![CDATA[<p>二叉树的存储可分为两种：顺序存储结构和链式存储结构。</p>
<p>1. 顺序存储结构</p>
<p>把一个满二叉树自上而下、从左到右顺序编号，依次存放在数组内。设满二叉树结点在数组中的索引号为i，那么有如下性质。</p>
<p>（1） 如果i = 0，此结点为根结点，无双亲。</p>
<p>（2） 如果i &gt; 0，则其双亲结点为(i -1) / 2 。（注意，这里的除法是整除，结果中的小数部分会被舍弃。）</p>
<p>（3） 结点i的左孩子为2i + 1，右孩子为2i + 2。</p>
<p>（4） 如果i &gt; 0，当i为奇数时，它是双亲结点的左孩子，它的兄弟为i + 1；当i为偶数时，它是双新结点的右孩子，它的兄弟结点为i – 1。</p>
<p>（5） 深度为k的满二叉树需要长度为2 k-1的数组进行存储。</p>
<p><span id="more-57"></span>通过以上性质可知，使用数组存放满二叉树的各结点非常方便，可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号，从而对这些结点进行访问，这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。</p>
<p>为了用结点在数组中的位置反映出结点之间的逻辑关系，存储一般二叉树时，只需要将数组中空结点所对应的位置设为空即可，其效果如图6.8(b)所示。这会造成一定的空间浪费，但如果空结点的数量不是很多，这些浪费可以忽略。</p>
<p>一个深度为k的二叉树需要2 k-1个存储空间，当k值很大并且二叉树的空结点很多时，最坏的情况是每层只有一个结点，再使用顺序存储结构来存储显然会造成极大地浪费，这时就应该使用链式存储结构来存储二叉树中的数据。</p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/c-sharp-rule.html" title="解读C＃中的规则表达式">解读C＃中的规则表达式</a></li><li><a href="http://www.johnzon.cn/c-sharp-webpage-form.html" title="C#技巧：网页表单自动填写技术(gmail为例)">C#技巧：网页表单自动填写技术(gmail为例)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/c-sharp-data-structure.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET新特性系列讲座</title>
		<link>http://www.johnzon.cn/aspnet-new-characteristic.html</link>
		<comments>http://www.johnzon.cn/aspnet-new-characteristic.html#comments</comments>
		<pubDate>Wed, 21 May 2008 07:01:34 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[视频教程]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/21513</guid>
		<description><![CDATA[(1)：使用Web Part创建应用程序
在Visual Studio.NET 2005当中，微软提供了一种新的编程模式，即使用Web Part方式来创建门户式应用。使用Web Part，可以非常简单、快速的创建我们的应用，并且为维护代码带来了更加简单的途径，本课程通过多种示例，让我们来认知这一编程方式。





观看视频
下载录影
下载代码示例




(2)：ASP.NET 2.0角色及成员管理初窥
Visual Studio.NET 2005当中提供了更加安全的编程模式，用来管理站点的用户、角色及成员资格，除了提供了相应的API，还提供了新的Web Control以及Service，方便我们编程，在本课程当中，我们将了解ASP.NET 2.0当中新的用户管理模型。





观看视频
下载录影
下载代码示例




(3)：管理外观、布局及其它用户体验
管理外观、布局及其它用户体验。ASP.NET引入了很多与表现层相关的新特性，如母版页（Master Page）、模板（Template）以及外观（Skin），可以使用更少的代码来编写更加强大的ASP.NET的用户体验。本课程将介绍这些技术，以便使大家能够更好的了解在如何平滑过渡到ASP.NET 2.0的表现层编程





观看视频
下载录影
下载代码示例




(4)：构建动态导航的Web应用程序
构建动态导航的Web应用程序。在现代的Web应用程序当中，复杂的导航系统也是致使应用代码不断庞涨的重要原因，在ASP.NET 2.0当中，引入了新的导航机制（控件、API以及存储机制）来方便最终开发人员来设计具有导航系统的Web应用程序，并且可以在动应用正常运行时进行配置式的修改。本课程将就此进行探讨。





观看视频
下载录影
下载代码示例




Copyright © 2007-2009 JohnZon 世界asp.net ajax视频教程下载北大青鸟ASP.NET视频教程32讲下载剖析ASP.NET AJAX的面向对象思想解读C＃中的规则表达式ASP.NET创建文件并写入内容JSP与ASP.NET之间的session值共享ASP.NET2.0连接SQL Server数据库详解第一次用.net2.0 LOGIN登陆控件的困惑和解决方法ASP.NET Web Page应用深入探讨Eclipse开发视频教程]]></description>
			<content:encoded><![CDATA[<p>(1)：使用Web Part创建应用程序</p>
<p class="noborder">在Visual Studio.NET 2005当中，微软提供了一种新的编程模式，即使用Web Part方式来创建门户式应用。使用Web Part，可以非常简单、快速的创建我们的应用，并且为维护代码带来了更加简单的途径，本课程通过多种示例，让我们来认知这一编程方式。</p>
<table border="0">
<tbody>
<tr>
<td><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://static.asp.net/asp.net/images/mediaplayer/snapshots/50120-cn.gif" alt="" width="110" height="83" /></td>
<td>
<p class="noborder"><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242146">观看视频</a></p>
<p class="noborder"><a href="http://download.microsoft.com/download/0/0/9/009b35f2-7705-45e2-b768-8378beeea40e/Webcast20050120_Video.zip">下载录影</a><br />
<a href="http://download.microsoft.com/download/8/b/a/8ba45e51-bfb7-4bf5-b06f-2113768365f6/Webcast20050120_PPT.zip">下载代码示例</a></p>
</td>
</tr>
</tbody>
</table>
<p>(2)：ASP.NET 2.0角色及成员管理初窥</p>
<p class="noborder">Visual Studio.NET 2005当中提供了更加安全的编程模式，用来管理站点的用户、角色及成员资格，除了提供了相应的API，还提供了新的Web Control以及Service，方便我们编程，在本课程当中，我们将了解ASP.NET 2.0当中新的用户管理模型。</p>
<table border="0">
<tbody>
<tr>
<td><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://static.asp.net/asp.net/images/mediaplayer/snapshots/50121-cn.gif" alt="" width="110" height="83" /></td>
<td>
<p class="noborder"><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242150">观看视频</a></p>
<p class="noborder"><a href="http://download.microsoft.com/download/5/f/c/5fcf0669-e565-4d3b-93c2-b72fbe643a9e/WebCast20050121_Video.zip">下载录影</a><br />
<a href="http://download.microsoft.com/download/8/b/a/8ba45e51-bfb7-4bf5-b06f-2113768365f6/Webcast20050121_PPT.zip">下载代码示例</a></p>
</td>
</tr>
</tbody>
</table>
<p><span id="more-53"></span>(3)：管理外观、布局及其它用户体验</p>
<p class="noborder">管理外观、布局及其它用户体验。ASP.NET引入了很多与表现层相关的新特性，如母版页（Master Page）、模板（Template）以及外观（Skin），可以使用更少的代码来编写更加强大的ASP.NET的用户体验。本课程将介绍这些技术，以便使大家能够更好的了解在如何平滑过渡到ASP.NET 2.0的表现层编程</p>
<table border="0">
<tbody>
<tr>
<td><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://static.asp.net/asp.net/images/mediaplayer/snapshots/50304-cn.gif" alt="" width="110" height="82" /></td>
<td>
<p class="noborder"><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242159">观看视频</a></p>
<p class="noborder"><a href="http://download.microsoft.com/download/0/e/4/0e4998f3-7660-4188-bad5-810e92ff8572/WebCast20050304_Video.zip">下载录影</a><br />
<a href="http://download.microsoft.com/download/4/b/d/4bd80da4-1511-420f-ad3e-852fd8d8d31d/WebCast20050304_PPT.zip">下载代码示例</a></p>
</td>
</tr>
</tbody>
</table>
<p>(4)：构建动态导航的Web应用程序</p>
<p class="noborder">构建动态导航的Web应用程序。在现代的Web应用程序当中，复杂的导航系统也是致使应用代码不断庞涨的重要原因，在ASP.NET 2.0当中，引入了新的导航机制（控件、API以及存储机制）来方便最终开发人员来设计具有导航系统的Web应用程序，并且可以在动应用正常运行时进行配置式的修改。本课程将就此进行探讨。</p>
<table border="0">
<tbody>
<tr>
<td><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://static.asp.net/asp.net/images/mediaplayer/snapshots/50329-cn.gif" alt="" width="110" height="82" /></td>
<td>
<p class="noborder"><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242168">观看视频</a></p>
<p class="noborder"><a href="http://download.microsoft.com/download/8/c/c/8ccb3274-5d8e-40a3-ae1f-3c0a3fe079df/WebCast20050329_Video.zip">下载录影</a><br />
<a href="http://download.microsoft.com/download/4/b/d/4bd80da4-1511-420f-ad3e-852fd8d8d31d/WebCast20050329_PPT.zip">下载代码示例</a></p>
</td>
</tr>
</tbody>
</table>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/ajax-lectures-download.html" title="asp.net ajax视频教程下载">asp.net ajax视频教程下载</a></li><li><a href="http://www.johnzon.cn/aptech-aspnet-download.html" title="北大青鸟ASP.NET视频教程32讲下载">北大青鸟ASP.NET视频教程32讲下载</a></li><li><a href="http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html" title="剖析ASP.NET AJAX的面向对象思想">剖析ASP.NET AJAX的面向对象思想</a></li><li><a href="http://www.johnzon.cn/c-sharp-rule.html" title="解读C＃中的规则表达式">解读C＃中的规则表达式</a></li><li><a href="http://www.johnzon.cn/aspnet-establish-write.html" title="ASP.NET创建文件并写入内容">ASP.NET创建文件并写入内容</a></li><li><a href="http://www.johnzon.cn/jsp-aspnet-session.html" title="JSP与ASP.NET之间的session值共享">JSP与ASP.NET之间的session值共享</a></li><li><a href="http://www.johnzon.cn/aspnet-connect-sqlserver.html" title="ASP.NET2.0连接SQL Server数据库详解">ASP.NET2.0连接SQL Server数据库详解</a></li><li><a href="http://www.johnzon.cn/donet-login-kongjian.html" title="第一次用.net2.0 LOGIN登陆控件的困惑和解决方法">第一次用.net2.0 LOGIN登陆控件的困惑和解决方法</a></li><li><a href="http://www.johnzon.cn/aspnet-web-page-yingyong.html" title="ASP.NET Web Page应用深入探讨">ASP.NET Web Page应用深入探讨</a></li><li><a href="http://www.johnzon.cn/eclipse-video-lectures.html" title="Eclipse开发视频教程">Eclipse开发视频教程</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/aspnet-new-characteristic.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JSP与ASP.NET之间的session值共享</title>
		<link>http://www.johnzon.cn/jsp-aspnet-session.html</link>
		<comments>http://www.johnzon.cn/jsp-aspnet-session.html#comments</comments>
		<pubDate>Tue, 13 May 2008 03:17:55 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Session]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/21491</guid>
		<description><![CDATA[ASP.NET中登录后，JSP可以用ASP.Net中的session的值这个话题刚开始，思路是 ASP.NET中序列化Session以二进制数据保存到数据库，然后由JSP读取数据库中的二进制数据反序列化成Session对象，再强制转化成 JAVA的Session对象，在JAVA端转换时，出现了错误，找遍网上的资料也没能解决，故采用一种替换的方式。
替换的方式的思路：
登录的ASPX文件中，在登录成功后将Session中的变量值保存到数据库中的一张表，关键字使用ASP.NET的Session对象的SessionID， 然后建立一个ASPX文件，取得当前登录用户的SessionID，并使用的ASP.NET重定向语句，转到JSP文件，该URL请求的路径格式为 test.jsp?aspnetsessionid=ffj12d455p0ujr45vdqwhh45，如果ASP.NET没有登录或登录不成功，虽然有SessionID的值，但数据库中是没有该SessionID关联的数据。
可能有的读者发现，不用test.jsp?aspnetsessionid=ffj12d455p0ujr45vdqwhh45这样的请求的路径也可以完成，是的，可以用test.jsp?userid=1111这样的方式也传递值，当然userid是由ASP.NET登陆成功后，取得的值，但这样有些用户就可以知道USERID(用户编号)这个敏感数据了。
建立一张表table name：iis_session field name ：id varchar(26) ——存放ASP.NET的SessionID userid int(4) ——存放登录成功后的用户编号power int(4) ——存放用户的权限编号
ASP.NET程序源码片段：
/*登录成功后，可将下列CODEING放在登录的验证ASPX页面中*/
//记录 Session value 到数据库private void WriteSession2DB(string sessionID，string sUID，string sPWR)
{ //连接数据库代码，读者自行添加string sessID = sessionID; string strSQL = &#8220;insert into iis_session(id，userid，power) values(@seionID，@UID，@PWR)&#8221;;
//webmod.sqlConn是数据库的连接对象，读者自行替换成自己的数据库连接SqlCommand sqlCmd = new SqlCommand(strSQL，webmod.sqlConn); sqlCmd.Parameters.Add(&#8220;@seionID&#8221;，SqlDbType.VarChar)。Value = sessID; sqlCmd.Parameters.Add(&#8220;@UID&#8221;， SqlDbType.Int )。Value = Convert.ToInt32(sUID.Trim()); sqlCmd.Parameters.Add(&#8220;@PWR&#8221;， SqlDbType.Int)。Value = Convert.ToInt32(sPWR.Trim()); sqlCmd.ExecuteNonQuery(); //关闭数据库连接，读者自行添加
}
/*当用户退出系统，将数据库中对应的SessionID的一行数据删除，可放在退出页面，或Global.asax的Session_END过程中*/
//删除数据库中的 Session value [...]]]></description>
			<content:encoded><![CDATA[<p>ASP.NET中登录后，JSP可以用ASP.Net中的session的值这个话题刚开始，思路是 ASP.NET中序列化Session以二进制数据保存到数据库，然后由JSP读取数据库中的二进制数据反序列化成Session对象，再强制转化成 JAVA的Session对象，在JAVA端转换时，出现了错误，找遍网上的资料也没能解决，故采用一种替换的方式。</p>
<p>替换的方式的思路：</p>
<p>登录的ASPX文件中，在登录成功后将Session中的变量值保存到数据库中的一张表，关键字使用ASP.NET的Session对象的SessionID， 然后建立一个ASPX文件，取得当前登录用户的SessionID，并使用的ASP.NET重定向语句，转到JSP文件，该URL请求的路径格式为 test.jsp?aspnetsessionid=ffj12d455p0ujr45vdqwhh45，如果ASP.NET没有登录或登录不成功，虽然有SessionID的值，但数据库中是没有该SessionID关联的数据。</p>
<p><span id="more-43"></span>可能有的读者发现，不用test.jsp?aspnetsessionid=ffj12d455p0ujr45vdqwhh45这样的请求的路径也可以完成，是的，可以用test.jsp?userid=1111这样的方式也传递值，当然userid是由ASP.NET登陆成功后，取得的值，但这样有些用户就可以知道USERID(用户编号)这个敏感数据了。</p>
<p>建立一张表table name：iis_session field name ：id varchar(26) ——存放ASP.NET的SessionID userid int(4) ——存放登录成功后的用户编号power int(4) ——存放用户的权限编号</p>
<p>ASP.NET程序源码片段：</p>
<p>/*登录成功后，可将下列CODEING放在登录的验证ASPX页面中*/</p>
<p>//记录 Session value 到数据库private void WriteSession2DB(string sessionID，string sUID，string sPWR)</p>
<p>{ //连接数据库代码，读者自行添加string sessID = sessionID; string strSQL = &#8220;insert into iis_session(id，userid，power) values(@seionID，@UID，@PWR)&#8221;;</p>
<p>//webmod.sqlConn是数据库的连接对象，读者自行替换成自己的数据库连接SqlCommand sqlCmd = new SqlCommand(strSQL，webmod.sqlConn); sqlCmd.Parameters.Add(&#8220;@seionID&#8221;，SqlDbType.VarChar)。Value = sessID; sqlCmd.Parameters.Add(&#8220;@UID&#8221;， SqlDbType.Int )。Value = Convert.ToInt32(sUID.Trim()); sqlCmd.Parameters.Add(&#8220;@PWR&#8221;， SqlDbType.Int)。Value = Convert.ToInt32(sPWR.Trim()); sqlCmd.ExecuteNonQuery(); //关闭数据库连接，读者自行添加</p>
<p>}</p>
<p>/*当用户退出系统，将数据库中对应的SessionID的一行数据删除，可放在退出页面，或Global.asax的Session_END过程中*/</p>
<p>//删除数据库中的 Session value private void RemoveSession4DB()</p>
<p>{ //连接数据库代码，读者自行添加string sessID = Session.SessionID; string strSQL = &#8220;delete from iis_session where id=&#8217;&#8221;+sessID+&#8221;&#8216;&#8221;;</p>
<p>//webmod.sqlConn是数据库的连接对象，读者自行替换成自己的数据库连接SqlCommand sqlCmd = new SqlCommand(strSQL，webmod.sqlConn); sqlCmd.ExecuteNonQuery(); //关闭数据库连接，读者自行添加}</p>
<p>/*一个重定向到JSP的ASPX页面，在这个ASPX页面的PAGE_LOAD中添加如下代码*/ private void Page_Load(object sender， System.EventArgs e)</p>
<p>{ string strSessionID = Session.SessionID.Trim(); String strRoot = &#8220;http://localhost/test.jsp?aspnetsessionid=&#8221;+strSessionID; Response.Redirect(strRoot，true); }</p>
<p>JSP程序源码片段：&lt; %@ page contentType=&#8221;text/html; charset=gb2312&#8243;%&gt; &lt; % /*自己的数据库连接类，用户可以自己替换*/ %&gt; &lt; jsp：useBean id=&#8221;db&#8221; scope=&#8221;page&#8221; class=&#8221;com.itbaby.bean.dbx.database&#8221;/&gt;</p>
<p>&lt; %</p>
<p>String sASPNetSessionID=request.getParameter(&#8220;aspnetsessionid&#8221;);</p>
<p>//使用了连接池连接数据库，用户可以替换成自己的String sDBSourceName=&#8221;itbaby_dbpool&#8221;; db.dbConnOpen(sDBSourceName);</p>
<p>String sSql=&#8221;select userid，power from iis_session where id=&#8217;&#8221;+sASPNetSessionID+&#8221;&#8216;&#8221;;</p>
<p>//读者自己替换读出结果集的代码java.sql.ResultSet rs=db.getRs(sSql);</p>
<p>if(rs.next())</p>
<p>{</p>
<p>String sUID = rs.getString(1); String sPower = rs.getString(2);</p>
<p>/*将数据库中对应的SESSIONID的值读出来，并显示，如果ASP.NET的SESSION超时，将没有值*/ out.print(&#8220;&lt; H1&gt;ASP.Net Session Value UserID = &#8220;+sUID+&#8221;&lt; /H1&gt;&lt; br&gt;&lt; br&gt;&#8221;); out.print(&#8220;&lt; H1&gt;ASP.Net Session Value Power = &#8220;+sPower+&#8221;&lt; /H1&gt;&lt; br&gt;&lt; br&gt;&#8221;);</p>
<p>} rs.close();</p>
<p>db.dbConnClose();</p>
<p>%&gt;</p>
<p>好了，虽然不是很好的方法，但也可以用，也同样保护了用户的一些敏感数据我将继续考虑使用序列化和反序列化的方式来达到不同的WEB语言之间共享Session对象而不是上面的，共享Session的值</p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html" title="剖析ASP.NET AJAX的面向对象思想">剖析ASP.NET AJAX的面向对象思想</a></li><li><a href="http://www.johnzon.cn/c-sharp-rule.html" title="解读C＃中的规则表达式">解读C＃中的规则表达式</a></li><li><a href="http://www.johnzon.cn/aspnet-establish-write.html" title="ASP.NET创建文件并写入内容">ASP.NET创建文件并写入内容</a></li><li><a href="http://www.johnzon.cn/aspnet-new-characteristic.html" title="ASP.NET新特性系列讲座">ASP.NET新特性系列讲座</a></li><li><a href="http://www.johnzon.cn/aspnet-connect-sqlserver.html" title="ASP.NET2.0连接SQL Server数据库详解">ASP.NET2.0连接SQL Server数据库详解</a></li><li><a href="http://www.johnzon.cn/donet-login-kongjian.html" title="第一次用.net2.0 LOGIN登陆控件的困惑和解决方法">第一次用.net2.0 LOGIN登陆控件的困惑和解决方法</a></li><li><a href="http://www.johnzon.cn/aspnet-web-page-yingyong.html" title="ASP.NET Web Page应用深入探讨">ASP.NET Web Page应用深入探讨</a></li><li><a href="http://www.johnzon.cn/ajax-lectures-download.html" title="asp.net ajax视频教程下载">asp.net ajax视频教程下载</a></li><li><a href="http://www.johnzon.cn/regularexpressionvalidator-rule.html" title="RegularExpressionValidator控件中正则表达式用法">RegularExpressionValidator控件中正则表达式用法</a></li><li><a href="http://www.johnzon.cn/aptech-aspnet-download.html" title="北大青鸟ASP.NET视频教程32讲下载">北大青鸟ASP.NET视频教程32讲下载</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/jsp-aspnet-session.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2008 Service Pack 1 BETA发布</title>
		<link>http://www.johnzon.cn/visual-studio-2008-sp1-release.html</link>
		<comments>http://www.johnzon.cn/visual-studio-2008-sp1-release.html#comments</comments>
		<pubDate>Tue, 13 May 2008 03:11:23 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>
		<category><![CDATA[VSsp1]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/21479</guid>
		<description><![CDATA[Visual Studio 2008 SP1 提供了对Visual Studio 2008的各项改进，支持SQL Server  2008和ADO.NET的新特性Entity Framework，许多WPF设计器的改进，Silverlight 项目的WCF模板，.NET  Framework的symbols和代码调试支持，控件的改进和增加新的控件（例如Windows From的DataRepeater控件和支持 C++Office  2007 Ribbons ），以及许多的泛型调试和智能感知的支持。这个补丁包还包括改善Visual Studio  的稳定性，性能和安全性。
下载地址：
VS  2008 SP1 :  直接下载
.NET 3.5 SP1 : 直接下载
Express 2008 with SP1:
http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F8D35FB150F12/vbsetup.exe
http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vcsetup.exe
http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vcssetup.exe
http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vnssetup.exe
TFS 2008 SP1:  http://download.microsoft.com/download/a/e/2/ae2eb0ff-e687-4221-9c3e-9165a942bc1c/TFS90sp1-KB949786.exe
另附VS2008 中文简体正式破解版：下载 
Copyright © 2007-2009 JohnZon 世界Visual Studio 2008中文正式版下载和破解]]></description>
			<content:encoded><![CDATA[<p>Visual Studio 2008 SP1 提供了对Visual Studio 2008的各项改进，支持SQL Server  2008和ADO.NET的新特性Entity Framework，许多WPF设计器的改进，Silverlight 项目的WCF模板，.NET  Framework的symbols和代码调试支持，控件的改进和增加新的控件（例如Windows From的DataRepeater控件和支持 C++Office  2007 Ribbons ），以及许多的泛型调试和智能感知的支持。这个补丁包还包括改善Visual Studio  的稳定性，性能和安全性。</p>
<p><span id="more-42"></span>下载地址：</p>
<p>VS  2008 SP1 :  <a href="http://download.microsoft.com/download/7/3/8/7382EA08-4DD6-4134%20%20-9B92-8585A5B07973/VS90sp1-KB945140-ENU.exe" title="VS 2008 SP1">直接下载</a><br />
.NET 3.5 SP1 : <a href="http://download.microsoft.com/download/8/f/c/8fc1fe13-55de-4bf5-b43e-375%20%20daf01452e/dotNetFx35setup.exe" title=".NET 3.5 SP1">直接下载</a><br />
Express 2008 with SP1:<br />
<a href="http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F8D35FB150F12/vbsetup.exe">http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F8D35FB150F12/vbsetup.exe</a><br />
<a href="http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vcsetup.exe">http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vcsetup.exe</a><br />
<a href="http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vcssetup.exe">http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vcssetup.exe</a><br />
<a href="http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vnssetup.exe">http://download.microsoft.com/download/F/E/7/FE754BA4-140B-413C-933F-8D35FB150F12/vnssetup.exe</a><br />
TFS 2008 SP1:  <a href="http://download.microsoft.com/download/a/e/2/ae2eb0ff-e687-4221-9c3e-9165a942bc1c/TFS90sp1-KB949786.exe">http://download.microsoft.com/download/a/e/2/ae2eb0ff-e687-4221-9c3e-9165a942bc1c/TFS90sp1-KB949786.exe</a></p>
<p>另附VS2008 中文简体正式破解版：<a href="http://www.johnzon.cn/visual-studio-2008-crack-download.html" title="VS 2008 破解版">下载 </a></p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/visual-studio-2008-crack-download.html" title="Visual Studio 2008中文正式版下载和破解">Visual Studio 2008中文正式版下载和破解</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/visual-studio-2008-sp1-release.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C#技巧：网页表单自动填写技术(gmail为例)</title>
		<link>http://www.johnzon.cn/c-sharp-webpage-form.html</link>
		<comments>http://www.johnzon.cn/c-sharp-webpage-form.html#comments</comments>
		<pubDate>Mon, 12 May 2008 06:49:01 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[网页表单]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/21478</guid>
		<description><![CDATA[var ie=WScript.createobject(&#8220;InternetExplorer.Application&#8221;);
var args = WScript.arguments;
var followme=&#8221;http://www.google.com/&#8221;;
if(args.length&#62;0)
{ followme+=args(0);}
ie.Navigate(&#8220;https://www.google.com/accounts/Login?continue=&#8221;+followme);SynchronizeIE();
var doc=ie.document;
doc.forms[0].Email.value=&#8221;http://www.bokemx.com/lixianmin@gmail.com&#8221;;
doc.forms[0].Passwd.value=&#8221;密码写在这里&#8221;;
//这是因为PersistentCookie这个checkbox有时候有而有时候没有。
if(doc.forms [0].PersistentCookie!=null)
{doc.forms[0].PersistentCookie.checked=false;}
doc.forms[0].submit();
SynchronizeIE();
ie.Visible=true;
//等待IE操作结束。
function SynchronizeIE()
{
while(ie.Busy)
{
WScript.Sleep(100);
}
}
假定把该文件保存为googleSpecific.js，存放在%windir%\system32路径下，并建立如下内容的一个
google.bat文件同样放在%windir%\system32路径下。
@cls
@wscript %windir%\system32\googleSpecific.js %1 %2 %3 %4 %5 %6 %7 %8 %9
然后，在命令行执行语句：go mail，就可以直接登陆到你的gmail了。
如果直接输入go而不接任何内容的话，则会以你的名义登陆到google.com首页。另外，googleSpecific.js最好用 screnc.exe进行加密，加密后的文件格式是.jse，但即使是这样也不能保证文件中的密码不被别人看到（scrdec可以进行解密）。
更好的保密手段还请各位多提意见
Copyright © 2007-2009 JohnZon 世界解读C＃中的规则表达式C#与数据结构—二叉树的遍历精解]]></description>
			<content:encoded><![CDATA[<p>var ie=WScript.createobject(&#8220;InternetExplorer.Application&#8221;);<br />
var args = WScript.arguments;<br />
var followme=&#8221;http://www.google.com/&#8221;;<br />
if(args.length&gt;0)<br />
{ followme+=args(0);}<br />
ie.Navigate(&#8220;https://www.google.com/accounts/Login?continue=&#8221;+followme);SynchronizeIE();<br />
var doc=ie.document;<br />
doc.forms[0].Email.value=&#8221;http://www.bokemx.com/lixianmin@gmail.com&#8221;;<br />
doc.forms[0].Passwd.value=&#8221;密码写在这里&#8221;;</p>
<p><span id="more-40"></span>//这是因为PersistentCookie这个checkbox有时候有而有时候没有。<br />
if(doc.forms [0].PersistentCookie!=null)<br />
{doc.forms[0].PersistentCookie.checked=false;}<br />
doc.forms[0].submit();<br />
SynchronizeIE();<br />
ie.Visible=true;</p>
<p>//等待IE操作结束。<br />
function SynchronizeIE()<br />
{<br />
while(ie.Busy)<br />
{<br />
WScript.Sleep(100);<br />
}<br />
}<br />
假定把该文件保存为googleSpecific.js，存放在%windir%\system32路径下，并建立如下内容的一个</p>
<p>google.bat文件同样放在%windir%\system32路径下。</p>
<p>@cls</p>
<p>@wscript %windir%\system32\googleSpecific.js %1 %2 %3 %4 %5 %6 %7 %8 %9</p>
<p>然后，在命令行执行语句：go mail，就可以直接登陆到你的gmail了。</p>
<p>如果直接输入go而不接任何内容的话，则会以你的名义登陆到google.com首页。另外，googleSpecific.js最好用 screnc.exe进行加密，加密后的文件格式是.jse，但即使是这样也不能保证文件中的密码不被别人看到（scrdec可以进行解密）。<br />
更好的保密手段还请各位多提意见</p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/c-sharp-rule.html" title="解读C＃中的规则表达式">解读C＃中的规则表达式</a></li><li><a href="http://www.johnzon.cn/c-sharp-data-structure.html" title="C#与数据结构—二叉树的遍历精解">C#与数据结构—二叉树的遍历精解</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/c-sharp-webpage-form.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET2.0连接SQL Server数据库详解</title>
		<link>http://www.johnzon.cn/aspnet-connect-sqlserver.html</link>
		<comments>http://www.johnzon.cn/aspnet-connect-sqlserver.html#comments</comments>
		<pubDate>Mon, 12 May 2008 06:44:03 +0000</pubDate>
		<dc:creator>johnzon</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[sql server]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.johnzon.cn/archives/21477</guid>
		<description><![CDATA[本文将详细介绍如何使用Connection对象连接数据库。对于不同的.NET数据提供者，ADO.NET采用不同的Connection对象连接数据库。这些Connection对象为我们屏蔽了具体的实现细节，并提供了一种统一的实现方法。
Connection类有四种：SqlConnection，OleDbConnection，OdbcConnection和OracleConnection。
SqlConnection类的对象连接SQL  Server数据库；OracleConnection 类的对象连接Oracle数据库；
OleDbConnection类的对象连接支持OLE  DB的数据库，如Access；而OdbcConnection类的对象连接任何支持ODBC的数据库。与数据库的所有通讯最终都是通过Connection对象来完成的。
SqlConnection类
Connection  用于与数据库“对话”，并由特定提供程序的类（如 SqlConnection）表示。尽管SqlConnection类是针对Sql  Server的，但是这个类的许多属性、方法与事件和OleDbConnection及OdbcConnection等类相似。本章将重点讲解  SqlConnection特定的属性与方法，其他的Connection类你可以参考相应的帮助文档。
注意：使用不同的  Connection对象需要导入不同的命名空间。OleDbConnection的命名空间为System.Data.OleDb。  SqlConnection的命名空间为System.Data.SqlClient。OdbcConnection的命名空间为  System.Data.Odbc。OracleConnection的命名空间为System.Data.OracleClinet。
SqlConnection属性：



属性
说明


ConnectionString
其返回类型为string,获取或设置用于打开 SQL Server 数据库的字符串。


ConnectionTimeOut
其返回类型为int,获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。


Database
其返回类型为string,获取当前数据库或连接打开后要使用的数据库的名称。


DataSource
其返回类型为string,获取要连接的 SQL Server 实例的名称。


State
其返回类型为ConnectionState,取得当前的连接状态：Broken、Closed、Connecting、Fetching或Open。


ServerVersion
其返回类型为string,获取包含客户端连接的 SQL Server 实例的版本的字符串。


PacketSize
获取用来与 SQL Server  的实例通信的网络数据包的大小（以字节为单位）。这个属性只适用于SqlConnection类型



SqlConnection方法：



方法
说明


Close()
其返回类型为void,关闭与数据库的连接。


CreateCommand()
其返回类型为SqlCommand,创建并返回一个与 SqlConnection 关联的 SqlCommand 对象。


Open()
其返回类型为void,用连接字符串属性指定的属性打开数据库连接



SqlConnection事件：



事件
说明


StateChange
当事件状态更改时发生。 （从 DbConnection 继承。）


InfoMessage
当 SQL Server 返回一个警告或信息性消息时发生。



提示：可以用事件让一个对象以某种方式通知另一对象产生某些事情。例如我们在Windows系统中选择“开始”菜单，一旦单击鼠标时，就发生了一个事件，通知操作系统将“开始”菜单显示出来。
使用SqlConnection对象连接SQL  Server数据库
我们可以用SqlConnection()构造函数生成一个新的SqlConnection对象。这个函数是重载的，即我们可以调用构造函数的不同版本。SqlConnection()的构造函数如下表所示：



构造函数
说明


SqlConnection ()
初始化 SqlConnection 类的新实例。


SqlConnection (String)
如果给定包含连接字符串的字符串，则初始化 SqlConnection 类的新实例。



程序代码说明：在上述语法范例的程序代码中，我们通过使用“new“关键字生成了一个新的SqlConnection对象，并且将其命名为mySqlConnection。
现在我们就可以使用如下两种方式连接数据库，即采用集成的Windows验证和使用Sql  Server身份验证进行数据库的登录。
集成的Windows身份验证语法范例
string  connectionString=&#8221;server=localhost;database=Northwind;
integrated  [...]]]></description>
			<content:encoded><![CDATA[<p>本文将详细介绍如何使用Connection对象连接数据库。对于不同的.NET数据提供者，ADO.NET采用不同的Connection对象连接数据库。这些Connection对象为我们屏蔽了具体的实现细节，并提供了一种统一的实现方法。</p>
<p>Connection类有四种：SqlConnection，OleDbConnection，OdbcConnection和OracleConnection。</p>
<p>SqlConnection类的对象连接SQL  Server数据库；OracleConnection 类的对象连接Oracle数据库；</p>
<p>OleDbConnection类的对象连接支持OLE  DB的数据库，如Access；而OdbcConnection类的对象连接任何支持ODBC的数据库。与数据库的所有通讯最终都是通过Connection对象来完成的。</p>
<p>SqlConnection类</p>
<p>Connection  用于与数据库“对话”，并由特定提供程序的类（如 SqlConnection）表示。尽管SqlConnection类是针对Sql  Server的，但是这个类的许多属性、方法与事件和OleDbConnection及OdbcConnection等类相似。本章将重点讲解  SqlConnection特定的属性与方法，其他的Connection类你可以参考相应的帮助文档。</p>
<p>注意：使用不同的  Connection对象需要导入不同的命名空间。OleDbConnection的命名空间为System.Data.OleDb。  SqlConnection的命名空间为System.Data.SqlClient。OdbcConnection的命名空间为  System.Data.Odbc。OracleConnection的命名空间为System.Data.OracleClinet。</p>
<p><span id="more-39"></span>SqlConnection属性：</p>
<table border="1" cellspacing="0" cellpadding="0" width="90%">
<tbody>
<tr>
<td>属性</td>
<td>说明</td>
</tr>
<tr>
<td>ConnectionString</td>
<td>其返回类型为string,获取或设置用于打开 SQL Server 数据库的字符串。</td>
</tr>
<tr>
<td>ConnectionTimeOut</td>
<td>其返回类型为int,获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。</td>
</tr>
<tr>
<td>Database</td>
<td>其返回类型为string,获取当前数据库或连接打开后要使用的数据库的名称。</td>
</tr>
<tr>
<td>DataSource</td>
<td>其返回类型为string,获取要连接的 SQL Server 实例的名称。</td>
</tr>
<tr>
<td>State</td>
<td>其返回类型为ConnectionState,取得当前的连接状态：Broken、Closed、Connecting、Fetching或Open。</td>
</tr>
<tr>
<td>ServerVersion</td>
<td>其返回类型为string,获取包含客户端连接的 SQL Server 实例的版本的字符串。</td>
</tr>
<tr>
<td>PacketSize</td>
<td>获取用来与 SQL Server  的实例通信的网络数据包的大小（以字节为单位）。这个属性只适用于SqlConnection类型</td>
</tr>
</tbody>
</table>
<p>SqlConnection方法：</p>
<table border="1" cellspacing="0" cellpadding="0" width="90%">
<tbody>
<tr>
<td>方法</td>
<td>说明</td>
</tr>
<tr>
<td>Close()</td>
<td>其返回类型为void,关闭与数据库的连接。</td>
</tr>
<tr>
<td>CreateCommand()</td>
<td>其返回类型为SqlCommand,创建并返回一个与 SqlConnection 关联的 SqlCommand 对象。</td>
</tr>
<tr>
<td>Open()</td>
<td>其返回类型为void,用连接字符串属性指定的属性打开数据库连接</td>
</tr>
</tbody>
</table>
<p>SqlConnection事件：</p>
<table border="1" cellspacing="0" cellpadding="0" width="90%">
<tbody>
<tr>
<td>事件</td>
<td>说明</td>
</tr>
<tr>
<td>StateChange</td>
<td>当事件状态更改时发生。 （从 DbConnection 继承。）</td>
</tr>
<tr>
<td>InfoMessage</td>
<td>当 SQL Server 返回一个警告或信息性消息时发生。</td>
</tr>
</tbody>
</table>
<p>提示：可以用事件让一个对象以某种方式通知另一对象产生某些事情。例如我们在Windows系统中选择“开始”菜单，一旦单击鼠标时，就发生了一个事件，通知操作系统将“开始”菜单显示出来。</p>
<p><span style="font-weight: bold">使用SqlConnection对象连接SQL  Server数据库</span></p>
<p>我们可以用SqlConnection()构造函数生成一个新的SqlConnection对象。这个函数是重载的，即我们可以调用构造函数的不同版本。SqlConnection()的构造函数如下表所示：</p>
<table border="1" cellspacing="0" cellpadding="0" width="90%">
<tbody>
<tr>
<td>构造函数</td>
<td>说明</td>
</tr>
<tr>
<td>SqlConnection ()</td>
<td>初始化 SqlConnection 类的新实例。</td>
</tr>
<tr>
<td>SqlConnection (String)</td>
<td>如果给定包含连接字符串的字符串，则初始化 SqlConnection 类的新实例。</td>
</tr>
</tbody>
</table>
<p>程序代码说明：在上述语法范例的程序代码中，我们通过使用“new“关键字生成了一个新的SqlConnection对象，并且将其命名为mySqlConnection。</p>
<p>现在我们就可以使用如下两种方式连接数据库，即采用集成的Windows验证和使用Sql  Server身份验证进行数据库的登录。</p>
<p>集成的Windows身份验证语法范例</p>
<p class="code">string  connectionString=&#8221;server=localhost;database=Northwind;</p>
<p>integrated  security=SSPI&#8221;;</p>
<p>程序代码说明：在上述语法范例的程序代码中，我们设置了一个针对Sql  Server数据库的连接字符串。其中server表示运行Sql  Server的计算机名，由于在本书中，ASP.NET程序和数据库系统是位于同一台计算机的，所以我们可以用localhost取代当前的计算机名。database表示所使用的数据库名，这里设置为Sql  Server自带的一个示例数据库&#8211;Northwind。由于我们希望采用集成的Windows验证方式，所以设置 integrated  security为SSPI即可。</p>
<p>Sql Server 2005中的Windows身份验证模式如下：</p>
<p>0 &amp;&amp;  image.height&gt;0){if(image.width&gt;=700){this.width=700;this.height=image.height*700/image</p>
<p>.width;</p>
<p>}}&#8221;  src=&#8221;http://www.ninedns.com/images/tech/images/A526_IMG200747_1.jpg&#8221;&gt;</p>
<p>注意：在使用集成的Windows验证方式时，并不需要我们输入用户名和口令，而是把登录Windows时输入的用户名和口令传递到Sql  Server。然后Sql Server检查用户清单，检查其是否具有访问数据库的权限。而且数据库连接字符串是不区分大小写的。</p>
<p>采用Sql  Server身份验证的语法范例</p>
<p class="code">string connectionString =  &#8220;server=localhost;database=Northwind;uid=sa;pwd=sa&#8221;;</p>
<p>程序代码说明：在上述语法范例的程序代码中，采用了使用已知的用户名和密码验证进行数据库的登录。uid为指定的数据库用户名，pwd为指定的用户口令。为了安全起见，一般不要在代码中包括用户名和口令，你可以采用前面的集成的Windows验证方式或者对Web.Config文件中的连接字符串加密的方式提高程序的安全性。</p>
<p>Sql  Server 2005中的Sql Server身份验证模式如下：</p>
<p>0 &amp;&amp;  image.height&gt;0){if(image.width&gt;=700){this.width=700;this.height=image.height*700/image.</p>
<p>width;}}&#8221;  src=&#8221;http://www.ninedns.com/images/tech/images/A526_IMG200747_2.jpg&#8221;&gt;</p>
<p>如果你使用其他的数据提供者的话，所产生的连接字符串也具有相类似的形式。例如我们希望以OLE  DB的方式连接到一个Oracle数据库，其连接字符串如下：</p>
<p class="code">string connectionString = &#8220;data source=localhost;initial  catalog=Sales;</p>
<p>use  id=sa;password=;provider=MSDAORA&#8221;;</p>
<p>程序代码说明：在上述语法范例的程序代码中，通过专门针对Oracle数据库的OLE  DB提供程序，实现数据库的连接。data source 表示运行Oracle数据库的计算机名，initial  catalog表示所使用的数据库名。provider表示使用的OLE  DB提供程序为MSDAORA。</p>
<p>Access数据库的连接字符串的形式如下：</p>
<p class="code">string connectionString =  &#8220;provider=Microsoft.Jet.OLEDB.4.0；</p>
<p>@”data  source=c:\DataSource\Northwind.mdb”;</p>
<p>程序代码说明：在上述语法范例的程序代码中，通过专门针对Access数据库的OLE  DB提供程序，实现数据库的连接。这使用的的OLE  DB提供程序为Microsoft.Jet.OLEDB.4.0，并且数据库存放在c:\DataSource目录下，其数据库文件为Northwind.mdb。</p>
<p>现在我们就可以将数据库连接字符串传人SqlConnection()构造函数，例如：</p>
<p class="code">string connectionString =  &#8220;server=localhost;database=Northwind;uid=sa;pwd=sa&#8221;;</p>
<p>SqlConnection  mySqlConnection = new SqlConnection(connectionString);</p>
<p>或者写成</p>
<p class="code">SqlConnection mySqlConnection =new  SqlConnection(</p>
<p>&#8220;server=localhost;database=Northwind;uid=sa;pwd=sa&#8221;);</p>
<p>在前面的范例中，通过使用“new“关键字生成了一个新的SqlConnection对象。因此我们也可以设置该对象的ConnectionString属性，为其指定一个数据库连接字符串。这和将数据库连接字符串传人SqlConnection()构造函数的功能是一样的。</p>
<p class="code">SqlConnection mySqlConnection = new  SqlConnection();</p>
<p>mySqlConnection.ConnectionString =  &#8220;server=localhost;database=Northwind;uid=sa;pwd=sa&#8221;;</p>
<p>注意：只能在关闭Connection对象时设置ConnectionString属性。　　<span style="font-weight: bold">打开和关闭数据库连接</span></p>
<p>生成Connection对象并将其设置ConnectionString属性设置为数据库连接的相应细节之后，就可以打开数据库连接。为此可以调用Connection对象的Open()方法。其方法如下：</p>
<p class="code">mySqlConnection.Open();</p>
<p>完成数据库的连接之后，我们可以调用Connection对象的Close()方法关闭数据库连接。例如：</p>
<p class="code">mySqlConnection.Close();</p>
<p>下面是一个显示如何用SqlConnection对象连接Sql  Server Northwind数据库的实例程序，并且显示该SqlConnection对象的一些属性。</p>
<p>范例程序代码如下：</p>
<p class="code">01 public partial class _Default : System.Web.UI.Page</p>
<p>02  {</p>
<p>03 protected void Page_Load(object sender, EventArgs e)</p>
<p>04 {</p>
<p>05  //建立数据库连接字符串</p>
<p>06 string connectionString =  &#8220;server=localhost;database=Northwind;</p>
<p>07 integrated security=SSPI&#8221;;</p>
<p>08  //将连接字符串传入SqlConnection对象的构造函数中</p>
<p>09 SqlConnection mySqlConnection = new  SqlConnection(connectionString);</p>
<p>10 try</p>
<p>11 {</p>
<p>12 //打开连接</p>
<p>13  mySqlConnection.Open();</p>
<p>14  //利用label控件显示mySqlConnection对象的ConnectionString属性</p>
<p>15 lblInfo.Text =  &#8220;＜b＞mySqlConnection对象的ConnectionString属性为：＜b＞&#8221; +</p>
<p>16  mySqlConnection.ConnectionString + &#8220;＜br＞&#8221;;</p>
<p>17 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的ConnectionTimeout属性为＜b＞&#8221; +</p>
<p>18  mySqlConnection.ConnectionTimeout + &#8220;＜br＞&#8221;;</p>
<p>19 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的Database属性为＜b＞&#8221; +</p>
<p>20 mySqlConnection.Database +  &#8220;＜br＞&#8221;;</p>
<p>21 lblInfo.Text += &#8220;＜b＞mySqlConnection对象的DataSource属性为＜b＞&#8221; +</p>
<p>22  mySqlConnection.DataSource + &#8220;＜br＞&#8221;;</p>
<p>23 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的PacketSize属性为＜b＞&#8221; +</p>
<p>24 mySqlConnection.PacketSize +  &#8220;＜br＞&#8221;;</p>
<p>25 lblInfo.Text += &#8220;＜b＞mySqlConnection对象的ServerVersion属性为＜b＞&#8221; +</p>
<p>26 mySqlConnection.ServerVersion + &#8220;＜br＞&#8221;;</p>
<p>27 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的当前状态为＜b＞&#8221; +</p>
<p>28 mySqlConnection.State + &#8220;＜br＞&#8221;;</p>
<p>29  }</p>
<p>30 catch (Exception err)</p>
<p>31 {</p>
<p>32 lblInfo.Text = &#8220;读取数据库出错&#8221;;</p>
<p>33  lblInfo.Text += err.Message;</p>
<p>34 }</p>
<p>35 finally</p>
<p>36 {</p>
<p>37  //关闭与数据库的连接</p>
<p>38 mySqlConnection.Close();</p>
<p>39 lblInfo.Text +=  &#8220;＜br＞＜b＞关闭连接后的mySqlConnection对象的状态为：＜/b＞&#8221;;</p>
<p>40 lblInfo.Text +=  mySqlConnection.State.ToString();</p>
<p>41 }</p>
<p>42 }</p>
<p>43  }</p>
<p>程序代码说明：在上述范例的程序代码中，我们利用try catch  finally对数据库连接进行异常处理。当无法连接数据库时将抛出异常，并显示出错信息，见catch代码块所示。在此程序中，无论是否发生异常，都可以通过finally区块关闭数据库的连接，从而节省计算机资源，提高了程序的效率和可扩展性。</p>
<p>执行结果：</p>
<p>0 &amp;&amp;  image.height&gt;0){if(image.width&gt;=700){this.width=700;this.height=image.height*700/image.</p>
<p>width;</p>
<p>}}&#8221;  src=&#8221;http://www.ninedns.com/images/tech/images/A526_IMG200747_3.jpg&#8221;&gt;</p>
<p>当然，我们还可以采用一种更加简便的方法来实现上述程序的功能。这就是将SqlConnection对象包含到using区块中，这样程序会自动调用  Dispose()方法释放SqlConnection对象所占用的系统资源，无需再使用SqlConnection对象的Close()方法。</p>
<p>范例程序代码如下：</p>
<p class="code">01 public partial class _Default : System.Web.UI.Page</p>
<p>02  {</p>
<p>03 protected void Page_Load(object sender, EventArgs e)</p>
<p>04 {</p>
<p>05  string connectionString = &#8220;server=localhost;database=Northwind;</p>
<p>06 integrated  security=SSPI&#8221;;</p>
<p>07 SqlConnection mySqlConnection = new  SqlConnection(connectionString);</p>
<p>08 using (mySqlConnection)</p>
<p>09 {</p>
<p>10  mySqlConnection.Open();</p>
<p>11 lblInfo.Text =  &#8220;＜b＞mySqlConnection对象的ConnectionString属性为：＜b＞&#8221; +</p>
<p>12  mySqlConnection.ConnectionString + &#8220;＜br＞&#8221;;</p>
<p>13 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的ConnectionTimeout属性为＜b＞&#8221; +</p>
<p>14  mySqlConnection.ConnectionTimeout + &#8220;＜br＞&#8221;;</p>
<p>15 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的Database属性为＜b＞&#8221; +</p>
<p>16 mySqlConnection.Database +  &#8220;＜br＞&#8221;;</p>
<p>17 lblInfo.Text += &#8220;＜b＞mySqlConnection对象的DataSource属性为＜b＞&#8221; +</p>
<p>18  mySqlConnection.DataSource + &#8220;＜br＞&#8221;;</p>
<p>19 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的PacketSize属性为＜b＞&#8221; +</p>
<p>20 mySqlConnection.PacketSize +  &#8220;＜br＞&#8221;;</p>
<p>21 lblInfo.Text += &#8220;＜b＞mySqlConnection对象的ServerVersion属性为＜b＞&#8221; +</p>
<p>22 mySqlConnection.ServerVersion + &#8220;＜br＞&#8221;;</p>
<p>23 lblInfo.Text +=  &#8220;＜b＞mySqlConnection对象的当前状态为＜b＞&#8221;+</p>
<p>24 mySqlConnection.State + &#8220;＜br＞&#8221;;</p>
<p>25  }</p>
<p>26 lblInfo.Text += &#8220;＜br＞＜b＞关闭连接后的mySqlConnection对象的状态为：＜/b＞&#8221;;</p>
<p>27  lblInfo.Text += mySqlConnection.State.ToString();</p>
<p>28 }</p>
<p>29  }</p>
<p>程序代码说明：在上述范例的程序代码中，采用using(mySqlConnection)的形式使得代码更加简洁，并且其最大的优点就是无需编写finally区块代码，可以自动关闭与数据库的连接。　　<span style="font-weight: bold">连接池</span></p>
<p>打开与关闭数据库都是比较耗时的。为此，ADO.NET自动将数据库连接存放在连接池中。连接池可以大幅度提高程序的性能和效率，因为我们不必等待建立全新的数据库连接过程，而是直接利用现成的数据库连接。注意，利用Close()方法关闭连接时，并不是实际关闭连接，而是将连接标为未用，放在连接池中，准备下一次复用。</p>
<p>如果在连接字符串中提供相同的细节，即相同的数据库，用户名，密码等等，则可以直接取得并返回池中的连接。然后可以用这个连接访问数据库。</p>
<p>使用SqlConnection对象时，可以在连接字符串中指定max  pool size，表示连接池允许的最大连接数（默认为100）,也可以指定min pool  size表示连接池允许的最小连接数（默认为0）。下面的代码指定了SqlConnection对象的max pool size为10，min pool  size为5。</p>
<p class="code">SqlConnection mySqlConnection = new  SqlConnection(&#8220;server=localhost;database=Northwind;</p>
<p>integrated  security=SSPI;&#8221;+&#8221;max pool size=10;min pool  size=5&#8243;);</p>
<p>程序代码说明：在上述范例的程序代码中，程序最初在池中生成5个SqlConnection对象。池中可以存储最多10个SqlConnection对象。如果要打开新的SqlConnection对象时，池中的对象全部都在使用中，则请求要等待一个SqlConnection对象关闭，然后才可以使用新的SqlConnection对象。如果请求等待时间超过ConnectionTimeout属性指定的秒数，则会抛出异常。</p>
<p>下面通过一个程序来显示连接池的性能优势。在应用此程序过程我们要先引用System.Data.SqlClinet和System.Text命名空间。</p>
<p>范例程序代码如下：</p>
<p class="code">01 public partial class _Default : System.Web.UI.Page</p>
<p>02  {</p>
<p>03 protected void Page_Load(object sender, EventArgs e)</p>
<p>04 {</p>
<p>05  //设置连接池的最大连接数为５，最小为１</p>
<p>06 SqlConnection mySqlConnection =new  SqlConnection(</p>
<p>07 &#8220;server=localhost;database=Northwind;integrated  security=SSPI;&#8221;+</p>
<p>08 &#8220;max pool size=5;min pool size=1&#8243;);</p>
<p>09  //新建一个StringBuilder对象</p>
<p>10 StringBuilder htmStr = new StringBuilder(&#8220;&#8221;);</p>
<p>11  for (int count = 1; count ＜= 5; count++)</p>
<p>12 {</p>
<p>13  //使用Append()方法追加字符串到StringBuilder对象的结尾处</p>
<p>14 htmStr.Append(&#8220;连接对象  &#8220;+count);</p>
<p>15 htmStr.Append(&#8220;＜br＞&#8221;);</p>
<p>16 //设置一个连接的开始时间</p>
<p>17 DateTime start  = DateTime.Now;</p>
<p>18 mySqlConnection.Open();</p>
<p>19 //连接所用的时间</p>
<p>20 TimeSpan  timeTaken = DateTime.Now &#8211; start;</p>
<p>21 htmStr.Append(&#8220;连接时间为  &#8220;+timeTaken.Milliseconds+&#8221;毫秒&#8221;);</p>
<p>22 htmStr.Append(&#8220;＜br＞&#8221;);</p>
<p>23  htmStr.Append(&#8220;mySqlConnection对象的状态为&#8221; + mySqlConnection.State);</p>
<p>24  htmStr.Append(&#8220;＜br＞&#8221;);</p>
<p>25 mySqlConnection.Close();</p>
<p>26 }</p>
<p>27  //将StringBuilder对象的包含的字符串在label控件中显示出来</p>
<p>28 lblInfo.Text =  htmStr.ToString();</p>
<p>29 }</p>
<p>30  }</p>
<p>程序代码说明：在上述范例的程序代码中，我们将在连接池中重复5次打开一个SqlConnection对象，DateTime.Now表示当前的时间。  timeTaken表示从连接开始到打开连接所用的时间间隔。可以看出，打开第一个连接的时间比打开后续连接的时间要长，因为第一个连接要实际连接数据库。被关闭之后，这个连接存放在连接池中。再次打开连接时，只要从池中直接读取即可，速度非常快。</p>
<p>提示：String  对象是不可改变的。每次使用 System.String  类中的方法之一时，都要在内存中创建一个新的字符串对象，这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下，与创建新的 String  对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象，则可以使用 System.Text.StringBuilder  类。例如，当在一个循环中将许多字符串连接在一起时，使用 StringBuilder 类可以提升性能。Append  方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。</p>
<p>执行结果：</p>
<p>0 &amp;&amp;  image.height&gt;0){if(image.width&gt;=700){this.width=700;this.height=image.height*700/image.</p>
<p>width;</p>
<p>}}&#8221;  src=&#8221;http://www.ninedns.com/images/tech/images/A526_IMG200747_4.jpg&#8221;&gt;</p>
<p><span style="font-weight: bold">ASP.NET  2.0中连接字符串的设置</span></p>
<p>在ASP.NET  2.0中，使用了一种在运行时解析为连接字符串值的新的声明性表达式语法，按名称引用数据库连接字符串。连接字符串本身存储在 Web.config 文件中的  ＜connectionStrings＞  配置节下面，以便易于在单个位置为应用程序中的所有页进行维护。</p>
<p>范例程序代码如下：</p>
<p class="code">＜?xml  version=&#8221;1.0&#8243;?＞</p>
<p>＜configuration＞</p>
<p>＜connectionStrings＞</p>
<p>＜add name=&#8221;Pubs&#8221;  connectionString=&#8221;Server=localhost;</p>
<p>Integrated  Security=True;Database=pubs;Persist Security  Info=True&#8221;</p>
<p>providerName=&#8221;System.Data.SqlClient&#8221; /＞</p>
<p>＜add name=&#8221;Northwind&#8221;  connectionString=&#8221;Server=localhost;</p>
<p>Integrated  Security=True;Database=Northwind;Persist Security  Info=True&#8221;</p>
<p>providerName=&#8221;System.Data.SqlClient&#8221;  /＞</p>
<p>＜/connectionStrings＞</p>
<p>＜system.web＞</p>
<p>＜pages  styleSheetTheme=&#8221;Default&#8221;/＞</p>
<p>＜/system.web＞</p>
<p>＜/configuration＞</p>
<p>程序代码说明：在上述范例的程序代码中，我们在Web.Config文件中的＜connectionStrings＞  配置节点下面设置了两个数据库连接字符串，分别指向pubs和Northwind两个示例数据库。注意，在2.0中引进了数据源控件，例如SqlDataSource  控件，我们可以将SqlDataSource 控件的 ConnectionString 属性被设置为表达式 ＜%$ ConnectionStrings:Pubs  %＞，该表达式在运行时由 ASP.NET 分析器解析为连接字符串。还可以为SqlDataSource 的 ProviderName 属性指定一个表达式，例如  ＜%$ ConnectionStrings:Pubs.ProviderName  %＞。其具体的用法和新特征将在以后的章节进行详细的介绍。现在有个基础的了解即可。</p>
<p>当然，我们也可以用下面的方式从配置文件直接读取数据库连接字符串。首先我们需要引用using  System.Web.Configuration命名空间，该命名空间包含用于设置 ASP.NET 配置的类。</p>
<p class="code">string connectionString  =ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;</p>
<p>程序代码说明：在上述范例的程序代码中，我们可以利用ConnectionStrings["Northwind"]读取相应的Northwind字符串。同理以可以利用ConnectionStrings["Pubs"]读取相应的Pubs字符串。</p>
<hr /><p><small>Copyright © 2007-2009 <a href='http://www.johnzon.cn/'>JohnZon 世界</a></small></p><ul class="related_post"><li><a href="http://www.johnzon.cn/sqlserver2000-database-video-lectures.html" title="SQL Server 2000数据库系统管理与维护视频教程">SQL Server 2000数据库系统管理与维护视频教程</a></li><li><a href="http://www.johnzon.cn/microsoft-sql-server-2005-simplified-chinese-version.html" title="SQL Server 2005 简体中文版安装">SQL Server 2005 简体中文版安装</a></li><li><a href="http://www.johnzon.cn/analysis-aspnet-ajax-object-thought.html" title="剖析ASP.NET AJAX的面向对象思想">剖析ASP.NET AJAX的面向对象思想</a></li><li><a href="http://www.johnzon.cn/c-sharp-rule.html" title="解读C＃中的规则表达式">解读C＃中的规则表达式</a></li><li><a href="http://www.johnzon.cn/aspnet-establish-write.html" title="ASP.NET创建文件并写入内容">ASP.NET创建文件并写入内容</a></li><li><a href="http://www.johnzon.cn/aspnet-new-characteristic.html" title="ASP.NET新特性系列讲座">ASP.NET新特性系列讲座</a></li><li><a href="http://www.johnzon.cn/jsp-aspnet-session.html" title="JSP与ASP.NET之间的session值共享">JSP与ASP.NET之间的session值共享</a></li><li><a href="http://www.johnzon.cn/donet-login-kongjian.html" title="第一次用.net2.0 LOGIN登陆控件的困惑和解决方法">第一次用.net2.0 LOGIN登陆控件的困惑和解决方法</a></li><li><a href="http://www.johnzon.cn/aspnet-web-page-yingyong.html" title="ASP.NET Web Page应用深入探讨">ASP.NET Web Page应用深入探讨</a></li><li><a href="http://www.johnzon.cn/ajax-lectures-download.html" title="asp.net ajax视频教程下载">asp.net ajax视频教程下载</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.johnzon.cn/aspnet-connect-sqlserver.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
