<?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>博客园-Meazza-asp.net</title><link>http://www.cnblogs.com/mFrog/</link><description>专注asp.net</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 07:34:35 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 07:34:35 GMT</pubDate><ttl>60</ttl><item><title>阿里巴巴后台的使用体验</title><link>http://www.cnblogs.com/mFrog/archive/2008/10/10/1307908.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Fri, 10 Oct 2008 03:51:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/10/10/1307908.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1307908.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/10/10/1307908.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1307908.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1307908.html</trackback:ping><description><![CDATA[今天花了点时间，使用了一下阿里巴巴的会员后台，感叹一句&#8220;它的成功是有它的道理的&#8221;。<br />
&nbsp;&nbsp;&nbsp;&nbsp;在功能模块的使用上，它都提供了帮助，这种帮助不是简单的一个列表或者一篇文章，而是一种层次性的服务。首先会有一个所对应的功能模块的视频。如果看视频还不理解，会引导你去客户的知识库，所有相关的知识都在那。如果还是不理解，那么还有一个在线的回呼电话。这样层次性的帮助确保了客户会使用平台提供的服务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;在使用过程中，它采取了向导式和快捷式的使用方式。前者适合那种接触计算机不久的客户群，只需要&#8220;first next next finish&#8221;就能完结。而快捷式适合那种接触计算机有段时间，并且希望能快速发布的客户群，一步到位。<br />
&nbsp;&nbsp;&nbsp;&nbsp;另外，阿里巴巴还提供了会员的客户管理系统，虽然很简单，但是很实用。这在大部分的行业平台上是难得见到的，因为理念不一样，很多平台都只重营销，轻服务，或者对服务的概念不是很清楚，可能是因为他们觉的只要能顺畅使用自己的东西就是个好的服务，那是不够的，而且仅仅只是个开始。也许有的人觉的阿里巴巴有那样的技术力量和资本去做这些事情，但是我觉的这是个借口，就像我日志里的一篇文章"如果你想做，那么你就会找个方法。如果你不想做，那么你就会找个借口。"，而且如果没有看到这些东西，你会想到去做么？难怪马云敢说&#8220;用望远镜都找不到对手&#8221;。像围棋中的高手下一步棋子，他已经想到了下面的九十九步。<br />
&nbsp;&nbsp;&nbsp;&nbsp;佩服，佩服！路漫漫，其修远兮,吾将上下而求索。<img id="paperPicArea1" style="display: none; position: relative" src="http://imgcache.qq.com/ac/b.gif"  alt="" />
<img src ="http://www.cnblogs.com/mFrog/aggbug/1307908.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>CIL的作用简介</title><link>http://www.cnblogs.com/mFrog/archive/2008/10/10/1307730.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Fri, 10 Oct 2008 00:47:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/10/10/1307730.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1307730.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/10/10/1307730.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1307730.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1307730.html</trackback:ping><description><![CDATA[<p>CIL是一种和平台无关的语言。不管使用任何支持.NET的语言，相关编译器都生成CIL指令。例如下面的C#代码构成一个简单的计算器</p>
<p><br />
//*.cs</p>
<p>using System;<br />
namespace CilExample<br />
{<br />
&nbsp;&nbsp;&nbsp; //应用程序入口<br />
&nbsp;&nbsp;&nbsp; public class CilApp<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calc calc = new Calc();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result = calc.Add(10,84);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("10+84={0}",result);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //按回车结束程序<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //C#计算器<br />
&nbsp;&nbsp;&nbsp; public class Calc<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int Add(int x, int y)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x + y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
一旦编译器（csc.exe）编译这段代码，就会得到一个单文件*.exe程序集。这个程序集中包含一个程序集清单、CIL指令和描述Calc<br />
与CilApp类的各方面数据。例如如果用ildasm.exe打开该程序集，会发现Add()方法被CIL表示为：</p>
<p>.method public hidebysig instance int32 Add(int32 x,int32 y) cil managed<br />
{<br />
&nbsp;&nbsp;&nbsp; <br />
.maxstack 2<br />
.locals int ([0] int32 cs$1$0000)<br />
IL_0000:ldarg.1<br />
IL_0001:ldarg.2<br />
IL_0002:add<br />
IL_0003:stloc:0<br />
IL_0004:br.s&nbsp;&nbsp; IL_0006<br />
IL_0006:ldarg.0<br />
IL_0007:ret<br />
}</p>
<p>现在用VB.NET创建和上面一样的程序<br />
//*.vb<br />
Imports System</p>
<p>Namespace CilExample<br />
&nbsp;&nbsp;&nbsp; Module CilApp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sub Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim c As New Calc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = c.Add(10, 84)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("10+84={0}", result)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadLine()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Sub<br />
&nbsp;&nbsp;&nbsp; End Module</p>
<p>&nbsp;&nbsp;&nbsp; Class Calc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return x + y<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Function<br />
&nbsp;&nbsp;&nbsp; End Class</p>
<p><br />
End Namespace</p>
<p>&nbsp;</p>
<p>如果查看他的CIL代码你会发现非常相似，只有很少的差别</p>
<p><br />
.method public hidebysig instance int32 Add(int32 x,int32 y) cil managed<br />
{<br />
&nbsp;&nbsp;&nbsp; <br />
.maxstack 2<br />
.locals int ([0] int32 Add)<br />
IL_0000:nop<br />
IL_0001:ldarg.1<br />
IL_0002:ldarg.2<br />
IL_0003:add.ovf<br />
IL_0004:stloc.0&nbsp;&nbsp; <br />
IL_0005:br.s&nbsp;&nbsp;&nbsp;&nbsp; IL_0007<br />
IL_0007:ldarg.0<br />
IL_0008:ret<br />
}</p>
<p>从这就可以看出CIL很明显的好处：语言的集成性<br />
每种支持.NET的编译器生成的是几乎完全相同的CIL指令，因此，所有语言都能很好的定义明确的二进制文件相互交互<br />
此外CIL是平台无关的。<br />
暂时到这，后面会更加详细的介绍CIL</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.cnblogs.com/mFrog/aggbug/1307730.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>转载 敏捷教练，从A到Z</title><link>http://www.cnblogs.com/mFrog/archive/2008/10/08/1306097.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Wed, 08 Oct 2008 02:20:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/10/08/1306097.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1306097.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/10/08/1306097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1306097.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1306097.html</trackback:ping><description><![CDATA[敏捷方法学带来了新的角色——&#8220;敏捷教练&#8221;，它不常见于传统方法学中，甚或不曾为之提及。已驾轻就熟的实践者，可能会视之为浑然天成，羚羊挂角、无迹可寻；而初窥门径的新手则会心生疑云：&#8220;敏捷教练为何如此重要？&#8216;部门经理&#8217;、&#8216;团队领导&#8217;、&#8216;技术领导&#8217;，他们的问题何在？Monster.com为此提供54个职位，又是何故？&#8221; <br />
<br />
&#8220;奇文共欣赏，疑义相与析&#8221;，当是吾等本色。且与笔者同游于本文中，或可领会敏捷教练之所思、所行，更要知其意义所在。<br />
<strong>字典索引 A-Z</strong><br />
<table width="100%" border="0" order="0">
    <small></small>
        <tr valign="middle" align="left">
            <td><a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#A">A 即 Advice（建议）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#B">B 即 Balance（平衡）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#C">C 即 Celebration（庆功）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#D">D 即 Daring（勇敢）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#E">E 即 Encouragement（鼓励）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#F">F 即 Feedback（反馈）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#G">G 即 Guidance（引导）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#H">H 即 Humility（谦虚）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#I">I 即 Infectious（感染力）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#J">J 即 Jiggle（摇摆）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#K">K 即 Knowledge（知识）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#L">L 即 Listening（聆听）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#M">M 即 Mentor（导师）</a></td>
            <td><a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#N">N 即 Naysayers（怀疑论者）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#O">O 即 Obligated（担当）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#P">P 即 Principles（原则）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#Q">Q 即 Questioning（提问）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#R">R 即 Retrospectives（回顾）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#S">S 即 Sensitive（敏感）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#T">T 即 Transparency（透明）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#U">U 即 Unlock（释放潜力）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#V">V 即 Vocabulary（词汇）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#W">W 即 Welcoming（接纳）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#X">X 即 Xenodochial（友好）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#Y">Y 即 Yarn（讲故事）</a><br />
            <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#Z">Z 即 Zen（禅意）</a></td>
        </tr>
    </table>
<a name="A">
<h3>A 即 Advice（建议）：&#8220;我曾见别人做过。我觉得你们这样做效果更好。&#8221;</h3>
</a>
<p>以传统方式工作的经理会明确指导团队该怎么做，而不是帮助他们找到属于自己的道路。敏捷教练虽然常常以顾问的角色出现，但她不会做太多导向工作，而是在需要的时候出现，帮助团队避开已为人知的陷阱，或是引导他们走向佳境（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#G">引导</a>和<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#M">导师</a>）。</p>
<p>&nbsp;</p>
<p><a name="B">&nbsp; </p>
<h3>B 即 Balance（平衡）：&#8220;别把好东西丢掉。&#8221;</h3>
<p></a>&nbsp;</p>
<p>有时候团队会忙得自顾不暇，以至于又回到老路上来。教练会寻找良机，跟团队一起工作，去发现、尝试可能为团队带来巨大利益的新做法。他还会确保那些依然为团队带来收益的实践不会被随手抛弃，为人遗落，他常常会把它们跟新方法合并。</p>
<a name="C">
<h3>C 即 Celebration（庆功）：&#8220;嘿，上个迭代你们干的太棒了！&#8221; </h3>
<p></a>&nbsp;</p>
<p>团队常常会低估成功和肯定式探询的力量。迭代一步步向结果推进，形成节奏，帮助大家意识到何时达成目标（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#F">反馈</a>）。但是人们常常会忘记迭代中的庆功。整个团队在项目结束以后，或是某些重大里程碑完成后庆功（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#I">感染力</a>），会极大鼓舞士气。敏捷教练每天会跟团队一起庆祝每个小小的胜利。</p>
<a name="D">
<h3>D 即 Daring（勇敢）：&#8220;跟你们说，我豁出去了，是这样的&#8230;&#8230;&#8221; </h3>
<p></a>&nbsp;</p>
<p>引入变化就有相应的风险，敏捷教练需要承担责任，寻找途径，以最小的风险带来最大的价值。在团队中，他往往是第一个破冰而行的，激励团队，给每个人带来安全感，让他们有勇气提出建议，即使不敢尝试不同的工作方式。</p>
<a name="E">
<h3>E 即 Encouragement（鼓励）：&#8220;加油！这玩意很NB！&#8221;</h3>
<p></a>&nbsp;</p>
<p>有些敏捷实践看上去很直白，可如果没有理解它们背后的原理和带来的影响，实施起来就会很容易出问题。简单试上一段时间以后，人们往往会感觉到哪些东西从前效果更好，现在用的实践存在哪些限制（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#Q">提问</a>）。敏捷教练会为人们提供支持和鼓励，帮助他们度过尝试新实践的不适应期，有时也会帮他们解决掉实践中比较难以实施的部分。</p>
<a name="F">
<h3>F 即 Feedback（反馈） ：&#8220;你有没有发现团队&#8230;&#8230;？&#8221; </h3>
<p></a>&nbsp;</p>
<p>所有的敏捷方法学都提倡快速反馈。敏捷教练在团队工作的方方面面都会强调反馈机制的重要性——从团队协作，到过程，再到实践。定期的反馈可以帮助团队更有效地适应所处的特殊环境。</p>
<a name="G">
<h3>G 即 Guidance（引导） ：&#8220;看上去我们有三种选择，我觉得前两种可能更好，你们觉得呢？&#8221;</h3>
<p></a>&nbsp;</p>
<p>敏捷狂热者的工作方式跟敏捷教练不同。狂热者习惯使用命令和控制的方式，而敏捷教练只是加以引导，帮助每个人自我学习。他引导团队避开已知的陷阱，但他也明白失败是成功之母。</p>
<a name="H">
<h3>H 即 Humility（谦虚）：&#8220;实际上，活儿是大家干的，不是我。&#8221;</h3>
<p></a>&nbsp;</p>
<p>敏捷教练会为团队提供指导，帮助他们完成工作。当他们犯错误的时候，她要勇于承担责任，团队取得成功后，她要保证适当的人得到奖赏。傲慢自大的教练在团队中没有容身之地。</p>
<a name="I">
<h3>I 即 Infectious（感染力）：&#8220;你得过来看看这个！&#8221;</h3>
<p></a>&nbsp;</p>
<p>敏捷教练会给团队带来激情和活力，用自己为榜样，鼓舞人们燃起对工作的激情。他理解团队愿意接受多少变化，也知道自己展示热情的分寸，不会被人跟敏捷狂热者混为一谈。他也一直在寻找恰当的时机与大家分享他的能量与热情。</p>
<a name="J">
<h3>J 即 Jiggle（摇摆）：&#8220;这样调整一下，再那样调整一下。&#8221; </h3>
<p></a>&nbsp;</p>
<p>很多事情要想做好不只一种方式，即便团队跟上次采用同样的实践也是如此。敏捷教练帮助团队在以往经验和认识的基础上调整实践，使他们更好地适应团队与环境。</p>
<a name="K">
<h3>K 即 Knowledge（知识） ：&#8220;你读过这本书/这篇论文/这个邮件列表了么？&#8221;</h3>
<p></a>&nbsp;</p>
<p>敏捷方面的知识浩如烟海：敏捷实践、敏捷原则、实施方法与面临的挑战，等等等等。敏捷教练对这整套资源很熟悉，可以引导大家去看相关的书籍、论文或是博客，查找跟他们遇到的问题相关的资源。</p>
<a name="L">
<h3>L 即 Listening（聆听） ：&#8220;你说你想要做&#8230;&#8230;&#8221; </h3>
<p></a>&nbsp;</p>
<p>敏捷教练需要倾听团队的看法，从而了解他们当前的状态、他们的好恶。有时候也会把她听到的东西反馈给团队。她认真听取每个人的意见，掌握他们的需求与担忧，并据此调整她工作的优先级和相关活动。有时她也会把这些意见跟别人分享，也会鼓励人们为自己辩护。</p>
<a name="M">
<h3>M 即 Mentor（导师） : 让自己成为多余的人</h3>
<p></a>&nbsp;</p>
<p>敏捷教练的终极目标是打造自给自足的团队，他们可以对实践过程进行自我调整。为了达到这个目的，他需要找到适当的人，对其进行指导，提供支持，这些人的角色看起来很像教练。</p>
<a name="N">
<h3>N 即 Naysayers（怀疑论者）：&#8220;我不信&#8221;</h3>
<p></a>&nbsp;</p>
<p>每个团队可能都有某些人彻头彻尾的站到敏捷教练的对立面去，而且也没有什么说得过去的理由。敏捷教练要能经得住这种刁难，去理解他们的需要，理解他们为什么会感到威胁（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#L">聆听</a>, <a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#Q">提问</a>和<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#S">敏感</a>）。她会跟他们一起工作，让他们感到自己的意见受到重视，满足他们的需要，让他们释放掉压力。不情不愿的家伙需要得到鼓励，这也是教练的工作。</p>
<a name="O">
<h3>O 即 Obligated（担当）：&#8220;团队中的一部分&#8221;</h3>
<p></a>&nbsp;</p>
<p>敏捷教练需要证明他的建议是完全为了团队利益（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#T">透明</a>），如果他能够作为团队的一部分，跟团队一起工作，能够体验到一项决策的后续影响，这对他的工作将很有帮助。</p>
<a name="P">
<h3>P 即 Principles（原则）：&#8220;不要只看到现象，还要看清本质。&#8221;</h3>
<p></a>&nbsp;</p>
<p>穿透实践的执行过程，洞彻其背后原则，是为敏捷教练应为之事。脱离原则的实践会变成无本之木，收效甚微，而脱离了实践的原则更是寸步难行（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#G">引导</a>）。敏捷教练会帮助团队体验一系列实践，帮助他们理解这些实践所带来的价值，帮助他们适应这些实践对团队对组织带来的效果，由此掌握原则。</p>
<a name="Q">
<h3>Q 即 Questioning（提问） ：&#8220;你看到了什么？感觉如何？&#8221;</h3>
<p></a>&nbsp;</p>
<p>提问问题可以帮助我们厘清状况，到底是顺风顺水，还是步履维艰（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#N">怀疑论者</a>）。敏捷教练常常问问题，将事实与个人看法分开，对现状有更好的认识。如果不问问题，就轻易做出决定，长期来看对团队会有不良影响。</p>
<a name="R">
<h3>R 即 Retrospectives（回顾） ：&#8220;我们学到了什么？哪些东西我们会继续坚持？哪些东西应该另起炉灶？&#8221;</h3>
<p></a>&nbsp;</p>
<p>回顾是一个很关键的实践，敏捷教练用它来帮助团队认识到自己的成果。项目回顾可以给新项目提供之前积聚的智慧，而中间阶段或是固定频率的回顾可以帮助团队快速响应不断变化的环境，保证工作效率并不断提升。在回顾中着重突出那些已经实施了的变化，或者至少指出那些时时重复出现的问题，都可让教练和团队共同受益。（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#L">聆听</a>）。</p>
<a name="S">
<h3>S 即 Sensitive（敏感） ：&#8220;我在想他们是不是已经准备好&#8230;&#8230;&#8221;</h3>
<p></a>&nbsp;</p>
<p>最优秀的敏捷教练会尊重团队所在的组织文化和工作环境（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#L">聆听</a>和<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#W">热心</a>）。她不会命令他们改变工作方式；她会首先观察形势，然后才提出建议。</p>
<a name="T">
<h3>T 即 Transparency（透明）：&#8220;我希望你可以这样试试看，因为我觉得这有助于你&#8230;&#8230;&#8221;</h3>
<p></a>&nbsp;</p>
<p>诚实可以建立敏捷教练与团队之间的信任。他会解释做事的理由，让大家晓得尝试新事物可以带来什么好处。通过解释当前的状况及其与过去的经验或学习到的教训之间的相似之处，人们会觉得可以安心接受他的建议。有时候，让大家知道他没有暗地里做什么事情，或是有什么隐藏的动机，这也是很重要的。</p>
<a name="U">
<h3>U 即 Unlock（释放潜能）：&#8220;我没想到这团队还能办到这些！&#8221;</h3>
<p></a>&nbsp;</p>
<p>因为所处环境的限制，团队常常都有很多潜力爆发不出来。通过认真观察和对当前流程的尊重，敏捷教练可以帮助团队识别并消除系统的限制，释放团队的潜力。</p>
<a name="V">
<h3>V 即 Vocabulary（词汇）：&#8220;YAGNI？Burn up？Muda？&#8221;</h3>
<p></a>&nbsp;</p>
<p>每套方法学都有相伴的词汇。敏捷教练了解这些词汇、缩写、特殊单词的含义，把它们跟团队的思想体系相匹配。当新的模型与现有模型有所冲突时，这样做尤其有用，而且可能需要实验式教学（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#Z">禅意</a>）。</p>
<a name="W">
<h3>W 即 Welcoming（接纳）：&#8220;你们觉得我们应该怎么做？&#8221;</h3>
<p></a>&nbsp;</p>
<p>倘若敏捷教练做得很成功，团队就会提出新的思想，真正加以执行。敏捷教练应该欢迎并支持个人的提议，保护它们不会像过去那样饱受批评。</p>
<a name="X">
<h3>X 即 Xenodochial（友好）：&#8220;对陌生人友好&#8221;</h3>
<p></a>&nbsp;</p>
<p>大多数敏捷教练都会不停转换团队，需要适应不同的环境。他们不但要被不同的人接受，而且需要确保他们的一言一行不会让人产生排斥心理（参见<a href="http://www.infoq.com/cn/articles/agile-coach-a-to-z#S">敏感</a>）。每个人都有自己的想法和动机——教练必须能够意识到这一点，知道每个人都有未发挥出来的可能。</p>
<a name="Y">
<h3>Y 即 Yarn（讲故事）：&#8220;从前啊&#8230;&#8230;&#8221; </h3>
<p></a>&nbsp;</p>
<p>在不同的文化中传播知识，讲故事是很有效的途径，敏捷教练也常用它来散播知识和想法。有些故事讲述了以前的种种经验教训，有些可能只是作为隐喻来阐述概念。</p>
<a name="Z">
<h3>Z 即 Zen（禅意）：&#8220;你必须找到自己的路&#8221;</h3>
<p></a>&nbsp;</p>
<p>事非经过不知难。有些道理必须要亲身体验以后才能明白。与其苦口婆心，不如想办法打造安全的环境，纵使人们犯错，也至少不会有严重的后果。敏捷教练可以使用苏格拉底式的问答方式，帮助人们找到针对自己问题的最佳解决方法。</p>
<h3>关于作者</h3>
<p>Patrick Kua是一名软件工程师，同时还是一位导师和教练，就职于ThoughtWorks。Patrick一直积极投身于团队的建设发展，给周围的人带来激情与活力。他相信，如果人们可以把喜欢的事与工作保持一致，就可以生活得更快乐，有更好的发展。过去的三年半时间里，他训练和指导过很多团队实施敏捷。</p>
<p><strong>查看英文原文</strong>：<a title="The Agile Coach, from A to Z" href="http://www.infoq.com/articles/agile-coach-a-to-z">The Agile Coach, from A to Z</a>。</p>
<img src ="http://www.cnblogs.com/mFrog/aggbug/1306097.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>你可能错过的东西：.NET 3.5 SP1中的JIT增强</title><link>http://www.cnblogs.com/mFrog/archive/2008/10/08/1306046.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Wed, 08 Oct 2008 01:37:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/10/08/1306046.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1306046.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/10/08/1306046.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1306046.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1306046.html</trackback:ping><description><![CDATA[<p>在.NET平台里，大部分编译器的优化并不是通过VB和C#编译器来完成的。它们宁可把优化的处理推后到CLR的即时（Just In Time，JIT）编译器读取IL，并转换为原生机器码的时候来完成。由于这个原因，对JIT的改变会极大地影响之前编译好的程序集。</p>
<p>一个主要的影响就是内联函数（Inlining Function）调用。之前，JIT对内联方法的处理非常保守，<a id="kxzu" title="Vance Morrison解释了个中缘由" href="http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx">Vance Morrison解释了个中缘由</a>，</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote>它对内联的处理并不是很好。内联总是减少指令执行的数量（这是由于最低限度的调用和返回指令没有被执行），但是它能（并经常）让结果代码变得很大。大部分人都能直觉地理解，内联大的方法（比如1Kb的）不是很有意义，而内联非常小的方法可以让调用的占用空间更小（由于调用指令才5字节），这样的选择总是正确的，但是介于两者之间的方法要如何处理呢？<br />
<br />
有趣的是，当你让代码变大时，你也就让它执行缓慢，因为内存天生地缓慢；你的代码越大，它越不会放在最快的CPU缓存（称之为L1）里面执行，在那样的情况下，处理器需要执行3-10个周期直到它能从另外的缓存（称之为L2）中获取到执行代码，如果L2缓存中还不存在，那么就需要到主内存中获取（需要花费10+周期）。对于在紧密循环中执行的代码，这样的结果不会有什么问题，因为所有的代码都适合放入到最快缓存中（典型的是64K），不过对于&#8220;常规的&#8221;代码，它通过大量的方法来执行大量的代码，&#8220;越大就越慢&#8221;的效果就非常显著。更大的代码也就意味着在启动时从磁盘获取代码需要更大的磁盘I/O，这就意味着你的应用程序启动较慢。 </blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在Service Pack 1中，微软引入了一个新的基于代码尺寸的启发式算法，来判断调用是否处于一个循环中。在常规情况下，函数只有当在调用空间中的结果机器码比原始版本要小时，才能被内联。这样做就保证了尽可能多的代码能适合CPU的缓存，当缓存不够用时，就能对性能产生巨大的影响。</p>
<p>当处在循环中时，分部异常也可以很好地工作。这是因为据推测函数通常会被多次调用，所以CLR允许内联函数可以增长至原始调用大小的5倍大。类似值类型优化这样的条件有可能更进一步地增加容许尺寸的大小。</p>
<img src ="http://www.cnblogs.com/mFrog/aggbug/1306046.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>正则表达式30分钟入门教程</title><link>http://www.cnblogs.com/mFrog/archive/2008/10/06/1304860.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Mon, 06 Oct 2008 09:06:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/10/06/1304860.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1304860.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/10/06/1304860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1304860.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1304860.html</trackback:ping><description><![CDATA[<span style="font-size: medium"><strong><span style="font-size: large">目录：</span></strong><br />
</span>入门<br />
元字符<br />
字符转义<br />
重复<br />
字符类<br />
反义<br />
替换<br />
分组<br />
后向引用<br />
位置指定<br />
负向位置指定<br />
注释<br />
贪婪与懒惰<br />
平衡组<br />
一些我认为你可能已经知道的术语的参考
<p><strong><span style="font-size: large"><span style="font-size: medium">入门</span></span></strong></p>
<p>学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。<br />
假设你在一篇英文小说里查找<span style="text-decoration: underline">hi</span>，你可以使用正则正则表达式<span style="color: #ff0000">hi</span>。<br />
这是最简单的正则表达式了，它可以精确匹配这样的字符串：<span style="text-decoration: underline">由两个字符组成，前一个字符是h,后一个是i</span>。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配<em>hi</em>,<em>HI</em>,<em>Hi</em>,<em>hI</em>这四种情况中的任意一种。<br />
不幸的是，很多单词里包含<em>hi</em>这两个连续的字符，比如<em>him</em>,<em>history</em>,<em>high</em>等等。用<span style="color: #ff0000">hi</span>来查找的话，这里边的<em>hi</em>也会被找出来。如果要<span style="text-decoration: underline">精确地查找hi这个单词</span>的话，我们应该使用<span style="color: #ff0000">\bhi\b</span>。<br />
<span style="color: #008000">\b</span>是正则表达式规定的一个特殊代码（好吧，某些人叫它<strong>元字符，metacharacter</strong>），代表着<span style="text-decoration: underline">单词的开头或结尾，也就是单词的分界处</span>。虽然通常英文的单词是由空格或标点符号或换行来分隔的，但是<span style="color: #0000ff">\b</span>并不匹配这些单词分隔符中的任何一个，它<strong>只匹配一个位置</strong>。（如果需要更精确的说法，<span style="color: #0000ff">\b</span>匹配这样的位置：它的前一个字符和后一个字符不全是<span style="color: #0000ff">\w</span>）<br />
假如你要找的是<span style="text-decoration: underline">hi后面不远处跟着一个Lucy</span>，你应该用<span style="color: #ff0000">\bhi\b.*\bLucy\b</span>。<br />
这里，<span style="color: #008000">.</span>是另一个元字符，匹配<span style="text-decoration: underline">除了换行符以外的任意字符</span>。<span style="color: #008000">*</span>同样是元字符，不过它代表的不是字符，也不是位置，而是数量--它指定*<span style="text-decoration: underline">前边的内容可以重复任意次以使整个表达式得到匹配</span>。因此，<span style="color: #008000">.*</span>连在一起就意味着<span style="text-decoration: underline">任意数量的不包含换行的字符</span>。现在<span style="color: #ff0000">\bhi\b.*\bLucy\b</span>的意思就很明显了：<span style="text-decoration: underline">先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词</span>。<br />
如果同时使用其它的一些元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：<br />
<span style="color: #ff0000">0\d\d-\d\d\d\d\d\d\d\d</span>匹配这样的字符串：<span style="text-decoration: underline">以0开头，然后是两个数字，然后是一个连字号&#8220;-&#8221;，最后是8个数字</span>(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。<br />
这里的<span style="color: #008000">\d</span>是一个新的元字符，匹配<span style="text-decoration: underline">任意的数字(0，或1，或2，或&#8230;&#8230;)</span>。<span style="color: #008000">-</span>不是元字符，只匹配它本身——连字号。<br />
为了避免那么多烦人的重复，我们也可以这样写这个表达式：<span style="color: #ff0000">0\d{2}-\d{8}</span><br />
这里<span style="color: #008000">\d</span>后面的<span style="color: #008000">{2}</span>(<span style="color: #008000">{8}</span>)的意思是前面<span style="color: #008000">\d</span><span style="text-decoration: underline">必须连续重复匹配2次(8次)</span>。</p>
<p><strong>元字符<br />
</strong>现在你已经知道几个很有用的元字符了，如<span style="color: #0000ff">\b</span>,<span style="color: #0000ff">.</span>,<span style="color: #0000ff">*</span>，还有<span style="color: #0000ff">\d</span>.当然还有更多的元字符，比如<span style="color: #0000ff">\s</span>匹配<span style="text-decoration: underline">任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等</span>。<span style="color: #0000ff">\w</span>匹配<span style="text-decoration: underline">字母或数字或下划线或汉字</span>。<br />
下面来试试更多的例子：<br />
<span style="color: #ff0000">\ba\w*\b</span>匹配<span style="text-decoration: underline">以字母<span style="color: #008000">a</span>开头的单词——先是某个单词开始处(<span style="color: #008000">\b</span>)，然后是字母<span style="color: #008000">a</span>,然后是任意数量的字母或数字(<span style="color: #008000">\w*</span>)，最后是单词结束处(<span style="color: #008000">\b</span>)</span>（好吧，现在我们说说这里的单词是什么意思吧：就是几个连续的<span style="color: #0000ff">\w</span>。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大）。<br />
<span style="color: #ff0000">\d+</span>匹配<span style="text-decoration: underline">1个或更多连续的数字</span>。这里的<span style="color: #008000">+</span>是和<span style="color: #0000ff">*</span>类似的元字符，不同的是<span style="color: #0000ff">*</span>匹配<span style="text-decoration: underline">重复任意次(可能是0次)</span>，而<span style="color: #0000ff">+</span>则匹配<span style="text-decoration: underline">重复1次或更多次</span>。<br />
<span style="color: #ff0000">\b\w{6}\b</span> 匹配<span style="text-decoration: underline">刚好6个字母/数字的单词</span>。</p>
<table cellspacing="2" cellpadding="2" align="center" border="1">
    表1.常用的元字符
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <tr>
            <td>代码</td>
            <td>
            <p align="center">说明</p>
            </td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">.</span></td>
            <td><span style="text-decoration: underline">匹配除换行符以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\w</span></td>
            <td><span style="text-decoration: underline">匹配字母或数字或下划线或汉字</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\s</span></td>
            <td><span style="text-decoration: underline">匹配任意的空白符</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\d</span></td>
            <td><span style="text-decoration: underline">匹配数字</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\b</span></td>
            <td><span style="text-decoration: underline">匹配单词的开始或结束</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">^</span></td>
            <td><span style="text-decoration: underline">匹配字符串的开始</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">$</span></td>
            <td><span style="text-decoration: underline">匹配字符串的结束</span></td>
        </tr>
    </table>
<p>元字符<span style="color: #0000ff">^</span>（和6在同一个键位上的符号）以及<span style="color: #0000ff">$</span>和<span style="color: #0000ff">\b</span>有点类似，都匹配一个位置。<span style="color: #0000ff">^</span>匹配你要用来查找的字符串的开头，<span style="color: #0000ff">$</span>匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：<span style="color: #ff0000">^\d{5,12}$</span>。<br />
这里的<span style="color: #008000">{5,12}</span>和前面介绍过的<span style="color: #008000">{2}</span>是类似的，只不过<span style="color: #008000">{2}</span>匹配<span style="text-decoration: underline">只能不多不少重复2次</span>，<span style="color: #008000">{5,12}</span>则是<span style="text-decoration: underline">必须重复最少5次，最多12次</span>，否则都不匹配。<br />
因为使用了<span style="color: #008000">^</span>和<span style="color: #008000">$</span>，所以输入的整个字符串都要用来和<span style="color: #008000">\d{5,12}</span>来匹配，也就是说整个输入<span style="text-decoration: underline">必须是5到12个数字</span>，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。<br />
和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，<span style="color: #0000ff">^</span>和<span style="color: #0000ff">$</span>的意义就变成了<span style="text-decoration: underline">匹配行的开始处和结束处</span>。<br />
<span style="font-size: medium"><span style="font-size: small">字符转义<br />
</span></span>如果你想查找元字符本身的话，比如你查找<span style="text-decoration: underline">.</span>,或者<span style="text-decoration: underline">*</span>,就出现了问题：你没法指定它们，因为它们会被解释成其它的意思。这时你就必须使用<span style="color: #0000ff">\</span>来取消这些字符的特殊意义。因此，你应该使用<span style="color: #ff0000">\.</span>和<span style="color: #ff0000">\*</span>。当然，要查找<span style="text-decoration: underline">\</span>本身，你也得用<span style="color: #ff0000">\\</span>.<br />
例如：<span style="color: #ff0000">www\.unibetter\.com</span>匹配<span style="text-decoration: underline"><a href="http://www.unibetter.com/">http://www.unibetter.com/</a></span>，<span style="color: #ff0000">c:\\windows</span>匹配<span style="text-decoration: underline">c:\windows</span>,<span style="color: #ff0000">2\^8</span>匹配<span style="text-decoration: underline">2^8</span>(通常这是2的8次方的书写方式)。</p>
<p><strong><span style="font-size: x-large"><span style="font-size: large">重复</span></span></strong>你已经看过了前面的<span style="color: #0000ff">*</span>,<span style="color: #0000ff">+</span>,<span style="color: #0000ff">{2}</span>,<span style="color: #0000ff">{5,12}</span>这几个匹配重复的方式了。下面是正则表达式中所有指定重复的方式：</p>
<p>&nbsp;</p>
<table cellspacing="2" cellpadding="2" align="center" border="1">
    表2.常用的限定符
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <tr>
            <td>代码/语法</td>
            <td>说明</td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">*</span></td>
            <td><span style="text-decoration: underline">重复零次或更多次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">+</span></td>
            <td><span style="text-decoration: underline">重复一次或更多次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">?</span></td>
            <td><span style="text-decoration: underline">重复零次或一次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n}</span></td>
            <td><span style="text-decoration: underline">重复n次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n,}</span></td>
            <td><span style="text-decoration: underline">重复n次或更多次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n,m}</span></td>
            <td><span style="text-decoration: underline">重复n到m次</span></td>
        </tr>
    </table>
<p>下面是一些使用重复的例子：<br />
<span style="color: #ff0000">Windows\d+</span>匹配<span style="text-decoration: underline">Windows后面跟1个或更多数字</span><br />
<span style="color: #ff0000">13\d{9}</span>匹配<span style="text-decoration: underline">以13后面跟9个数字(中国的手机号)</span><br />
<span style="color: #ff0000">^\w+</span>匹配<span style="text-decoration: underline">一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)</span><br />
<strong><span style="font-size: medium"><span style="font-size: small">重复<br />
</span></span></strong>你已经看过了前面的<span style="color: #0000ff">*</span>,<span style="color: #0000ff">+</span>,<span style="color: #0000ff">{2}</span>,<span style="color: #0000ff">{5,12}</span>这几个匹配重复的方式了。下面是正则表达式中所有指定重复的方式：</p>
<table cellspacing="2" cellpadding="2" align="center" border="1">
    表2.常用的限定符
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <tr>
            <td>代码/语法</td>
            <td>说明</td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">*</span></td>
            <td><span style="text-decoration: underline">重复零次或更多次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">+</span></td>
            <td><span style="text-decoration: underline">重复一次或更多次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">?</span></td>
            <td><span style="text-decoration: underline">重复零次或一次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n}</span></td>
            <td><span style="text-decoration: underline">重复n次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n,}</span></td>
            <td><span style="text-decoration: underline">重复n次或更多次</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n,m}</span></td>
            <td><span style="text-decoration: underline">重复n到m次</span></td>
        </tr>
    </table>
<p>下面是一些使用重复的例子：<br />
<span style="color: #ff0000">Windows\d+</span>匹配<span style="text-decoration: underline">Windows后面跟1个或更多数字</span><br />
<span style="color: #ff0000">13\d{9}</span>匹配<span style="text-decoration: underline">以13后面跟9个数字(中国的手机号)</span><br />
<span style="color: #ff0000">^\w+</span>匹配<span style="text-decoration: underline">一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)</span><br />
<span style="font-size: medium"><span style="font-size: small">字符类<br />
</span></span>要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集的元字符，但是如果你想匹配没有预定义元字符的字符集比如元音字母(a,e,i,o,u),怎么办？<br />
很简单，你只需要在中括号里列出它们就行了，像<span style="color: #ff0000">[aeiou]</span>就匹配<span style="text-decoration: underline">任何一个元音字母</span>，<span style="color: #ff0000">[.?!]</span>匹配<span style="text-decoration: underline">标点符号(.或?或!)</span>(英文语句通常只以这三个标点结束)。注意，我们不需要写成[\.\?!]。<br />
我们也可以轻松地指定一个字符<strong>范围</strong>，像<span style="color: #ff0000">[0-9]</span>代表的含意与<span style="color: #ff0000">\d</span>就是完全一致的：<span style="text-decoration: underline">一位数字</span>，同理<span style="color: #ff0000">[a-z0-9A-Z_]</span>也完全等同于<span style="color: #0000ff">\w</span>（如果只考虑英文的话）。<br />
下面是一个更复杂的表达式：<span style="color: #ff0000">\(?0\d{2}[) -]?\d{8}</span>。<br />
这个表达式可以匹配<span style="text-decoration: underline">几种格式的电话号码</span>，像<em>(010)88886666</em>，或<em>022-22334455</em>，或<em>02912345678</em>等。我们对它进行一些分析吧：首先是一个转义字符<span style="color: #008000">\(</span>,它能出现0次或1次(<span style="color: #008000">?</span>),然后是一个<span style="color: #008000">0</span>，后面跟着2个数字(<span style="color: #008000">{2}</span>)，然后是<span style="color: #008000">)</span>或<span style="color: #008000">-</span>或<span style="color: #008000">空格</span>中的一个，它出现1次或不出现(<span style="color: #008000">?</span>)，最后是8个数字(<span style="color: #008000">\d{8}</span>)。不幸的是，它也能匹配<em>010)12345678</em>或<em>(022-87654321</em>这样的&#8220;不正确&#8221;的格式。要解决这个问题，请在本教程的下面查找答案。<br />
<span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">反义</span><br />
</span></span>有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到<strong>反义</strong>：</p>
<table cellspacing="2" cellpadding="2" align="center" border="1">
    表3.常用的反义代码
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <tr>
            <td>代码/语法</td>
            <td>说明</td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\W</span></td>
            <td><span style="text-decoration: underline">匹配任意不是字母，数字，下划线，汉字的字符</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\S</span></td>
            <td><span style="text-decoration: underline">匹配任意不是空白符的字符</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\D</span></td>
            <td><span style="text-decoration: underline">匹配任意非数字的字符</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">\B</span></td>
            <td><span style="text-decoration: underline">匹配不是单词开头或结束的位置</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">[^x]</span></td>
            <td><span style="text-decoration: underline">匹配除了x以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">[^aeiou]</span></td>
            <td><span style="text-decoration: underline">匹配除了aeiou这几个字母以外的任意字符</span></td>
        </tr>
    </table>
<p>例子：<span style="color: #ff0000">\S+</span>匹配<span style="text-decoration: underline">不包含空白符的字符串</span>。<br />
<span style="color: #ff0000">&lt;a[^&gt;]+&gt;</span>匹配<span style="text-decoration: underline">用尖括号括起来的以a开头的字符串</span>。</p>
<p><span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">替换</span><br />
</span></span>好了，现在终于到了解决3位或4位区号问题的时间了。正则表达式里的<strong>替换</strong>指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用<span style="color: #0000ff">|</span>把不同的规则分隔开。听不明白？没关系，看例子：<br />
<span style="color: #ff0000">0\d{2}-\d{8}|0\d{3}-\d{7}</span>这个表达式能<span style="text-decoration: underline">匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)</span>。<br />
<span style="color: #ff0000">\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}</span>这个表达式<span style="text-decoration: underline">匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔</span>。你可以试试用替换|把这个表达式扩展成也支持4位区号的。<br />
<span style="color: #ff0000">\d{5}-\d{4}|\d{5}</span>这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：<strong>使用替换时，顺序是很重要的</strong>。如果你把它改成<span style="color: #ff0000">\d{5}|\d{5}-\d{4}</span>的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配替换时，将会从左到右地测试每个分枝条件，如果满足了某个分枝的话，就不会去管其它的替换条件了。<br />
<span style="color: #ff0000">Windows98|Windows2000|WindosXP</span>这个例子是为了告诉你替换不仅仅能用于两种规则，也能用于更多种规则。<br />
<span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">分组</span><br />
</span></span>我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复一个字符串又该怎么办？你可以用小括号来指定<strong>子表达式</strong>(也叫做<strong>分组</strong>)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。<br />
<span style="color: #ff0000">(\d{1,3}\.){3}\d{1,3}</span>是一个<span style="text-decoration: underline">简单的IP地址匹配</span>表达式。要理解这个表达式，请按下列顺序分析它：<span style="color: #008000">\d{1,3}</span>匹配<span style="text-decoration: underline">1到3位的数字</span>，<span style="color: #008000">(\d{1,3}\.}{3}</span>匹配<span style="text-decoration: underline">三位数字加上一个英文句号(这个整体也就是这个<strong>分组</strong>)重复3次</span>，最后再加上<span style="text-decoration: underline">一个一到三位的数字</span>(<span style="color: #008000">\d{1,3}</span>)。<br />
不幸的是，它也将匹配<em>256.300.888.999</em>这种不可能存在的IP地址(IP地址中每个数字都不能大于255)。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：<span style="color: #ff0000">((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)</span>。<br />
理解这个表达式的关键是理解<span style="color: #008000">2[0-4]\d|25[0-5]|[01]?\d\d?</span>，这里我就不细说了，你自己应该能分析得出来它的意义。<br />
<span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">后向引用</span><br />
</span></span>使用小括号指定一个子表达式后，<strong>匹配这个子表达式的文本</strong>可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个<strong>组号</strong>，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。<br />
<strong>后向引用</strong>用于重复搜索前面某个分组匹配的文本。例如，<span style="color: #008000">\1</span>代表<span style="text-decoration: underline">分组1匹配的文本</span>。难以理解？请看示例：<br />
<span style="color: #ff0000">\b(\w+)\b\s+\1\b</span>可以用来匹配<span style="text-decoration: underline">重复的单词</span>，像<em>go go</em>, <em>kitty kitty</em>。首先是<span style="text-decoration: underline">一个单词</span>，也就是<span style="text-decoration: underline">单词开始处和结束处之间的多于一个的字母或数字</span>(<span style="color: #008000">\b(\w+)\b</span>)，然后是<span style="text-decoration: underline">1个或几个空白符</span>(<span style="color: #008000">\s+</span>，最后是<span style="text-decoration: underline">前面匹配的那个单词</span>(<span style="color: #008000">\1</span>)。<br />
你也可以自己指定子表达式的组号或<strong>组名</strong>。要指定一个子表达式的组名，请使用这样的语法：<span style="color: #0000ff">(?&lt;Word&gt;\w+)</span>,这样就把<span style="color: #008000">\w+</span>的组名指定为<span style="color: #008000">Word</span>了。要反向引用这个分组<strong>捕获</strong>的内容，你可以使用<span style="color: #0000ff">\k&lt;Word&gt;</span>,所以上一个例子也可以写成这样：<span style="color: #ff0000">\b(?&lt;Word&gt;\w+)\b\s*\k&lt;Word&gt;\b</span>。<br />
使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：</p>
<table cellspacing="2" cellpadding="2" align="center" border="1">
    表4.分组语法
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <tr>
            <td colspan="2">捕获</td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(exp)</span></td>
            <td><span style="text-decoration: underline">匹配exp,并捕获文本到自动命名的组里</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(?&lt;name&gt;exp)</span></td>
            <td><span style="text-decoration: underline">匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(?:exp)</span></td>
            <td><span style="text-decoration: underline">匹配exp,不捕获匹配的文本</span></td>
        </tr>
        <tr>
            <td colspan="2">位置指定</td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(?=exp)</span></td>
            <td><span style="text-decoration: underline">匹配exp前面的位置</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(?&lt;=exp)</span></td>
            <td><span style="text-decoration: underline">匹配exp后面的位置</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(?!exp)</span></td>
            <td><span style="text-decoration: underline">匹配后面跟的不是exp的位置</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(?&lt;!exp)</span></td>
            <td><span style="text-decoration: underline">匹配前面不是exp的位置</span></td>
        </tr>
        <tr>
            <td colspan="2">注释</td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">(?#comment)</span></td>
            <td><span style="text-decoration: underline">这种类型的组不对正则表达式的处理产生任何影响，只是为了提供让人阅读注释</span></td>
        </tr>
    </table>
<p>我们已经讨论了前两种语法。第三个<span style="color: #0000ff">(?:exp)</span>不会改变正则表达式的处理方式，只是这样的组匹配的内容<span style="text-decoration: underline">不会像前两种那样被捕获到某个组里面</span>。</p>
<p><span style="font-size: medium"><span style="font-size: small">位置指定<br />
</span></span>接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西，也就是说它们用于指定一个位置，就像<span style="color: #0000ff">\b</span>,<span style="color: #0000ff">^</span>,<span style="color: #0000ff">$</span>那样，因此它们也被称为<strong>零宽断言</strong>。最好还是拿例子来说明吧：<br />
<span style="color: #0000ff">(?=exp)</span>也叫<strong>零宽先行断言</strong>，它<span style="text-decoration: underline">匹配文本中的某些位置，这些位置的后面能匹配给定的后缀exp</span>。比如<span style="color: #ff0000">\b\w+(?=ing\b)</span>，匹配<span style="text-decoration: underline">以ing结尾的单词的前面部分(除了ing以外的部分)</span>，如果在查找<em>I'm singing while you're dancing.</em>时，它会匹配<span style="text-decoration: underline">sing</span>和<span style="text-decoration: underline">danc</span>。<br />
<span style="color: #0000ff">(?&lt;=exp)</span>也叫<strong>零宽后行断言</strong>，它<span style="text-decoration: underline">匹配文本中的某些位置，这些位置的前面能给定的前缀匹配exp</span>。比如<span style="color: #ff0000">(?&lt;=\bre)\w+\b</span>会匹配<span style="text-decoration: underline">以re开头的单词的后半部分(除了re以外的部分)</span>，例如在查找<em>reading a book</em>时，它匹配<span style="text-decoration: underline">ading</span>。<br />
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)，你可以这样查找需要在前面和里面添加逗号的部分：<span style="color: #ff0000">((?&lt;=\d)\d{3})*\b</span>。请仔细分析这个表达式，它可能不像你第一眼看出来的那么简单。<br />
下面这个例子同时使用了前缀和后缀：<span style="color: #ff0000">(?&lt;=\s)\d+(?=\s)</span>匹配<span style="text-decoration: underline">以空白符间隔的数字(再次强调，不包括这些空白符)</span>。</p>
<p><span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">负向位置指定</span><br />
</span></span>前面我们提到过怎么查找<strong>不是某个字符或不在某个字符类里</strong>的字符的方法(反义)。但是如果我们只是想要<strong>确保某个字符没有出现，但并不想去匹配它</strong>时怎么办？例如，如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样：<br />
<span style="color: #ff0000">\b\w*q[^u]\w*\b</span>匹配<span style="text-decoration: underline">包含<strong>后面不是字母u的字母q</strong>的单词</span>。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像<strong>Iraq</strong>,<strong>Benq</strong>，这个表达式就会出错。这是因为<span style="color: #008000">[^u]</span>总是匹配一个字符，所以如果q是单词的最后一个字符的话，后面的<span style="color: #008000">[^u]</span>将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的<span style="color: #008000">\w+\b</span>将会匹配下一个单词，于是<span style="color: #ff0000">\b\w*q[^u]\w*\b</span>就能匹配整个<em>Iraq fighting</em>。<strong>负向位置指定</strong>能解决这样的问题，因为它只匹配一个位置，并不<strong>消费</strong>任何字符。现在，我们可以这样来解决这个问题：<span style="color: #ff0000">\b\w*q(?!u)\w*\b</span>。<br />
<strong>零宽负向先行断言</strong><span style="color: #0000ff">(?!exp)</span>，只会匹配<span style="text-decoration: underline"><strong>后缀</strong>exp不存在的位置</span>。<span style="color: #ff0000">\d{3}(?!\d)</span>匹配<span style="text-decoration: underline">三位数字，而且这三位数字的后面不能是数字</span>。<br />
同理，我们可以用<span style="color: #0000ff">(?&lt;!exp)</span>,<strong>零宽负向后行断言</strong>来查找<span style="text-decoration: underline">前缀exp不存在的位置</span>：<span style="color: #ff0000">(?&lt;![a-z])\d{7}</span>匹配<span style="text-decoration: underline">前面不是小写字母的七位数字</span>(实验时发现错误？注意你的&#8220;区分大小写&#8221;先项是否选中)。<br />
一个更复杂的例子：<span style="color: #ff0000">(?&lt;=&lt;(\w+)&gt;).*(?=&lt;\/\1&gt;)</span>匹配<span style="text-decoration: underline">不包含属性的简单HTML标签内里的内容</span>。<span style="color: #0000ff">(&lt;?(\w+)&gt;)</span>指定了这样的前缀：<span style="text-decoration: underline">被尖括号括起来的单词</span>(比如可能是&lt;b&gt;)，然后是<span style="color: #008000">.*</span>(任意的字符串),最后是一个后缀<span style="color: #008000">(?=&lt;\/\1&gt;)</span>。注意后缀里的<span style="color: #008000">\/</span>，它用到了前面提过的字符转义；<span style="color: #008000">\1</span>则是一个反向引用，引用的正是<span style="text-decoration: underline">捕获的第一组</span>，前面的<span style="color: #008000">(\w+)</span>匹配的内容，这样如果前缀实际上是&lt;b&gt;的话，后缀就是&lt;/b&gt;了。整个表达式匹配的是&lt;b&gt;和&lt;/b&gt;之间的内容(再次提醒，不包括前缀和后缀本身)。</p>
<p><span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">注释</span><br />
</span></span>小括号的另一种用途是能过语法<span style="color: #0000ff">(?#comment)</span>来包含注释。例如：<span style="color: #ff0000">2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)</span>。<br />
要包含注释的话，最好是启用&#8220;忽略模式里的空白符&#8221;选项，这样在编写表达式时能任意的添加空格，Tab，换行，而实际使用时这些都将被忽略。启用这个选项后，在#后面到这一行结束的所有文本都将被当成注释忽略掉。<br />
例如，我们可以前面的一个表达式写成这样：<br />
(?&lt;=&nbsp; &nbsp; # 查找前缀，但不包含它&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;(\w+)&gt; # 查找尖括号括起来的字母或数字(标签)&nbsp; &nbsp;&nbsp;&nbsp;<br />
)&nbsp; &nbsp;&nbsp; &nbsp; # 前缀结束&nbsp; &nbsp;&nbsp;&nbsp;<br />
.*&nbsp; &nbsp;&nbsp; &nbsp;# 匹配任意文本&nbsp; &nbsp;&nbsp; &nbsp;<br />
(?=&nbsp; &nbsp;&nbsp;&nbsp;# 查找后缀，但不包含它&nbsp; &nbsp;&nbsp; &nbsp;<br />
&lt;\/\1&gt;&nbsp;&nbsp;# 查找尖括号括起来的内容：前面是一个"/"，后面是先前捕获的标签&nbsp; &nbsp;&nbsp; &nbsp;<br />
)&nbsp; &nbsp;&nbsp; &nbsp; # 后缀结束<br />
<span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">贪婪与懒惰</span><br />
</span></span>当正则表达式中包含能接受重复的限定符(指定数量的代码，例如*,{5,12}等)时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配<strong>尽可能多</strong>的字符。考虑这个表达式：<span style="color: #ff0000">a.*b</span>，它将会匹配<span style="text-decoration: underline">最长的以a开始，以b结束的字符串</span>。如果用它来搜索<em>aabab</em>的话，它会匹配整个字符串<span style="text-decoration: underline">aabab</span>。这被称为<strong>贪婪</strong>匹配。<br />
有时，我们更需要<strong>懒惰</strong>匹配，也就是匹配<strong>尽可能少</strong>的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号<span style="color: #0000ff">?</span>。这样<span style="color: #ff0000">.*?</span>就意味着<span style="text-decoration: underline">匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复</span>。现在看看懒惰版的例子吧：<br />
<span style="color: #ff0000">a.*?b</span>匹配<span style="text-decoration: underline">最短的，以a开始，以b结束的字符串</span>。如果把它应用于<em>aabab</em>的话，它会匹配<span style="text-decoration: underline">aab</span>和<span style="text-decoration: underline">ab</span>（为什么第一个匹配是aab而不是ab？简单地说，最先开始的区配最有最大的优先权——The Match That Begins Earliest Wins）。</p>
<table cellspacing="2" cellpadding="2" align="center" border="1">
    表5.懒惰限定符
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <tr>
            <td><span style="color: #0000ff">*?</span></td>
            <td><span style="text-decoration: underline">重复任意次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">+?</span></td>
            <td><span style="text-decoration: underline">重复1次或更多次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">??</span></td>
            <td><span style="text-decoration: underline">重复0次或1次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n,m}?</span></td>
            <td><span style="text-decoration: underline">重复n到m次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span style="color: #0000ff">{n,}?</span></td>
            <td><span style="text-decoration: underline">重复n次以上，但尽可能少重复</span></td>
        </tr>
    </table>
<p>&nbsp;</p>
<p><span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">平衡组</span><br />
</span></span>如果想要匹配可嵌套的层次性结构的话，就得使用平衡组了。举个例子吧，如何把&#8220;xx &lt;aa &lt;bbb&gt; &lt;bbb&gt; aa&gt; yy&#8221;这样的字符串里，最长的括号内的内容捕获出来？<br />
这里需要用到以下的语法构造：</p>
<ul>
    <li><span style="color: #0000ff">(?&lt;group&gt;)</span> 把捕获的内容命名为group,并压入堆栈</li>
    <li><span style="color: #0000ff">(?&lt;-group&gt;)</span> 从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败</li>
    <li><span style="color: #0000ff">(?(group)yes|no)</span> 如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分</li>
    <li><span style="color: #0000ff">(?!)</span> 零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败 </li>
</ul>
<ol></ol>
    <p>如果你不是一个程序员（或者你是一个对堆栈的概念不熟的程序员），你就这样理解上面的三种语法吧：第一个就是在黑板上写一个（或再写一个）"group"，第二个就是从黑板上擦掉一个"group"，第三个就是看黑板上写的还有没有"group"，如果有就继续匹配yes部分，否则就匹配no部分。<br />
    我们需要做的是每碰到了左括号，就在黑板上写一个"group"，每碰到一个右括号，就擦掉一个，到了最后就看看黑板上还有没有－如果有那就证明左括号比右括号多，那匹配就应该失败（为了能看得更清楚一点，我用了(?'group')的语法）：<br />
    &lt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#最外层的左括号<br />
    &nbsp; &nbsp; [^&lt;&gt;]*&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#最外层的左括号后面的不是括号的内容<br />
    &nbsp; &nbsp; (&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;(&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;(?'Open'&lt;)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#碰到了左括号，在黑板上写一个"Open" <br />
    &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[^&lt;&gt;&gt;]*&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#匹配左括号后面的不是括号的内容<br />
    &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;)+&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;(&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;(?'-Open'&gt;)&nbsp; &nbsp;#碰到了右括号，擦掉一个"Open"<br />
    &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;[^&lt;&gt;]*&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#匹配右括号后面不是括号的内容<br />
    &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;)+&nbsp; &nbsp; )*&nbsp; &nbsp; (?(Open)(?!))&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#在遇到最外层的右括号前面，判断黑板上还有没有没擦掉的"Open"；如果还有，则匹配失败<br />
    &gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#最外层的右括号<br />
    <span style="font-size: x-large"><span style="font-size: small"><span style="font-size: medium">一些我认为你可能已经知道的术语的参考</span><br />
    </span></span>字符 程序处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。 字符串 0个或更多个字符的序列。 文本 文字，字符串。 匹配 符合规则，检验是否符合规则，符合规则的部分。</p>
    <!-- google_ad_section_end -->
<img src ="http://www.cnblogs.com/mFrog/aggbug/1304860.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>什么是XAML</title><link>http://www.cnblogs.com/mFrog/archive/2008/09/03/1283248.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Wed, 03 Sep 2008 09:58:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/09/03/1283248.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1283248.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/09/03/1283248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1283248.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1283248.html</trackback:ping><description><![CDATA[XAML是eXtensible Application Markup Language的英文缩写，相应的中文名称为可扩展应用程序标记语言，它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面，而这种实现方式和ASP.NET中的"代码后置"模型非常类似。也就是说在开发一个应用程序时，我们可以将开发工作分成开发人员和设计人员两个团体分别进行，各自负责后台程序代码逻辑和前台程序界面的设计，这样就使得开发人员和设计人员之间的协作更通畅，也极大地发挥了他们的专长。<br />
<br />
　　提示:XAML的发音为＂Zamel＂，笔者经常开玩笑地将其读成＂折磨＂。虽然XAML包含了许多新规则、元素和语法，但是我并不认为学习它是一个折磨人的过程。只要读者稍微具备一些HTML基础知识，就可以快速地掌握XAML中的大部分内容。<br />
<br />
　　提示:如今在WPF的官方网站上已经提供了一些很实用的工具，可以将其他格式的图形文件转换为XAML文件的形式。例如我们就可以将3DMax制作出的3D动画转换为XAML，这样WPF程序就可以直接通过转换好的XAML文件产生和3DMax制作出的3D动画相一致的效果。<br />
<br />
　　XAML简化了.Net Framework 3.0 编程模式上的用户界面创建过程，使用XAML开发人员可以对WPF程序的所有用户界面元素(例如文本、按钮、图像和列表框等)进行详细的定置，同时还可以对整个界面进行合理化的布局，这与使用HTML非常相似。但是由于XAML是基于XML的，所以它本身就是一个组织良好的XML文档，而且相对于HTML，它的语法更严谨、更明确。预计以后大部分的XAML都可由相应的软件自动生成，就如同我们现在制作一个静态页面时，几乎不用编写任何HTML代码就可以直接通过Dreamweaver软件生成一个美观的页面。但是最初通过手动编写XAML代码将是一次绝佳的学习体验，虽然实现的过程繁杂了些，但是将加深您对XAML语法和各个元素的理解。<br />
<br />
　　大多数的WPF程序可能同时包含程序代码和 XAML。我们可以使用XAML定义应用程序的初始界面，而后才编写相应的功能实现代码。我们可以将逻辑代码直接嵌入到一个XAML文件中，也可以将它保留在一个单独的文件中。实际上，能够用XAML实现的所有功能我们都可以使用程序代码来完成。因此，我们根本无需使用任何的XAML就可以创建一个完好的WPF程序。一般来说，程序代码的优势在于流程处理和逻辑判断，而不是界面的构建上。而XAML则是集中关注于界面的编程，我们可以将它和其它的.NET语言配合使用，从而构建出一个功能完善、界面美观的WPF程序。XAML是一种纯正的、用来描述用户界面构成元件和编排方式的标记语言。尽管有部分的XAML语法具备程序设计语言的特性(例如XAML中的Trigger和TRansform)，但是XAML并不是一种用于程序设计的语言，它的功能也不是为了执行应用程序逻辑。<br />
<br />
　　XAML是一种解析性的语言，尽管它也可以被编译。微软推荐XAML被编译成BAML(Binary Application Markup Language-二进制语言程序标记语言)。XAML和BAML都可以被WPF解析，并且将以一种和HTML相似的方式进行界面的呈现。但是和HTML不同的是，XAML是强类型化的。也就是说，HTML会忽略那些它不能识别的元素和属性，而XAML必须在识别所有的元素和属性的情况下，才对页面进行呈现。尽管在XAML中各个属性都是以一个个的字符串(例如Background)表示的，但是这些字符串实际上代表的是WPF中的对象，只有被WPF识别的对象才可以作为元素的属性，所有我们说XAML是强类型化的。<br />
<br />
　　还有一点是我们反复强调的，XAML并不是HTML。尽管XAML在元素的声明、程序样式的设置和指定事件处理程序上都和HTML非常类似，但是XAML是基于XML的，它是WPF的外在表现形式。而HTML主是一种标记语言，仅仅是用来为浏览器呈现页面内容。XAML除了用来呈现信息和请求用户输入等基本的功能外，它还包含了一些高级的特性，例如它提供了对动画和3D众多方面的支持。<br />
<br />
　 XAML是可扩展的，正如它的名字指明的那样。开发人员可以创建自定义的控件、元素和函数来扩展XAML。而且由于XAML各元素在本质上就是WPF类的映射，所以开发人员可以很轻松地使用面向对象的技术对XAML元素进行扩展。也就是说我们可以开发一些自定义控件和组合元素，并将它公开给用户界面设计人员和其它的开发人员使用。
<img src ="http://www.cnblogs.com/mFrog/aggbug/1283248.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42957/" target="_blank">[新闻]金融风暴波及全球创业板 中国概念股难独善其身</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>全国男女比例图</title><link>http://www.cnblogs.com/mFrog/archive/2008/08/28/1278318.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Thu, 28 Aug 2008 01:24:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/08/28/1278318.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1278318.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/08/28/1278318.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1278318.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1278318.html</trackback:ping><description><![CDATA[<div align="center"><img height="486" alt="" src="http://www.cnblogs.com/images/cnblogs_com/mfrog/nannv.jpg" width="600" border="0" /></div>
<div align="center">&nbsp;</div>
<div align="left">看到一张男女比例图。大家看看自己的所在地区形式是否严峻。先下手为强</div>
<div align="left">我就属于形式比较严重的地区</div>
<img src ="http://www.cnblogs.com/mFrog/aggbug/1278318.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL LIKE 通配符的用法</title><link>http://www.cnblogs.com/mFrog/archive/2008/07/29/1255605.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Tue, 29 Jul 2008 07:12:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/07/29/1255605.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1255605.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/07/29/1255605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1255605.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1255605.html</trackback:ping><description><![CDATA[<div class="logcontent unshow" id="LogContent12" style="display: block" jquery1217312716421="3710">
<p jquery1217312716421="3711">_&nbsp;&nbsp;&nbsp; 与任意单字符匹配<br jquery1217312716421="3712" />
&nbsp;<br jquery1217312716421="3713" />
%&nbsp;&nbsp;&nbsp; 与包含一个或多个字符的字符串匹配<br jquery1217312716421="3714" />
&nbsp;<br jquery1217312716421="3715" />
[ ]&nbsp; 与特定范围（例如，[a-f]）或特定集（例如，[abcdef]）中的任意单字符匹配。<br jquery1217312716421="3716" />
&nbsp;<br jquery1217312716421="3717" />
[^]&nbsp; 与特定范围（例如，[^a-f]）或特定集（例如，[^abcdef]）之外的任意单字符匹配。<br jquery1217312716421="3718" />
&nbsp;使用like比较字，加上SQL里的通配符，请参考以下：<br jquery1217312716421="3719" />
a.. LIKE 'Mc%' 将搜索以字母 Mc 开头的所有字符串（如 McBadden）。</p>
<p jquery1217312716421="3720">b.. LIKE '%inger' 将搜索以字母 inger 结尾的所有字符串（如 Ringer、<br jquery1217312716421="3721" />
Stringer）。</p>
<p jquery1217312716421="3722">c.. LIKE '%en%' 将搜索在任何位置包含字母 en 的所有字符串（如 Bennet、<br jquery1217312716421="3723" />
Green、McBadden）。</p>
<p jquery1217312716421="3724">d.. LIKE '_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称（如 Cheryl、<br jquery1217312716421="3725" />
Sheryl）。</p>
<p jquery1217312716421="3726">e.. LIKE '[CK]ars[eo]n' 将搜索下列字符串：Carsen、Karsen、Carson 和 Karson<br jquery1217312716421="3727" />
（如 Carson）。</p>
<p jquery1217312716421="3728">f.. LIKE '[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字<br jquery1217312716421="3729" />
母开头的所有名称（如 Ringer）。</p>
<p jquery1217312716421="3730">g.. LIKE 'M[^c]%' 将搜索以字母 M 开头，并且第二个字母不是 c 的所有名称（如<br jquery1217312716421="3731" />
MacFeather）。</p>
<p jquery1217312716421="3732"><br jquery1217312716421="3733" />
&nbsp;<br jquery1217312716421="3734" />
&nbsp;<br jquery1217312716421="3735" />
例子:<br jquery1217312716421="3736" />
? WHERE FirstName LIKE '_im' 可以找到所有三个字母的、以 im 结尾的名字（例如，Jim、Tim）。 <br jquery1217312716421="3737" />
&nbsp;<br jquery1217312716421="3738" />
? WHERE LastName LIKE '%stein' 可以找到姓以 stein 结尾的所有员工。 <br jquery1217312716421="3739" />
&nbsp;<br jquery1217312716421="3740" />
? WHERE LastName LIKE '%stein%' 可以找到姓中任意位置包括 stein 的所有员工。 <br jquery1217312716421="3741" />
&nbsp;<br jquery1217312716421="3742" />
? WHERE FirstName LIKE '[JT]im' 可以找到三个字母的、以 im 结尾并以 J 或 T 开始的名字（即仅有 Jim 和 Tim） <br jquery1217312716421="3743" />
&nbsp;<br jquery1217312716421="3744" />
? WHERE LastName LIKE 'm[^c]%' 可以找到以 m 开始的、后面的（第二个）字母不为 c 的所有姓。</p>
</div>
<img src ="http://www.cnblogs.com/mFrog/aggbug/1255605.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42955/" target="_blank">[新闻]2008年10月13日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>C#.NET 连接各类数据库</title><link>http://www.cnblogs.com/mFrog/archive/2008/07/29/1255597.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Tue, 29 Jul 2008 07:00:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/07/29/1255597.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1255597.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/07/29/1255597.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1255597.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1255597.html</trackback:ping><description><![CDATA[<p>个人收藏的实用东西.拿出来大家分享下</p>
<p>&nbsp;</p>
<p>1.C#连接连接Access<br jquery1217312716421="1459" />
程序代码: </p>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data.OleDb;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;strConnection</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Provider=Microsoft.Jet.OleDb.4.0;</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />strConnection</span><span style="color: #000000">+=</span><span style="color: #800000">@"</span><span style="color: #800000">Data&nbsp;Source=C:BegASPNETNorthwind.mdb</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />OleDbConnection&nbsp;objConnection</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;OleDbConnection(strConnection);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />objConnection.Open();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />12objConnection.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>&nbsp;</p>
<p jquery1217312716421="1534">解释:</p>
<p jquery1217312716421="1535">　连接Access数据库需要导入额外的命名空间,所以有了最前面的两条using命令,这是必不可少的!</p>
<p jquery1217312716421="1536">　strConnection这个变量里存放的是连接数据库所需要的连接字符串,他指定了要使用的数据提供者和要使用的数据源.</p>
<p jquery1217312716421="1537">　"Provider=Microsoft.Jet.OleDb.4.0;"是指数据提供者,这里使用的是Microsoft Jet引擎,也就是Access中的数据引擎,asp.net就是*这个和Access的数据库连接的.</p>
<p jquery1217312716421="1538">　"Data Source=C:\BegASPNET\Northwind.mdb"是指明数据源的位置,他的标准形式是"Data Source=MyDrive:MyPath\MyFile.MDB".</p>
<p jquery1217312716421="1539">PS:<br jquery1217312716421="1540" />
　1."+="后面的"@"符号是防止将后面字符串中的"\"解析为转义字符.<br jquery1217312716421="1541" />
　2.如果要连接的数据库文件和当前文件在同一个目录下,还可以使用如下的方法连接:<br jquery1217312716421="1542" />
　　strConnection+="Data Source=";<br jquery1217312716421="1543" />
　　strConnection+=MapPath("Northwind.mdb");<br jquery1217312716421="1544" />
　　这样就可以省得你写一大堆东西了!<br jquery1217312716421="1545" />
　3.要注意连接字符串中的参数之间要用分号来分隔.</p>
<p jquery1217312716421="1546">　"OleDbConnection objConnection=new OleDbConnection(strConnection);"这一句是利用定义好的连接字符串来建立了一个链接对象,以后对数据库的操作我们都要和这个对象打交道.</p>
<p jquery1217312716421="1547">　"objConnection.Open();"这用来打开连接.至此,与Access数据库的连接完成.</p>
<p jquery1217312716421="1547">&nbsp;</p>
<p jquery1217312716421="1548">2.C#连接SQL Server<br jquery1217312716421="1549" />
程序代码: </p>
<p jquery1217312716421="1548">&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data.SqlClient;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;strConnection</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">user&nbsp;id=sa;password=;</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />strConnection</span><span style="color: #000000">+=</span><span style="color: #800000">"</span><span style="color: #800000">initial&nbsp;catalog=Northwind;Server=YourSQLServer;</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />strConnection</span><span style="color: #000000">+=</span><span style="color: #800000">"</span><span style="color: #800000">Connect&nbsp;Timeout=30</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />SqlConnection&nbsp;objConnection</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SqlConnection(strConnection);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />objConnection.Open();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />objConnection.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>&nbsp;</p>
<p jquery1217312716421="1633">解释:</p>
<p jquery1217312716421="1634">连接SQL Server数据库的机制与连接Access的机制没有什么太大的区别,只是改变了Connection对象和连接字符串中的不同参数.</p>
<p jquery1217312716421="1635">首先,连接SQL Server使用的命名空间不是"System.Data.OleDb",而是"System.Data.SqlClient".</p>
<p jquery1217312716421="1636">其次就是他的连接字符串了,我们一个一个参数来介绍(注意:参数间用分号分隔):<br jquery1217312716421="1637" />
　"user id=sa":连接数据库的验证用户名为sa.他还有一个别名"uid",所以这句我们还可以写成"uid=sa".<br jquery1217312716421="1638" />
　"password=":连接数据库的验证密码为空.他的别名为"pwd",所以我们可以写为"pwd=".<br jquery1217312716421="1639" />
　这里注意,你的SQL Server必须已经设置了需要用户名和密码来登录,否则不能用这样的方式来登录.如果你的SQL Server设置为Windows登录,那么在这里就不需要使用"user id"和"password"这样的方式来登录,而需要使用"Trusted_Connection=SSPI"来进行登录.<br jquery1217312716421="1640" />
　"initial catalog=Northwind":使用的数据源为"Northwind"这个数据库.他的别名为"Database",本句可以写成"Database=Northwind".<br jquery1217312716421="1641" />
　"Server=YourSQLServer":使用名为"YourSQLServer"的服务器.他的别名为"Data Source","Address","Addr".如果使用的是本地数据库且定义了实例名,则可以写为"Server=(local)\实例名";如果是远程服务器,则将"(local)"替换为远程服务器的名称或IP地址.<br jquery1217312716421="1642" />
　"Connect Timeout=30":连接超时时间为30秒.</p>
<p jquery1217312716421="1643">　在这里,建立连接对象用的构造函数为:SqlConnection.</p>
<p jquery1217312716421="1643">&nbsp;</p>
<p jquery1217312716421="1644">3.C#连接Oracle<br jquery1217312716421="1645" />
程序代码: </p>
<p jquery1217312716421="1644">&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data.OracleClient;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">在窗体上添加一个按钮，叫Button1，双击Button1，输入以下代码</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Button1_Click(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;System.EventArgs&nbsp;e)<br />
<img id="Codehighlighter1_153_745_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_153_745_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_153_745_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_153_745_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_153_745_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_153_745_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_153_745_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_153_745_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_153_745_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_153_745_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;ConnectionString</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Data&nbsp;Source=sky;user=system;password=manager;</span><span style="color: #800000">"</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">写连接串</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">OracleConnection&nbsp;conn</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;OracleConnection(ConnectionString);</span><span style="color: #008000">//</span><span style="color: #008000">创建一个新连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_309_643_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_309_643_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_309_643_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_309_643_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_309_643_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_309_643_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_309_643_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_309_643_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span id="Codehighlighter1_309_643_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_309_643_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />conn.Open();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />OracleCommand&nbsp;cmd</span><span style="color: #000000">=</span><span style="color: #000000">conn.CreateCommand();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />cmd.CommandText</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">select&nbsp;*&nbsp;from&nbsp;MyTable</span><span style="color: #800000">"</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">在这儿写sql语句</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">OracleDataReader&nbsp;odr</span><span style="color: #000000">=</span><span style="color: #000000">cmd.ExecuteReader();</span><span style="color: #008000">//</span><span style="color: #008000">创建一个OracleDateReader对象</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">while</span><span style="color: #000000">(odr.Read())</span><span style="color: #008000">//</span><span style="color: #008000">读取数据，如果odr.Read()返回为false的话，就说明到记录集的尾部了&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_543_628_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_543_628_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_543_628_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_543_628_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_543_628_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_543_628_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_543_628_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_543_628_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span id="Codehighlighter1_543_628_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_543_628_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />Response.Write(odr.GetOracleString(</span><span style="color: #800080">1</span><span style="color: #000000">).ToString());</span><span style="color: #008000">//</span><span style="color: #008000">输出字段1，这个数是字段索引，具体怎么使用字段名还有待研究</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />odr.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;ee)<br />
<img id="Codehighlighter1_664_710_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_664_710_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_664_710_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_664_710_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_664_710_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_664_710_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_664_710_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_664_710_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span id="Codehighlighter1_664_710_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_664_710_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />Response.Write(ee.Message);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果有错误，输出错误信息</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">finally</span><span style="color: #000000"><br />
<img id="Codehighlighter1_719_743_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_719_743_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_719_743_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_719_743_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_719_743_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_719_743_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_719_743_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_719_743_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span id="Codehighlighter1_719_743_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_719_743_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />conn.Close();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">关闭连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<p jquery1217312716421="1644">&nbsp;</p>
<p jquery1217312716421="1866">4.C#连接MySQL<br jquery1217312716421="1867" />
程序代码: </p>
<p jquery1217312716421="1866">&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;MySQLDriverCS;&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;建立数据库连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">MySQLConnection&nbsp;DBConn;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />DBConn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySQLConnection(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySQLConnectionString(</span><span style="color: #800000">"</span><span style="color: #800000">localhost</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">mysql</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">root</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">""</span><span style="color: #000000">,</span><span style="color: #800080">3306</span><span style="color: #000000">).AsString);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />DBConn.Open();&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;执行查询语句</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">MySQLCommand&nbsp;DBComm;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />DBComm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySQLCommand(</span><span style="color: #800000">"</span><span style="color: #800000">select&nbsp;Host,User&nbsp;from&nbsp;user</span><span style="color: #800000">"</span><span style="color: #000000">,DBConn);&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;读取数据</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">MySQLDataReader&nbsp;DBReader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DBComm.ExecuteReaderEx();&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;显示数据</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_349_473_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_349_473_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_349_473_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_349_473_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_349_473_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_349_473_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_349_473_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_349_473_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_349_473_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_349_473_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(DBReader.Read())<br />
<img id="Codehighlighter1_375_471_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_375_471_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_375_471_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_375_471_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_375_471_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_375_471_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_375_471_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_375_471_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span id="Codehighlighter1_375_471_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_375_471_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">Host&nbsp;=&nbsp;{0}&nbsp;and&nbsp;User&nbsp;=&nbsp;{1}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;DBReader.GetString(</span><span style="color: #800080">0</span><span style="color: #000000">),DBReader.GetString(</span><span style="color: #800080">1</span><span style="color: #000000">));<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">finally</span><span style="color: #000000"><br />
<img id="Codehighlighter1_482_519_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_482_519_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_482_519_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_482_519_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_482_519_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_482_519_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_482_519_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_482_519_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_482_519_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_482_519_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />DBReader.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />DBConn.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">关闭数据库连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">DBConn.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<p jquery1217312716421="1866">&nbsp;</p>
<p jquery1217312716421="1548">5.C#连接IBM DB2<br jquery1217312716421="2075" />
程序代码: </p>
<p jquery1217312716421="1548">&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">OleDbConnection1.Open();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">打开数据库连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">OleDbDataAdapter1.Fill(dataSet1,</span><span style="color: #800000">"</span><span style="color: #800000">Address</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">将得来的数据填入dataSet</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">DataGrid1.DataBind();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">绑定数据</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">OleDbConnection1.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">关闭连接&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">增加数据库数据</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">在Web&nbsp;Form上新增对应字段数量个数的TextBox，及一个button，为该按键增加Click响应事件代码如下：<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.OleDbInsertCommand1.CommandText&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">INSERTsintosADDRESS(NAME,</span><span style="color: #800000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">EMAIL,&nbsp;AGE,&nbsp;ADDRESS)&nbsp;VALUES<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />(</span><span style="color: #800000">'</span><span style="color: #800000">"+TextBox1.Text+"</span><span style="color: #800000">'</span><span style="color: #000000">,</span><span style="color: #800000">'</span><span style="color: #800000">"+TextBox2.Text+"</span><span style="color: #800000">'</span><span style="color: #000000">,</span><span style="color: #800000">'</span><span style="color: #800000">"+TextBox3.Text+"</span><span style="color: #800000">'</span><span style="color: #000000">,</span><span style="color: #800000">'</span><span style="color: #800000">"+TextBox4.Text+"</span><span style="color: #800000">'</span><span style="color: #000000">)</span><span style="color: #800000">"</span><span style="color: #800000">;</span><span style="color: #800000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">OleDbInsertCommand1.Connection.Open();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">打开连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">OleDbInsertCommand1.ExecuteNonQuery();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">执行该SQL语句</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">OleDbInsertCommand1.Connection.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">关闭连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<p jquery1217312716421="1548">&nbsp;</p>
<p jquery1217312716421="1548">6.C#连接SyBase<br jquery1217312716421="2228" />
程序代码: (OleDb)</p>
<p jquery1217312716421="1548">&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Provider</span><span style="color: #000000">=</span><span style="color: #000000">Sybase.ASEOLEDBProvider.</span><span style="color: #800080">2</span><span style="color: #000000">;Initial&nbsp;Catalog</span><span style="color: #000000">=</span><span style="color: #000000">数据库名;User&nbsp;ID</span><span style="color: #000000">=</span><span style="color: #000000">用户名;Data&nbsp;Source</span><span style="color: #000000">=</span><span style="color: #000000">数据源;Extended&nbsp;Properties</span><span style="color: #000000">=</span><span style="color: #800000">""</span><span style="color: #000000">;Server&nbsp;Name</span><span style="color: #000000">=</span><span style="color: #000000">ip地址;Network&nbsp;Protocol</span><span style="color: #000000">=</span><span style="color: #000000">Winsock;Server&nbsp;Port&nbsp;Address</span><span style="color: #000000">=</span><span style="color: #800080">5000</span><span style="color: #000000">;</span></div>
<p jquery1217312716421="1548"><br jquery1217312716421="1550" />
&nbsp;</p>
<img src ="http://www.cnblogs.com/mFrog/aggbug/1255597.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42955/" target="_blank">[新闻]2008年10月13日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Asp.net 2.0的TreeView客户端个性化控制</title><link>http://www.cnblogs.com/mFrog/archive/2008/07/24/1250511.html</link><dc:creator>Meazza-mFrog</dc:creator><author>Meazza-mFrog</author><pubDate>Thu, 24 Jul 2008 06:44:00 GMT</pubDate><guid>http://www.cnblogs.com/mFrog/archive/2008/07/24/1250511.html</guid><wfw:comment>http://www.cnblogs.com/mFrog/comments/1250511.html</wfw:comment><comments>http://www.cnblogs.com/mFrog/archive/2008/07/24/1250511.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/mFrog/comments/commentRss/1250511.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mFrog/services/trackbacks/1250511.html</trackback:ping><description><![CDATA[摘要: ASP.NET 2.0的 TreeView 控件功能虽说强大,但其客户端控制很逊色,本文将讲解 TreeView 的客户端实现原理,并实现两