﻿<?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>博客园-智慧掩盖真相</title><link>http://www.cnblogs.com/birdshover/</link><description>天之道，不争而善胜。
</description><language>zh-cn</language><lastBuildDate>Tue, 02 Dec 2008 09:17:56 GMT</lastBuildDate><pubDate>Tue, 02 Dec 2008 09:17:56 GMT</pubDate><ttl>60</ttl><item><title>ORM是进化还是倒退？</title><link>http://www.cnblogs.com/birdshover/archive/2008/12/01/1345068.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Mon, 01 Dec 2008 10:09:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/12/01/1345068.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1345068.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/12/01/1345068.html#Feedback</comments><slash:comments>34</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1345068.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1345068.html</trackback:ping><description><![CDATA[<p><strong>一、原本没有ORM</strong></p>
<p>曾经面向过程编程是主流，现在面向对象编程成了主流。面向过程跟关系型数据库天然地契合，或者说关系型数据库本来就是为面向过程编程而准备的。</p>
<p>&nbsp;</p>
<p align="center"><img src="http://www.cnblogs.com/images/cnblogs_com/birdshover/orm_1.jpg" border="0" alt="" width="238" height="56" /></p>
<p align="center">图 1.1</p>
<p align="left">图1.1就是面向过程编程与数据的关系。实际上早期的面向对象编程与数据的关系也是这样的，并且在现在也可以在面向对象编程中这样使用。</p>
<p style="text-align: center;">&nbsp;<img src="http://pic002.cnblogs.com/img/birdshover/200812/2008120117191657.jpg" alt="" /></p>
<p style="text-align: center;">图 1.2</p>
<p align="left">图1.2就是ORM了。相当于把程序多切了一块出来，粒度划分细了一些。</p>
<p align="left"><strong>二、ORM的思想</strong></p>
<p style="text-align: center;"><img src="http://pic002.cnblogs.com/img/birdshover/200812/2008120117432098.jpg" alt="" /></p>
<p style="text-align: center;">图 2.1</p>
<p align="left">ORM的思想就是通过一个规则，把数据库模型转换为对象。就和太阳光照在红玻璃得到红光差不多。</p>
<p align="left"><strong>三、ORM带来了什么？</strong></p>
<p align="left">从代码处理角度来说，编程就是处理可变代码和不可变代码之间关系的一个过程。ORM带来了什么呢？ORM最大的特点是把数据对象固化到了代码中，把运行时做的事情提前到了编译期。</p>
<p align="left"><strong>四、ORM是进化还是退步？</strong></p>
<p align="left">ORM是进化还是退步？</p>
<p align="left">首先，程序开发，根据实践证明只维护一个版本是最优的。但是ORM实际上是对数据库结构做了一份拷贝，现在我们需要同时维护数据结构已经对象的关系结构。我认为从这点上来说，它是编程方式上的倒退。尽管现在大多ORM框架都提供了生成实体对象的工具，也就是说生成这个拷贝的过程实现了自动化。</p>
<p align="left">ORM的初衷是依赖配置，但是实际上并没有完全依赖于配置，当然这个和C#与Java是静态语言有关。如果是动态语言也许会好一些，当然我并没有做过尝试，只是猜测一下。</p>
<p align="left">一直以来，三层架构的思想就是改变一层的东西能不影响到另外一层。ORM通过MODEL跨越三个层，达到了这个目的。当然，如果用反射也可以不用这种跨越。跨越三个层，让三个层都对Model产生了依赖，这点我觉得也是它不好的地方。因为Model是跟随数据库变动的，不能保证改变Model不会对其它层面产生影响。而面向对象编程最基本的思想就是固化不变的东西，提出变化的东西。但是要让Model保持不变，必须要数据库不发生改变，我觉得用这个作为前提不是很理想。实际开发中数据库结构是经常变动的。也许你要说变动的时候只做加法，这样也许，当然，我只认为理论上这样是可行的。</p>
<p align="left"><strong>五、没有ORM，我们还能怎么做？</strong></p>
<p align="left">那可能就是下一代数据访问的方式了。我认为面向对象编程还没有到能搞定一切的地步，现在就有很多方面显出了它的不足，所以，现在一直有新的理论出来对它进行补充。至于说面向对象的数据库，现在还需要解决至少两个问题，不说对象如何持久的问题，光是对象和数据库里对象同步就很难。比如db4o,假如对象增加一个熟悉，数据库里是无法体现的。至于将来会怎么样，将来才知道吧。</p><img src ="http://www.cnblogs.com/birdshover/aggbug/1345068.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43760/" 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>Lucene.Net 2.3.1开发介绍 —— 四、搜索（三）</title><link>http://www.cnblogs.com/birdshover/archive/2008/12/01/1345012.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Mon, 01 Dec 2008 08:04:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/12/01/1345012.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1345012.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/12/01/1345012.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1345012.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1345012.html</trackback:ping><description><![CDATA[<p>Lucene有表达式就有运算符，而运算符使用起来确实很方便，但另外一个问题来了。</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_152427" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_152427').style.display='none'; document.getElementById('Code_Open_Image_152427').style.display='inline'; document.getElementById('Code_Open_Text_152427').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_152427" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_152427').style.display='none'; getElementById('Code_Closed_Image_152427').style.display='inline'; getElementById('Code_Closed_Text_152427').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_152427">代码 4.3.4.1</span><span id="Code_Open_Text_152427" style="display: none"><br />
<!--<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">Analyzer&nbsp;analyzer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StandardAnalyzer();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />QueryParser&nbsp;parser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryParser(</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;analyzer);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Query&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parser.Parse(</span><span style="color: #800000">@"</span><span style="color: #800000">:</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">--</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;query.ToString()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">--</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Console.ReadKey();</span></span></div>
<p>&nbsp;</p>
<p>运行代码4.3.4.1,发现会引发错误。</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p style="color: #ff6600"><span style="font-size: 10pt; color: #ff9900">未处理 Lucene.Net.QueryParsers.ParseException<br />
&nbsp; Message="Cannot parse ':': Encountered \":\" at line 1, column 0.\nWas expecting one of:\n&nbsp;&nbsp;&nbsp; &lt;NOT&gt; ...\n&nbsp;&nbsp;&nbsp; \"+\" ...\n&nbsp;&nbsp;&nbsp; \"-\" ...\n&nbsp;&nbsp;&nbsp; \"(\" ...\n&nbsp;&nbsp;&nbsp; \"*\" ...\n&nbsp;&nbsp;&nbsp; &lt;QUOTED&gt; ...\n&nbsp;&nbsp;&nbsp; &lt;TERM&gt; ...\n&nbsp;&nbsp;&nbsp; &lt;PREFIXTERM&gt; ...\n&nbsp;&nbsp;&nbsp; &lt;WILDTERM&gt; ...\n&nbsp;&nbsp;&nbsp; \"[\" ...\n&nbsp;&nbsp;&nbsp; \"{\" ...\n&nbsp;&nbsp;&nbsp; &lt;NUMBER&gt; ...\n&nbsp;&nbsp;&nbsp; "<br />
&nbsp; Source="Lucene.Net"<br />
&nbsp; StackTrace:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 Lucene.Net.QueryParsers.QueryParser.Parse(String query) 位置 D:\Lucene.Net\Lucene.Net\QueryParser\QueryParser.cs:行号 186<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 TestLucene.Program.Main(String[] args) 位置 D:\TestLucene\TestLucene\TestLucene\Program.cs:行号 23<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 System.Threading.ThreadHelper.ThreadStart()<br />
&nbsp; InnerException: </span><br />
</p>
</blockquote>
<p dir="ltr">&nbsp;</p>
<p dir="ltr">":"符号死特殊符号，只有这样一个符号是无法解析的。如果实在需要搜索这个符号，那么给它加上一个"\"。代码就变成了4.3.4.2.</p>
<p dir="ltr">&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_153242" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_153242').style.display='none'; document.getElementById('Code_Open_Image_153242').style.display='inline'; document.getElementById('Code_Open_Text_153242').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_153242" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_153242').style.display='none'; getElementById('Code_Closed_Image_153242').style.display='inline'; getElementById('Code_Closed_Text_153242').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_153242">代码 4.3.4.2</span><span id="Code_Open_Text_153242" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Analyzer&nbsp;analyzer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleAnalyzer();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />QueryParser&nbsp;parser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryParser(</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;analyzer);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Query&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parser.Parse(</span><span style="color: #800000">@"</span><span style="color: #800000">\:</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">--</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;query.ToString()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">--</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Console.ReadKey();</span></span></div>
<p>&nbsp;</p>
<p>运行输出：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p><span style="color: #ff6600"><span style="color: #ff6600">----</span></span></p>
</blockquote>
<p>发现"\:"并没有预想的那样，输出一个":"出来。大多数时候可能并不会引人注意，实际上确实有很多人会认为这个符号可能是在Lucene内部被替换掉了。那么实际情况呢？如果不看Lucene的代码，盲目尝试的话，很难尝试出来，这里就不细说了。</p>
<p>把代码改成4.3.4.3</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_154116" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_154116').style.display='none'; document.getElementById('Code_Open_Image_154116').style.display='inline'; document.getElementById('Code_Open_Text_154116').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_154116" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_154116').style.display='none'; getElementById('Code_Closed_Image_154116').style.display='inline'; getElementById('Code_Closed_Text_154116').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_154116">代码 4.3.4.3</span><span id="Code_Open_Text_154116" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Analyzer&nbsp;analyzer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WhitespaceAnalyzer();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />QueryParser&nbsp;parser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryParser(</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;analyzer);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Query&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parser.Parse(</span><span style="color: #800000">@"</span><span style="color: #800000">\:</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">--</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;query.ToString()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">--</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Console.ReadKey();</span></span></div>
<p>&nbsp;</p>
<p>换了个分词器，效果就不一样了，嘿嘿。4.3.4.3输出内容就变成了：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p><span style="color: #ff6600">--title::--</span></p>
</blockquote>
<p>为什么会这样呢？来分析下分词输出的结果。先构造一个测试方法：</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_154811" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_154811').style.display='none'; document.getElementById('Code_Open_Image_154811').style.display='inline'; document.getElementById('Code_Open_Text_154811').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_154811" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_154811').style.display='none'; getElementById('Code_Closed_Image_154811').style.display='inline'; getElementById('Code_Closed_Text_154811').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_154811">代码 4.3.4.4</span><span id="Code_Open_Text_154811" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AnalyzerConsole(Analyzer&nbsp;analyzer)<br />
<img id="Codehighlighter1_40_287_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_40_287_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_40_287_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_40_287_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_40_287_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_40_287_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_40_287_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_40_287_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_40_287_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 src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_40_287_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;TokenStream&nbsp;stream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;analyzer.TokenStream(</span><span style="color: #800000">"</span><span style="color: #800000">title</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringReader(</span><span style="color: #800000">@"</span><span style="color: #800000">\:</span><span style="color: #800000">"</span><span style="color: #000000">));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Lucene.Net.Analysis.Token&nbsp;token;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(analyzer.GetType().Name);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((token&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;stream.Next())&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_242_285_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_242_285_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_242_285_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_242_285_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_242_285_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_242_285_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_242_285_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_242_285_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_242_285_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 src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_242_285_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(token.TermText());<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></span></div>
<p>&nbsp;</p>
<p>然后调用代码：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_155018" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_155018').style.display='none'; document.getElementById('Code_Open_Image_155018').style.display='inline'; document.getElementById('Code_Open_Text_155018').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_155018" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_155018').style.display='none'; getElementById('Code_Closed_Image_155018').style.display='inline'; getElementById('Code_Closed_Text_155018').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_155018">代码 4.3.4.5</span><span id="Code_Open_Text_155018" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">AnalyzerConsole(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StandardAnalyzer());<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />AnalyzerConsole(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WhitespaceAnalyzer());<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />AnalyzerConsole(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StopAnalyzer());<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />AnalyzerConsole(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleAnalyzer());<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Console.ReadKey();</span></span></div>
<p>&nbsp;</p>
<p>共测试了4个内置分词器。得出的结果是，除了WhitespaceAnalyzer，其它三个分词都把"\:"替换掉了。</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>输出的结果：<br />
<span style="color: #ff6600">StandardAnalyzer<br />
WhitespaceAnalyzer<br />
\:<br />
StopAnalyzer<br />
SimpleAnalyzer</span></p>
</blockquote>
<p>看来，特殊符号的问题，还是跟分词器息息相关的。</p>
<p>这个就说明一个问题，在使用多条件或者构造搜索表单式的时候尽量使用内置类，而尽量不要手动构造查询字符串。</p>
<img src ="http://www.cnblogs.com/birdshover/aggbug/1345012.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43760/" 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/birdshover/archive/2008/11/26/1341568.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Wed, 26 Nov 2008 08:12:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/11/26/1341568.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1341568.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/11/26/1341568.html#Feedback</comments><slash:comments>47</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1341568.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1341568.html</trackback:ping><description><![CDATA[开发框架，构件，组件非常地多，而且，趋势是越来越多，特别是在java中。当然也不是说其它平台的少。而特别是框架越来越被神化了，似乎用之解决一切问题，不用就要敲坏键盘。对于老衲这样的打字员来说，还是很爱惜自己的键盘的。<br />
<br />
框架为什么会被神化？首先，框架是N种项目同类型代码、思想的提炼。它当然可以解决很多问题。比如java世界的Spring,Struts,Hibernate,Java EE；dotnet的ADO.NET Entity Framework，MVC，企业库,NHibernate,NBear；Ruby的ROR等等。而框架被神化的另一点就是言必称框架。不用框架就不是一个好架构，不用框架则后期维护就一定会出现问题。<br />
<br />
而世上往往浮躁的人要多于踏实的人，用框架只管&#8220;怎么用？&#8221;，而不管其它的问题。以至于出现问题时，就无法解决。导致的问题，一般也不至于引起项目崩溃，但是很多项目出现版本脱离管理或者暂时混乱是肯定的。<br />
<br />
特别是对于老衲这样的菜鸟来说，更加吃力了。学习框架吧，但是一个完善的框架必然是起码好几百K的代码，而且框架的代码都是接口来接口去，看得是云里雾里，再抽根烟就更加形象了。不学习吧，总感觉很心虚，好像在造豆腐渣工程一般。<br />
<br />
而且一般的问题介绍框架都是猛讲配置，讲原理的相对来说就比较少，梳理代码的就更加少了。这弄得老衲都不敢用啊，出了错，找谁去啊？这就是看着心痒，就是不敢下手。这就是一个恶性循环了，不敢去用，而不用呢又没办法懂，反正高手们也都不讲详细。狠下心的，过了桥了，没下决心的还在河边等。<br />
<br />
但是学也无从学起啊，刚搞java的，直接学框架那可是比跳楼还有难度。dotnet的还好一些，比较配置相对简单一点。<br />
<br />
那来搞清楚什么是框架？那是一个复合代码重用，设计重用，也可能有分析重用的一个东西。框架也是用初学者从书本上看到的那些个简单语句关键字开发出来的。比如，java里的jsp、serverlet、javabean看似过时了，但是Spring,Struts这些东西的基础还就是那些东西，只是整合得非常好而已。这样看，框架似乎也没什么大不了的嘛，学学基础，学学设计模式，自己也可以搞一个出来。<br />
<br />
当然，实际上也没那么简单，开发一个框架要考虑各个层面上的问题。而这些东西了，就不去扯了。重要的是知道去学基础的东西并不是一种倒退，不用框架页未必开发不出好东西来。设计跟开发是两码事情，有些人可能觉得设计能力很牛了，拿到个项目就可以画出个结构图出来，分层分得很好。但是不一定能开发得出来。看过几天UML估计都可以画出那个图，实践那个图的能力要比画的难度大得多。<br />
<br />
有时候经常想啊，尝试去遭遇各种问题，再来学框架啊设计也许会更加深入一些。不遇到根本就不会产生那种共鸣，也就能背背书，背出来的东西不知道去哪里用。<br />
<br />
乱侃一篇以自勉。<img id="paperPicArea1" style="display: none; position: relative" alt="" src="http://imgcache.qq.com/ac/b.gif" /> 
<img src ="http://www.cnblogs.com/birdshover/aggbug/1341568.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43759/" target="_blank">[新闻]Twitter杀手Pownce被收购 两周内关闭服务</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>轻量级爬虫+全文检索解决方案项目——NukeLite（2008-11-14 更新r24版 引入新线程机制）</title><link>http://www.cnblogs.com/birdshover/archive/2008/11/14/1321481.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Fri, 14 Nov 2008 06:51:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/11/14/1321481.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1321481.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/11/14/1321481.html#Feedback</comments><slash:comments>52</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1321481.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1321481.html</trackback:ping><description><![CDATA[<p><strong>轻量级爬虫+全文检索解决方案项目——NukeLite</strong></p>
<p>svn: <span style="font-family: Courier New;"><strong><em>http://nukelite.googlecode.com/svn/trunk/</em></strong></span></p>
<p><span style="font-family: Courier New;">项目地址：<a href="http://code.google.com/p/nukelite/">http://code.google.com/p/nukelite/</a></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;">开源协议：<a rel="nofollow" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a><span style="color: #000000;"> </span></span></span></span></span></p>
<p><span style="color: #888888;"></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #0000ff;">=================================================================</span></span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong></strong></span></span></span></span> <span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;">2008-11-14更新：</span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #0000ff;">版本更新为 0.1.0.0 r24</span></span></strong></span></span></span></span></p>
<p style="color: #808080;">&nbsp;<span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #0000ff;">更新项：</span></span></strong></span></span></span></span><br />
<span style="color: #808000;">1、调整数据库插件调用结构；<br />
2、提升引擎对编码识别的效果；<br />
3、舍弃了ThreadPool的操作方式，引入了完成端口来控制线程，主要解决了同时线程并发太多导致的超时现象比较严重的问题，当然也使抓取速度慢了一些。</span><br />
<br />
下次改进应该会对抓取与文本处理进行分离。<br />
</p>
<p>提供当前版本编译预览文件下载：（格式RAR）<br />
<a href="http://nukelite.googlecode.com/files/NukeLite%20v0.1.0.0%20r24%20Preview2.rar" rel="nofollow">NukeLite v0.1.0.0 r24 Preview2.rar</a><br />
</p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #0000ff;">=================================================================</span></span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><br />
2008-11-03更新：</span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #0000ff;">版本更新为 0.1.0.0 r18</span></span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #0000ff;">更新项：</span></span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #ff6600;"><span style="color: #008000;">1、修正了MySQL操作参数名规范<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #33cccc;"><span style="color: #0000ff;"><span style="color: #008080;">以前使用的老符合</span></span></span></span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#50;&#55;&#64;&#37;&#50;&#55;"><span style="color: #008000;"><span style="color: #33cccc;"><span style="color: #0000ff;"><span style="color: #008080;">'@'</span></span></span></span></a><span style="color: #008000;"><span style="color: #33cccc;"><span style="color: #0000ff;"><span style="color: #008080;">，现在换成'?'，连接字符串可以变成&#8220;Database=Searcher;Data Source=localhost;User Id=root;Password=123;charset=utf8&#8221;，不需要对旧操作符支持。</span></span><br />
</span>2、修正了Web管理任务无法设置层次的问题；<br />
3、修正MySQL数据库结构中，UrlHash字段的类型为有符号int；<br />
4、解决了多线程抓取任务不太稳定的问题，现在已经很稳定；<br />
5、新增一个Windows系统服务项目，可以把程序配置为Windows系统服务，安装文件放在&#8220;ServiceRelease&#8221;目录。</span></span></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #ff6600;"><span style="color: #333333;">总的来说，现在的爬虫可以称得上比较稳定了，至于是否高效，不太好说。在我本本上，54M无线网卡，1M带宽，双核1.6 CPU，3G内存，基本上每秒1.5条记录。</span></span></span></span></span></span><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><br />
<span style="color: #0000ff;">=================================================================</span><br />
</span></strong></span></span></span></span>
</p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;">2008-10-31更新：</span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong>版本更新为 0.1.0.0 r16</strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong>更新项：</strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #99cc00;"><span style="color: #339966;">1、网站项目替换为应用程序项目；<br />
2、改变数据库使用架构；<br />
3、增加对MySQL数据库的支持。</span></span></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #999999;">注意：数据库操作采用的是MySQL Connector/Net ,操作编码要注意正确选择。系统默认给出的是utf-8。<br />
现在对MS SQLServer 以及MySQL的访问是采用的工厂，请手动复制DLL到测试类应用。<br />
本版本在 SQL Server 2005,MySQL 5下测试通过，不保证其它版本能稳定运行。</span><br />
</span></span></span></span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;">=================================================================</span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;">2008-10-30更新：</span></strong></span></span></span></span></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong>版本更新为 0.1.0.0 r10</strong></span></span></span></span></span></strong></span></span></span></span></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;"><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong>更新项：<br />
</strong></span></span></span></span></span></span></span></span></span></strong></span></span></span></span></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #008000;">1、增加了Web管理任务项目；<br />
2、改变了解决方案路径；<br />
3、去掉了一些不必要的引用；<br />
4、修改了部分代码编译级的写法，更加适合标准C#编译，除了Web项目，其它两项在Ubuntu 8.04 MonoDevelop 1.0下编译通过。</span></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><span style="color: #008000;"><span style="color: #808080;">另外，和一位网友交谈，受到启发，将会在页面捕获处增加插件结构支持，以适应需要对网页结构做更细致处理的需求。比如，通过写某个dll给程序调用，则可以分析出定向网站网页中的日期、作者、分类等信息。开发时间未定，有兴趣的朋友可以和我交流。</span></span></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;">=================================================================</span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong><span style="color: #ff6600;">2008-10-29更新：</span></strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong>版本更新为 0.1.0.0 r7 </strong></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><strong>更新项：<br />
</strong><span style="color: #339966;">1、不再使用ADO.Net Entity Framework<br />
2、使用框架改为.Net Framework 2.0<br />
3、修正了数据库一个字段的名称以及部分字段的长度<br />
4、更新了部分注释</span></span></span></span></span><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;"><br />
<br />
提供预览编译版本，下载地址：<a href="http://code.google.com/p/nukelite/downloads/list">http://code.google.com/p/nukelite/downloads/list</a></span></span></span></span></p>
<p><span style="color: #888888;"><span style="color: #33cccc;"><span style="color: #339966;"><span style="color: #0000ff;">==================================================================</span></span></span></span></p>
<p><span style="font-family: Courier New;"><strong>项目简介：</strong></span></p>
<p>嘿嘿，我自己写的一个轻量级的解决方案，希望以这个项目为开始，发展成一个健全，强大的全文搜索解决方案。</p>
<p>运行平台：.Net Framework 2.0 / Mono<br />
数据库： MS SQLServer 2005 / MySQL 5<br />
HTTP服务： IIS / Apache<br />
<br />
项目采用C#开发，预期分爬虫，索引和搜索三部分。目前正在开发爬虫部分。</p>
<p><br />
<img src="http://pic002.cnblogs.com/img/birdshover/200810/2008102816030752.gif" alt="" /></p>
<p>上图为该爬虫爬行数据时输出信息。</p>
<p><strong>目前爬虫的工作流程为：</strong></p>
<p>1、设置起始地址、抓取规则、访问深度等；<br />
2、爬虫提取数据分配任务；<br />
3、多线程运行捕获任务；<br />
4、分析捕获文本，设置为规则文本，同时存入数据库和在磁盘生成快照。</p>
<p>生成索引和搜索部分暂未完成。</p>
<p>&nbsp;</p>
<p><strong>爬虫实现了：</strong><br />
1、多线程抓取；<br />
2、编码识别（对部分站点测试，准确率98%以上）；<br />
3、网页快照。</p>
<p><strong>下一步实现：</strong><br />
1、多进程分布式抓取；<br />
2、坏链处理；<br />
3、失败处理等。</p>
<p><strong>目前爬虫的工作方式：</strong></p>
<p><strong><img src="http://pic002.cnblogs.com/img/birdshover/200810/2008102816392525.gif" alt="" /></strong></p>
<p><span style="color: #888888;">tags: C#爬虫，C#蜘蛛，C#搜索引擎，.Net爬虫，.Net蜘蛛,.Net搜索引擎。</span></p>
<p><strong></strong></p>
<p><strong></strong></p>
<p><strong>2008-10-28&nbsp; by yurow.</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/birdshover/aggbug/1321481.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43758/" target="_blank">[新闻]Live Search新增“即时返现”服务</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/birdshover/archive/2008/11/04/1326708.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Tue, 04 Nov 2008 14:26:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/11/04/1326708.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1326708.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/11/04/1326708.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1326708.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1326708.html</trackback:ping><description><![CDATA[<p>跨域登录是一个比较烦人的事情，往往我们需要写文章记录下来，或者探讨，或者抛砖引玉的问题，都是令人头疼的。上次简单得写了一篇关于跨域登录的文章，只讲了大体的实现过程。但是现在碰到了更大的问题，这篇文章将会介绍这个成败，并探讨、实现新方案的可行性。</p>
<p>跨域登录需要一张通行证，也可以称之为票据。就老衲现在知道和实验的方式一共有三种：</p>
<p>1、浏览器get参数；<br />2、session<br />3、cookie</p>
<p>每个都有特定的条件，以及需要处理的细节，也会带来一些新问题。根据经验，浏览器带参数，将会使系统开发得不像个东西，至少我是这么认为的。需要考虑对这个地址参数处理的各种策略，一开始我就否定了这个方案。在我需要改造的项目中有4个独立域名，跳转来跳转去，将会给用户造成极为不爽的体验。</p>
<p>session也可以解决问题，但是有一个问题无法解决。</p>
<p>先看看怎么用session解决问题。假设现在有a.com,b.com，现在开两个子域名: passport.a.com和passport.b.com。然后把这两个域名指向同一个站点，也就是在同一个站点的http投绑定这两个域名。</p>
<p>那么登录的时候，在 passport.a.com上登录成功，就可以设置一个session，那么在两个系统当中都是可以通过代理文件，访问到这个session的，这个方案确实是可行的。但是session只能保持20分钟，新问题就出来了。假设这个用户20分钟没有去操作，而打开了另外一个域名，那么这个判断就失效了。访问本域是没问题的，cookie还在那里摆着。</p>
<p>我比较倾向于用cookie来解决问题。上一次设计的系统，可以说极其简单。4个系统，有3个是asp.net的，还有个论坛是asp的（不用说就是动网的了）。现在就有四套登录系统。如果整体上全部改造，老衲认为成本太大了。后来四处逛网站，借鉴了Sohu的登录方式，但是只做了个体验的实现，如果全部实现了就不会现在在这里探讨这个问题了。解决方案就是javascript + iframe实现的。</p>
<p>本来想用纯javascript实现，然后给src的文件带参数，但是实际开发过程中，应该是我的js水平太菜，所以感觉不到想要的那种效果。后来就采用了javascript + iframe的方式来实现。是无刷新的那种哦，呵呵。</p>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000;">//</span><span style="color: #008000;"> JavaScript Document</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">&lt;script type="text/javascript" language="javascript"&gt;</span><span style="color: #008000;"><br /></span><span style="color: #0000FF;">function</span><span style="color: #000000;"> $P(id)<br />{<br />    </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> document.getElementById(id);<br />}<br /></span><span style="color: #0000FF;">function</span><span style="color: #000000;"> HJ_Passport(domain)<br />{<br />    </span><span style="color: #008000;">/*</span><span style="color: #008000;">private</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> me </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">this</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> version </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">1.1</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> author </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">yurow</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> iframe </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;iframe id=\</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_frm_1\</span><span style="color: #000000;">"</span><span style="color: #000000;"> style=\</span><span style="color: #000000;">"</span><span style="color: #000000;">display:none\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/iframe&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> uicode </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;div id=\</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_login\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;p&gt;请输入帐号和密码&lt;/p&gt;&lt;span id=\</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_login_user\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;用户：&lt;input id=\</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_username\</span><span style="color: #000000;">"</span><span style="color: #000000;"> type=\</span><span style="color: #000000;">"</span><span style="color: #000000;">text\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/span&gt;&lt;span id=\</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_login_pass\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;密码：&lt;input id=\</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_password\</span><span style="color: #000000;">"</span><span style="color: #000000;"> type=\</span><span style="color: #000000;">"</span><span style="color: #000000;">password\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/span&gt;&lt;div id=\</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_login_action\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;button onclick=\</span><span style="color: #000000;">"</span><span style="color: #000000;">hj_passport.OnSign();\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;登陆&lt;/button&gt;&lt;button onclick=\</span><span style="color: #000000;">"</span><span style="color: #000000;">hj_passport.UICode.Hide();\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;取消&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> _id;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> _g;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> intervalId </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> sites </span><span style="color: #000000;">=</span><span style="color: #000000;"> [[</span><span style="color: #000000;">"</span><span style="color: #000000;">site1</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">www.a.com</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">SetLogin.aspx</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">SetLogout.aspx</span><span style="color: #000000;">"</span><span style="color: #000000;">],[</span><span style="color: #000000;">"</span><span style="color: #000000;">site2</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">www.b.com</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">SetLogin.asp</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">SetLogout.asp</span><span style="color: #000000;">"</span><span style="color: #000000;">]];<br />    <br />    </span><span style="color: #008000;">/*</span><span style="color: #008000;">public</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.passport </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">http://passport.c.com/</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.passport_ui_id </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">passport_ui</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.UserName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">""</span><span style="color: #000000;">;<br />    <br />    </span><span style="color: #008000;">/*</span><span style="color: #008000;">private set or get</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />    HJ_Passport.prototype </span><span style="color: #000000;">=</span><span style="color: #000000;"><br />    {<br />        Author:author,<br />        Version:version<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.UICode</span><span style="color: #000000;">=</span><span style="color: #000000;">{<br />        UICode:uicode<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.UICode.Set </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(code){<br />        uicode </span><span style="color: #000000;">=</span><span style="color: #000000;"> code;<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.UICode.Draw </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(){<br />        document.write(iframe </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;div id=\</span><span style="color: #000000;">""</span><span style="color: #000000;"> + me.passport_ui_id + </span><span style="color: #000000;">"</span><span style="color: #000000;">\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/div&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.UICode.Show </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(){<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> pobj </span><span style="color: #000000;">=</span><span style="color: #000000;"> $P(me.passport_ui_id);<br />        </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(pobj</span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">){<br />            me.UICode.Draw();<br />            me.UICode.Show();<br />        }</span><span style="color: #0000FF;">else</span><span style="color: #000000;">{<br />            pobj.innerHTML </span><span style="color: #000000;">=</span><span style="color: #000000;"> uicode;<br />            pobj.style.display </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">""</span><span style="color: #000000;">;<br />        }<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.UICode.Hide </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">()<br />    {<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> pobj </span><span style="color: #000000;">=</span><span style="color: #000000;"> $P(me.passport_ui_id);<br />        </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(pobj</span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">){<br />            pobj.style.display </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">none</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />        }<br />    };<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.State </span><span style="color: #000000;">=</span><span style="color: #000000;"><br />    {<br />        ID :  </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(){ </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> _id; },<br />        G :  </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(){ </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> _g; }<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.State.Set </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(id,g){<br />        _id </span><span style="color: #000000;">=</span><span style="color: #000000;"> id;<br />        _g </span><span style="color: #000000;">=</span><span style="color: #000000;"> g;<br />    }<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> Checked </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">()<br />    {<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">        alert($P("passport_frm_1").readyStatus);</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">        if($P("passport_frm_1").readyState == "complete")</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">        {</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">            alert("登陆成功！");</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">            clearInterval(intervalId);</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">        }</span><span style="color: #008000;"><br /></span><span style="color: #000000;">    }<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> ObServerLocation </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">()<br />    {<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> hash </span><span style="color: #000000;">=</span><span style="color: #000000;"> window.location.hash;<br />        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> ((hash.length </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">) </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> (hash.charAt(</span><span style="color: #000000;">0</span><span style="color: #000000;">) </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">#</span><span style="color: #000000;">'</span><span style="color: #000000;">)){<br />            hash </span><span style="color: #000000;">=</span><span style="color: #000000;"> hash.substring(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />            </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(hash.indexOf(</span><span style="color: #000000;">"</span><span style="color: #000000;">e_usr</span><span style="color: #000000;">"</span><span style="color: #000000;">) </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> hash.indexOf(</span><span style="color: #000000;">"</span><span style="color: #000000;">e_pss</span><span style="color: #000000;">"</span><span style="color: #000000;">) </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />            {<br />                </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> err </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">""</span><span style="color: #000000;">;<br />                </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(hash.indexOf(</span><span style="color: #000000;">"</span><span style="color: #000000;">e_usr</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />                    err </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">用户名不能为空！</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />                </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(hash.indexOf(</span><span style="color: #000000;">"</span><span style="color: #000000;">e_pss</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />                    err </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">密码不能为空！</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />                clearInterval(intervalId);<br />                alert(err);<br />            }<br />            </span><span style="color: #0000FF;">else</span><span style="color: #000000;">{<br />                </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(hash.length </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> hash </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">0|</span><span style="color: #000000;">'</span><span style="color: #000000;">){<br />                    clearInterval(intervalId);<br />                    alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">用户名或者密码错误，登陆失败！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                }<br />                </span><span style="color: #0000FF;">else</span><span style="color: #000000;"><br />                {<br />                    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> sp </span><span style="color: #000000;">=</span><span style="color: #000000;"> hash.split(</span><span style="color: #000000;">'</span><span style="color: #000000;">|</span><span style="color: #000000;">'</span><span style="color: #000000;">);<br />                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(sp.length </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> sp[</span><span style="color: #000000;">0</span><span style="color: #000000;">].length </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">36</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #000000;">isNaN(sp[</span><span style="color: #000000;">1</span><span style="color: #000000;">]))<br />                    {<br />                        clearInterval(intervalId);<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">                        if(encodeURI(me.UserName).toLowerCase() != sp[2].toLowerCase()){</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">                            me.UserName = "";</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">                            alert("登陆失败！");</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">                        }</span><span style="color: #008000;"><br />//</span><span style="color: #008000;">                        else{</span><span style="color: #008000;"><br /></span><span style="color: #000000;">                            me.State.Set(sp[</span><span style="color: #000000;">1</span><span style="color: #000000;">],sp[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br />                            </span><span style="color: #008000;">//</span><span style="color: #008000;">alert("登陆成功！")</span><span style="color: #008000;"><br /></span><span style="color: #000000;">                            </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> url </span><span style="color: #000000;">=</span><span style="color: #000000;"> me.passport </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">setlogin.aspx?g=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> me.State.G() </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&amp;id=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> me.State.ID();<br />                            $P(</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_frm_1</span><span style="color: #000000;">"</span><span style="color: #000000;">).src </span><span style="color: #000000;">=</span><span style="color: #000000;"> url;<br />                            </span><span style="color: #008000;">//</span><span style="color: #008000;">intervalId = setInterval(Checked,5000);</span><span style="color: #008000;"><br /></span><span style="color: #000000;">                            </span><span style="color: #008000;">//</span><span style="color: #008000;">fn.call();</span><span style="color: #008000;"><br /></span><span style="color: #000000;">                            </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> s </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> String(location.href);<br />                            location.href </span><span style="color: #000000;">=</span><span style="color: #000000;"> s.substring(</span><span style="color: #000000;">0</span><span style="color: #000000;">,s.indexOf(</span><span style="color: #000000;">"</span><span style="color: #000000;">#</span><span style="color: #000000;">"</span><span style="color: #000000;">)) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">#</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />                            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">{<br />                            </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(OnSignEnd)OnSignEnd();<br />                            }</span><span style="color: #0000FF;">catch</span><span style="color: #000000;">(e){}<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">                        }</span><span style="color: #008000;"><br /></span><span style="color: #000000;">                    }<br />                }<br />            }<br />            </span><span style="color: #008000;">//</span><span style="color: #008000;">clearInterval(intervalId);</span><span style="color: #008000;"><br /></span><span style="color: #000000;">        }<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.OnSign </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(){<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> username </span><span style="color: #000000;">=</span><span style="color: #000000;"> $P(</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_username</span><span style="color: #000000;">"</span><span style="color: #000000;">).value;<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> password </span><span style="color: #000000;">=</span><span style="color: #000000;"> $P(</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_password</span><span style="color: #000000;">"</span><span style="color: #000000;">).value;<br />        me.UserName </span><span style="color: #000000;">=</span><span style="color: #000000;"> username;<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> url </span><span style="color: #000000;">=</span><span style="color: #000000;"> me.passport </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">jslogin.aspx?username=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> escape(username) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&amp;password=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> escape(password) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">&amp;r=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> Math.random();<br />        $P(</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_frm_1</span><span style="color: #000000;">"</span><span style="color: #000000;">).src </span><span style="color: #000000;">=</span><span style="color: #000000;"> url;<br />        <br />        intervalId </span><span style="color: #000000;">=</span><span style="color: #000000;"> setInterval(ObServerLocation, </span><span style="color: #000000;">500</span><span style="color: #000000;">);<br />    }<br />    </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> ObServerLogout </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">()<br />    {<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> hash </span><span style="color: #000000;">=</span><span style="color: #000000;"> window.location.hash;<br />        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> ((hash.length </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">) </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> (hash.charAt(</span><span style="color: #000000;">0</span><span style="color: #000000;">) </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">#</span><span style="color: #000000;">'</span><span style="color: #000000;">)){<br />            hash </span><span style="color: #000000;">=</span><span style="color: #000000;"> hash.substring(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />            </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(hash </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">0|</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />            {<br />                clearInterval(intervalId);<br />                </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> url </span><span style="color: #000000;">=</span><span style="color: #000000;"> me.passport </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">setlogout.aspx?r=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> Math.random();<br />                    $P(</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_frm_1</span><span style="color: #000000;">"</span><span style="color: #000000;">).src </span><span style="color: #000000;">=</span><span style="color: #000000;"> url;<br />                </span><span style="color: #0000FF;">try</span><span style="color: #000000;">{<br />                </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(OnSignOutEnd)OnSignOutEnd();<br />                }</span><span style="color: #0000FF;">catch</span><span style="color: #000000;">(e){}<br />            }<br />        }<br />    }<br />    </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.OnSignOut </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(){<br />        </span><span style="color: #0000FF;">var</span><span style="color: #000000;"> url </span><span style="color: #000000;">=</span><span style="color: #000000;"> me.passport </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">jslogout.aspx?r=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> Math.random();<br />        $P(</span><span style="color: #000000;">"</span><span style="color: #000000;">passport_frm_1</span><span style="color: #000000;">"</span><span style="color: #000000;">).src </span><span style="color: #000000;">=</span><span style="color: #000000;"> url;<br />        <br />        intervalId </span><span style="color: #000000;">=</span><span style="color: #000000;"> setInterval(ObServerLogout,</span><span style="color: #000000;">500</span><span style="color: #000000;">);<br />    };<br />}<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">&lt;/script&gt;</span></pre>
</div>
<pre></pre>
<div>javascript使用很简单，点击登录也就是调用了OnSign方法，将会向passport.c.com/jslogin.aspx发出请求。</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">Response.AddHeader(</span><span style="color: #000000;">"</span><span style="color: #000000;">P3P</span><span style="color: #000000;">"</span><span style="color: #000000;">, @</span><span style="color: #000000;">"</span><span style="color: #000000;">CP=</span><span style="color: #000000;">""</span><span style="color: #000000;">CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR</span><span style="color: #000000;">"""</span><span style="color: #000000;">);<br />Response.AddHeader(</span><span style="color: #000000;">"</span><span style="color: #000000;">Content-Encoding:</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">utf-8</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /><br />string url </span><span style="color: #000000;">=</span><span style="color: #000000;"> Request.ServerVariables[</span><span style="color: #000000;">"</span><span style="color: #000000;">HTTP_REFERER</span><span style="color: #000000;">"</span><span style="color: #000000;">];<br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">string.IsNullOrEmpty(url) </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> url.IndexOf(</span><span style="color: #000000;">'</span><span style="color: #000000;">#</span><span style="color: #000000;">'</span><span style="color: #000000;">) </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />{<br />    url </span><span style="color: #000000;">=</span><span style="color: #000000;"> url.Substring(</span><span style="color: #000000;">0</span><span style="color: #000000;">, url.IndexOf(</span><span style="color: #000000;">'</span><span style="color: #000000;">#</span><span style="color: #000000;">'</span><span style="color: #000000;">));<br />}<br />string username </span><span style="color: #000000;">=</span><span style="color: #000000;"> Request[</span><span style="color: #000000;">"</span><span style="color: #000000;">username</span><span style="color: #000000;">"</span><span style="color: #000000;">];<br />string password </span><span style="color: #000000;">=</span><span style="color: #000000;"> Request[</span><span style="color: #000000;">"</span><span style="color: #000000;">password</span><span style="color: #000000;">"</span><span style="color: #000000;">];<br />Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;script&gt;var f=parent;/*alert(f.document);*/f.location.href = '</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> url </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">' + '#' + </span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />bool error </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;<br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (string.IsNullOrEmpty(username))<br />{<br />    Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">'e_usr</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    error </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">;<br />}<br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (string.IsNullOrEmpty(password))<br />{<br />    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (error)<br />        Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">|</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    </span><span style="color: #0000FF;">else</span><span style="color: #000000;"><br />        Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">'</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">e_pss</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    error </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">;<br />}<br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (error)<br />{<br />    Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">';&lt;/script&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    Response.End();<br />}<br />password </span><span style="color: #000000;">=</span><span style="color: #000000;"> HttpUtility.UrlDecode(password, System.Text.Encoding.UTF8);<br />password </span><span style="color: #000000;">=</span><span style="color: #000000;"> EncryptHelper.MD5(password);<br />password </span><span style="color: #000000;">=</span><span style="color: #000000;"> password.Substring(</span><span style="color: #000000;">8</span><span style="color: #000000;">, </span><span style="color: #000000;">16</span><span style="color: #000000;">);<br />BBSUser bu </span><span style="color: #000000;">=</span><span style="color: #000000;"> BBSUserHelper.Current(username, password);<br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (bu.UserID </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />{<br />    DateTime dt </span><span style="color: #000000;">=</span><span style="color: #000000;"> DateTime.Now;<br />    string save </span><span style="color: #000000;">=</span><span style="color: #000000;"> RequestHelper.Get(</span><span style="color: #000000;">"</span><span style="color: #000000;">save</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    </span><span style="color: #008000;">//</span><span style="color: #008000;">dt = string.IsNullOrEmpty(save) ? dt.AddHours(2) : dt.AddMonths(1);</span><span style="color: #008000;"><br /></span><span style="color: #000000;">    dt </span><span style="color: #000000;">=</span><span style="color: #000000;"> dt.AddMonths(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />    Guid g </span><span style="color: #000000;">=</span><span style="color: #000000;"> Guid.NewGuid();<br />    StatUserHelper.Delete(bu.UserID);<br />    StatUser su </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> StatUser();<br />    su.UserID </span><span style="color: #000000;">=</span><span style="color: #000000;"> bu.UserID;<br />    su.UserName </span><span style="color: #000000;">=</span><span style="color: #000000;"> bu.UserName;<br />    su.ExpireTime </span><span style="color: #000000;">=</span><span style="color: #000000;"> dt;<br />    su.CreateTime </span><span style="color: #000000;">=</span><span style="color: #000000;"> DateTime.Now;<br />    su.Guid </span><span style="color: #000000;">=</span><span style="color: #000000;"> g;<br />    su.Password </span><span style="color: #000000;">=</span><span style="color: #000000;"> bu.Password;<br /><br />    su.ID </span><span style="color: #000000;">=</span><span style="color: #000000;"> StatUserHelper.Add(su);<br />    string cachedate </span><span style="color: #000000;">=</span><span style="color: #000000;"> su.Guid.ToString() </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">|</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> su.ID;<br />    string cacheuser </span><span style="color: #000000;">=</span><span style="color: #000000;"> bu.UserID </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">|</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> bu.UserName;<br />    FormsAuthenticationTicket ticket </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> FormsAuthenticationTicket(</span><span style="color: #000000;">1</span><span style="color: #000000;">, cachedate, DateTime.Now, dt, </span><span style="color: #0000FF;">true</span><span style="color: #000000;">, cacheuser);<br />    string authTicket </span><span style="color: #000000;">=</span><span style="color: #000000;"> FormsAuthentication.Encrypt(ticket);<br />    HttpCookie UserCookie </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> HttpCookie(FormsAuthentication.FormsCookieName, authTicket);<br />    UserCookie.Domain </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">.c.com</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    UserCookie.Expires </span><span style="color: #000000;">=</span><span style="color: #000000;"> ticket.Expiration;<br />    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (Response.Cookies[FormsAuthentication.FormsCookieName] </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)<br />        Response.Cookies.Add(UserCookie);<br />    </span><span style="color: #0000FF;">else</span><span style="color: #000000;"><br />        Response.Cookies.Set(UserCookie);<br />    Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">'</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> cachedate </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">|</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> HttpUtility.UrlEncode(bu.UserName, Encoding.UTF8) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">';&lt;/script&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    Response.End();<br />}<br />Response.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">'0|';&lt;/script&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />Response.End();</span></pre>
</div>
<pre></pre>
</div>
<div>jslogin的代码就是个验证的过程，加的P3P头，是可以跨域写入Cookie的保证。这里使用的是.Net 的Forms验证，要保持和其它域名加密方式以及名称的统一。假如有两个域同时指向一个站点的话。</div>
<div>这里返回javascript并且操作iframe的父窗口，改变地址，而引用的js会监视地址栏，发现数据，根据数据的格式，判断是否验证成功，如果成功了，那么会向各个站点下的一个SetLogin文件发出请求，当然被请求的页面需有P3P头。</div>
<div>这样在一个地方登录，实际上是同时向其它域名写入Cookie，退出的原理也是一样的。</div>
<div>但是，在Maxthon中Iframe操作父窗口地址这个操作是不允许的，它认为这个不安全，我倒是没觉得。这个问题还不太大，毕竟有Maxthon的用户不是太多，即使用了，告诉他不能用，他也会用IE。</div>
<div>但是IE8 beat 2这种操作方式将会弹出新窗口。在IE8&nbsp; beat2中使用Iframe解决方案就会变得体验很不好。而且还给老衲带来了心灵上的伤害，以后不敢什么都写在客户端了，浏览器版本一变，对整体影响太大了。</div>
<div>下一个可替代方案就是使用反向代理，sohu的无刷新登录就是基于这个实现的据说，目前还在研究中。上一次因为时间急迫，没有时间仔细实验。这次是没办法躲过去了。</div><img src ="http://www.cnblogs.com/birdshover/aggbug/1326708.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43753/" target="_blank">[新闻]MySpace 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>Python for .net脚本调用dotnet框架（ref和out参数问题）</title><link>http://www.cnblogs.com/birdshover/archive/2008/10/21/1316151.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Tue, 21 Oct 2008 10:01:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/10/21/1316151.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1316151.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/10/21/1316151.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1316151.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1316151.html</trackback:ping><description><![CDATA[<p>PythonNet是一个和IronPython想法差不多，但绝不一样。PythonNet可以让你写脚本来调用.Net Framework ,或者是你自己写的dll。是在sourceforge上的一个开源项目。用法的话就是先下载一个Python的&nbsp;解释器，安装完后，用下载下来的Python.Net里相应版本的文件替换掉原先的。下载地址 <a href="http://pythonnet.sourceforge.net/">http://pythonnet.sourceforge.net/</a>&nbsp;，支持到dotnet 2.0.</p>
<p>比如，下载了Python 2.5安装到C盘，路径是 C:\Python25 ，把D:\pythonnet-2.0-alpha2\python2.5-UCS2目录中的所有文件复制到C:\Python25 ，现在就可以使用了。</p>
<p>试试代码</p>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF;">import</span><span style="color: #000000;"> System<br /><br /></span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Test():<br />    _id </span><span style="color: #000000;">=</span><span style="color: #000000;"> 0<br />    _name </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">123</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">def</span><span style="color: #000000;"> </span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,id,name):<br />        self._id </span><span style="color: #000000;">=</span><span style="color: #000000;"> id<br />        self._name </span><span style="color: #000000;">=</span><span style="color: #000000;"> name<br /><br /></span><span style="color: #0000FF;">def</span><span style="color: #000000;"> main():<br />    app </span><span style="color: #000000;">=</span><span style="color: #000000;"> Test(</span><span style="color: #000000;">123</span><span style="color: #000000;">,</span><span style="color: #800000;">"</span><span style="color: #800000;">asd</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />    System.Console.WriteLine(app._id)<br />    System.Console.WriteLine(app._name)<br />    System.Console.ReadKey()<br /><br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> </span><span style="color: #800080;">__name__</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br />    main()<br /></span></pre>
</div>
<p>&nbsp;</p>
<p>这就是一个控制台程序了，当然，也可以做Winform的。但是，我觉得直接用Python作的话好像没什么好处，但是用作调用还是很不错的。</p>
<p>但是C#里有ref传值和out传值，怎么办呢？在Python里都是传引用的，但是在这里似乎不行啊。</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF;">import</span><span style="color: #000000;"> System as s<br /></span><span style="color: #0000FF;">def</span><span style="color: #000000;"> main():<br />    m </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">123</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />    r </span><span style="color: #000000;">=</span><span style="color: #000000;"> 0<br />    x </span><span style="color: #000000;">=</span><span style="color: #000000;"> s.Int32.TryParse(m,r)<br />    s.Console.WriteLine(r)<br />    s.Console.ReadKey()<br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> </span><span style="color: #800080;">__name__</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br />    main()</span></pre>
</div>
<pre></pre>
<pre></pre>
<div>上面的代码输出值是0，这就明显不对。但是输出x是个乱码，看它的类型，是个数组。</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF;">import</span><span style="color: #000000;"> System as s<br /></span><span style="color: #0000FF;">def</span><span style="color: #000000;"> main():<br />    m </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">123</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />    r </span><span style="color: #000000;">=</span><span style="color: #000000;"> 0<br />    x </span><span style="color: #000000;">=</span><span style="color: #000000;"> s.Int32.TryParse(m,r)<br />    s.Console.WriteLine(x[0])<br />    s.Console.WriteLine(x[</span><span style="color: #000000;">1</span><span style="color: #000000;">])<br />    s.Console.ReadKey()<br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> </span><span style="color: #800080;">__name__</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br />    main()<br /></span></pre>
</div>
<pre></pre>
<div>改造了下代码果然可以了。输出了</div>
<div>1</div>
<div>123</div>
<div>第一个1，应该是True的数值表示，而123就是转换后的值了。</div>
<div>而对于ref传值，也是一样的。</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF;">import</span><span style="color: #000000;"> SharpBot.Engin as Engin<br /></span><span style="color: #0000FF;">import</span><span style="color: #000000;"> HopeUtil.HTML as html<br /></span><span style="color: #0000FF;">import</span><span style="color: #000000;"> System as s<br /></span><span style="color: #0000FF;">def</span><span style="color: #000000;"> main():<br />    app </span><span style="color: #000000;">=</span><span style="color: #000000;"> Engin.DefaultCrawler(</span><span style="color: #800000;">"</span><span style="color: #800000;">http://www.163.com</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />    result </span><span style="color: #000000;">=</span><span style="color: #000000;"> html.HTMLSimpleDOM.HTMLSimpleModel()<br />    suc </span><span style="color: #000000;">=</span><span style="color: #000000;"> app.ResponseString(result)<br />    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> suc[0]:<br />        s.Console.WriteLine(suc[</span><span style="color: #000000;">1</span><span style="color: #000000;">].Title)<br />        s.Console.WriteLine(suc[</span><span style="color: #000000;">1</span><span style="color: #000000;">].MetaCharset)<br />        s.Console.WriteLine(suc[</span><span style="color: #000000;">1</span><span style="color: #000000;">].Body)<br />    </span><span style="color: #0000FF;">else</span><span style="color: #000000;">:<br />        s.Console.WriteLine(</span><span style="color: #000000;">123</span><span style="color: #000000;">)<br /><br /></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> </span><span style="color: #800080;">__name__</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br />    main()<br /></span></pre>
</div>
<pre></pre>
</div>
<div>上面的ResponseString在C#里参数是（ref HTMLSimpleDOM.HTMLSimpleModel result）。这里也返回到了数组中了。用脚本来测试写的爬虫引擎，感觉还不错。用脚本操作dotnet感觉就是不一样。</div>
</div><img src ="http://www.cnblogs.com/birdshover/aggbug/1316151.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43752/" target="_blank">[新闻]2日科技博客精选：Windows占有率首次跌破90%</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#使用BerkeleyDB操作简介</title><link>http://www.cnblogs.com/birdshover/archive/2008/10/07/1305743.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Tue, 07 Oct 2008 09:53:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/10/07/1305743.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1305743.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/10/07/1305743.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1305743.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1305743.html</trackback:ping><description><![CDATA[摘要: Berkeley DB是历史悠久的嵌入式数据库系统，主要应用在UNIX/LINUX操作系统上。Berkeley DB的存储的是key/value键值对，可以理解为硬盘上的超级hash表。其可以管理256TB数据，而且能支撑几千个并发访问。目前Berkeley DB有C++版和Java版。所以，我们需要一个访问的中间转换，已经有人发布了C#的API。可以从 Berkeley DB for .NET上&nbsp;&nbsp;<a href='http://www.cnblogs.com/birdshover/archive/2008/10/07/1305743.html'>阅读全文</a><img src ="http://www.cnblogs.com/birdshover/aggbug/1305743.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43751/" 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>db4objects 7.4应用笔记</title><link>http://www.cnblogs.com/birdshover/archive/2008/09/29/1301782.html</link><dc:creator>Birdshover</dc:creator><author>Birdshover</author><pubDate>Sun, 28 Sep 2008 16:42:00 GMT</pubDate><guid>http://www.cnblogs.com/birdshover/archive/2008/09/29/1301782.html</guid><wfw:comment>http://www.cnblogs.com/birdshover/comments/1301782.html</wfw:comment><comments>http://www.cnblogs.com/birdshover/archive/2008/09/29/1301782.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/birdshover/comments/commentRss/1301782.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/birdshover/services/trackbacks/1301782.html</trackback:ping><description><![CDATA[<p>db4o是面向对象的数据库，复杂应用就不说了，说点简单的。</p>
<p>数据库嘛，简单的操作就是添加，删除，更新和查询。</p>
<p><strong>1、添加</strong></p>
<p>添加非常简单：<br />先建一个需要存储的对象</p>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Model<br />    {<br />        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> ID { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; }<br />        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Name { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; }<br /><br />        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ToString()<br />        {<br />            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">"</span><span style="color: #800000;">ID:{0} , Name:{1}</span><span style="color: #800000;">"</span><span style="color: #000000;">, ID, Name);<br />        }<br />    }</span></pre>
</div>
<div>在进行存储操作</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">            </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (IObjectContainer db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(</span><span style="color: #800000;">"</span><span style="color: #800000;">d:\\d.dat</span><span style="color: #800000;">"</span><span style="color: #000000;">))<br />            {<br />                db.Store(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Model() { ID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">, Name </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Test</span><span style="color: #800000;">"</span><span style="color: #000000;"> });<br />            }</span></pre>
</div>
</div>
<div>或者</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">            IObjectContainer db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(</span><span style="color: #800000;">"</span><span style="color: #800000;">d:\\d.dat</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />            db.Store(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Model() { ID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">, Name </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Test</span><span style="color: #800000;">"</span><span style="color: #000000;"> });<br />            db.Dispose();</span></pre>
</div>
<pre></pre>
<div>&nbsp;</div>
<div><strong>2、更新</strong></div>
<div>更新操作就有一个引用的概念。怎么确定是删除的对象，在db4o中是通过ObjectRefence来操作的。对象的指向一定要正确啦。所以虽然也是用Store方法进行更新操作，但是，不能直接更新。比如对于上面添加的一条记录使用</div>
<div><span style="color: #ff0000;">IObjectContainer db = Db4oFactory.OpenFile("d:\\d.dat");<br />db.Store(new Model() { ID = 1, Name = "Test" });<br />db.Dispose();</span></div>
<div>并不会更新，而是一个添加操作。而下面的操作也无法更新：</div>
<div><span style="color: #ff0000;">using (IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName))<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; IObjectSet list = db.QueryByExample(new Model() { ID = 1 });<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; list.Count; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.Store(new Model() { ID = 1, Name = "Test2" });<br />&nbsp;&nbsp;&nbsp; }<br />}</span></div>
<div>&nbsp;</div>
<div>需要更新引用才可以。因此要写成：</div>
<div><span style="color: #99cc00;"><span style="color: #008000;">using (IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName))<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; IObjectSet list = db.QueryByExample(new Model() { ID = 1 });<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; list.Count; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((Model)list[i]).Name = "Test2";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.Store(list[i]);<br />&nbsp;&nbsp;&nbsp; }<br />}</span></span></div>
<div>在循环中list[i]是无法直接赋值的。不能像下面那样用：</div>
<div><span style="color: #ff0000;">using (IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName))<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; IObjectSet list = db.QueryByExample(new Model() { ID = 1 });<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; list.Count; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list[i] = new Model() { Name = "tttttt", ID = 2 };<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.Store(list[i]);<br />&nbsp;&nbsp;&nbsp; }<br />}</span><br /></div>
<div>可以给Model对象添加一个方法：</div>
<div><span style="color: #008000;">&nbsp;&nbsp;&nbsp; public class Model<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int ID { get; set; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Name { get; set; }</span></div>
<div><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void SetValue(Model model)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ID = model.ID;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Name = model.Name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override string ToString()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format("ID:{0} , Name:{1}", ID, Name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</span></div>
<div>然后使用：</div>
<div><span style="color: #008000;">using (IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName))<br />{<br />&nbsp;&nbsp;&nbsp; IObjectSet list = db.QueryByExample(new Model() { ID = 1 });<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; list.Count; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((Model)list[i]).SetValue(new Model() { Name = "tttttt", ID = 2 });<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.Store(list[i]);<br />&nbsp;&nbsp;&nbsp; }<br />}</span></div>
<div>&nbsp;</div>
<div>当然，也可以像下面一样用：</div>
<div><span style="color: #008000;">&nbsp;&nbsp;&nbsp; IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName);<br />&nbsp;&nbsp;&nbsp; IObjectSet list = db.QueryByExample(new Model() { ID = 1 });<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; list.Count; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((Model)list[i]).SetValue(new Model() { Name = "tttttt", ID = 2 });<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.Store(list[i]);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; db.Dispose();</span></div>
<div>&nbsp;</div>
<div><strong>3、删除</strong></div>
<div>删除和更新差不多，也需要删除引用，可以有下面两种用法。</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF;">using</span><span style="color: #000000;"> (IObjectContainer db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(Util.YapFileName))<br />{<br />    IObjectSet list </span><span style="color: #000000;">=</span><span style="color: #000000;"> db.QueryByExample(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Model() { ID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> });<br />    </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> list.Count; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />    {<br />        db.Delete(list[i]);<br />    }<br />}</span></pre>
</div>
<pre></pre>
<div>或者<br />
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">IObjectContainer db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(Util.YapFileName);<br />IObjectSet list </span><span style="color: #000000;">=</span><span style="color: #000000;"> db.QueryByExample(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Model() { ID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> });<br /></span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> list.Count; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />{<br />    db.Delete(list[i]);<br />}<br />db.Dispose();</span></pre>
</div>
<pre></pre>
</div>
<div><strong>4、查询</strong></div>
<div>更新和删除实际上已经用了查询，查询语句可以写成：</div>
</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF;">using</span><span style="color: #000000;"> (IObjectContainer db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(Util.YapFileName))<br />{<br />    IObjectSet list </span><span style="color: #000000;">=</span><span style="color: #000000;"> db.QueryByExample(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Model() { ID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;"> });<br />    </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> list.Count; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />    {<br />        Console.WriteLine(((Model)list[i]).ToString());<br />    }<br />}</span></pre>
</div>
<pre></pre>
<div>或者</div>
<div>&nbsp;
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">IObjectContainer db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(Util.YapFileName);<br />IObjectSet list </span><span style="color: #000000;">=</span><span style="color: #000000;"> db.QueryByExample(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Model() { ID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> });<br /></span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> list.Count; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />{<br />    Console.WriteLine(list[i].ToString());<br />}<br />db.Dispose();</span></pre>
</div>
<pre></pre>
</div>
<div>上面是根据对象查的。下面根据是按类型，用到的方法是Query。</div>
<div>
<div class="cnblogs_code">
<pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">IObjectContainer db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(Util.YapFileName);<br />IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Model</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> list </span><span style="color: #000000;">=</span><span style="color: #000000;"> db.Query</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Model</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(Model));<br /></span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> list.Count; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />{<br />    Console.WriteLine(list[i].ToString());<br />}<br />db.Dispose();</span></pre>
</div>
<pre></pre>
把所有的Model类型的数据都查询出来了就。</div>
<div><strong>5、简单讲解</strong></div>
<div>查询的时候，比如</div>
<div>IObjectSet list = db.QueryByExample(new Model() { ID = 1 });</div>
<div>是查找所有ID为1的Model类型的数据。</div>
<div>如果要查找Name为&ldquo;123&rdquo;就写成：</div>
<div>IObjectSet list = db.QueryByExample(new Model() {&nbsp;Name = "123"&nbsp;});</div>
<div><strong>6、封装</strong></div>
<div>下面给两个操作的封装类：</div>
<div>
<div class="cnblogs_code">
<pre><img id="Code_Closed_Image_003325" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_003325').style.display='none'; document.getElementById('Code_Open_Image_003325').style.display='inline'; document.getElementById('Code_Open_Text_003325').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top" /><img id="Code_Open_Image_003325" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_003325').style.display='none'; getElementById('Code_Closed_Image_003325').style.display='inline'; getElementById('Code_Closed_Text_003325').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" width="11" height="16" align="top" /><span id="Code_Closed_Text_003325" class="cnblogs_code_Collapse">对象封装</span><span id="Code_Open_Text_003325" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Db4oHelper : IDisposable<br />    {<br />        IObjectContainer db;<br />        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> Db4oHelper(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> fileName)<br />        {<br />            </span><span style="color: #0000FF;">try</span><span style="color: #000000;"><br />            {<br />                db </span><span style="color: #000000;">=</span><span style="color: #000000;"> Db4oFactory.OpenFile(fileName);<br />            }<br />            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> { }<br />        }<br /><br />        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> IsOpened<br />        {<br />            </span><span style="color: #0000FF;">get</span><span style="color: #000000;"><br />            {<br />                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (db </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)<br />                    </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;<br />                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">;<br />            }<br />        }<br />        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br />        </span><span style="color: #808080;">///</span><span style="color: #008000;"> 添加数据<br