﻿<?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>博客园-AndyDavis</title><link>http://www.cnblogs.com/AndyDavis/</link><description>学习.net 2.0</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 06:58:34 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 06:58:34 GMT</pubDate><ttl>60</ttl><item><title>[转帖]Web缓存加速指南[翻译]</title><link>http://www.cnblogs.com/AndyDavis/archive/2008/01/22/1049109.html</link><dc:creator>AndyDavis</dc:creator><author>AndyDavis</author><pubDate>Tue, 22 Jan 2008 10:52:00 GMT</pubDate><guid>http://www.cnblogs.com/AndyDavis/archive/2008/01/22/1049109.html</guid><wfw:comment>http://www.cnblogs.com/AndyDavis/comments/1049109.html</wfw:comment><comments>http://www.cnblogs.com/AndyDavis/archive/2008/01/22/1049109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/AndyDavis/comments/commentRss/1049109.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/AndyDavis/services/trackbacks/1049109.html</trackback:ping><description><![CDATA[摘要: 这是一篇知识性的文档，主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中。为了简要起见，某些实现方面的细节被简化或省略了。如果你更关心细节实现则完全不必耐心看完本文，后面参考文档和更多深入阅读部分可能是你更需要的内容。&nbsp;&nbsp;<a href='http://www.cnblogs.com/AndyDavis/archive/2008/01/22/1049109.html'>阅读全文</a><img src ="http://www.cnblogs.com/AndyDavis/aggbug/1049109.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[转帖]通常你会在什么地方遇到DBNull?</title><link>http://www.cnblogs.com/AndyDavis/archive/2006/09/10/500037.html</link><dc:creator>AndyDavis</dc:creator><author>AndyDavis</author><pubDate>Sat, 09 Sep 2006 16:19:00 GMT</pubDate><guid>http://www.cnblogs.com/AndyDavis/archive/2006/09/10/500037.html</guid><wfw:comment>http://www.cnblogs.com/AndyDavis/comments/500037.html</wfw:comment><comments>http://www.cnblogs.com/AndyDavis/archive/2006/09/10/500037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/AndyDavis/comments/commentRss/500037.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/AndyDavis/services/trackbacks/500037.html</trackback:ping><description><![CDATA[<div class=postTitle>DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ，所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。</div>
<div class=postText>
<p>但是为什么 DBNull 可以表示数据库中的字符串，数字，或日期呢？原因是DotNet储存这些数据的类（DataRow等）都是以 object 的形式来储存数据的。</p>
<p>对于 DataRow , 它的 row[column] 返回的值永远不为 null ， 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。</p>
<p>DBNull 实现了 IConvertible 。 但是，除了 ToString 是正常的外，其他的ToXXX都会抛出不能转换的错误。</p>
<p>在 IDbCommand(OleDbCommand,SqlCommand&#8230;) 的ExecuteScalar的返回值中，情况可以这样分析：</p>
<p>select 1 这样返回的object是 1<br>select null 这样返回的是DBNull.Value<br>select isnull(null,1) 返回的是 1<br>select top 0 id from table1 这样返回的值是null<br>select isnull(id,0) from table1 where 1=0 返回的值是null</p>
<p>这里 ExecuteScalar 的规则就是，返回第一列，第一行的数据。如果第一列第一行不为空，那么ExecuteScalar就直接对应的DotNet的值。如果有第一行，但是第一列为空，那么返回的是 DBNull 。如果一行都没有，那么ExecuteScalar就返回null</p>
<p>规则就是这样的。这里容易犯的一个错误是，把ExecuteScalar返回DBNull与null的情况混淆，例如：</p>
<p>string username=cmd.ExecuteScalar().ToString();</p>
<p>除非你认为cmd执行后，肯定至少有一行数据，否则这里就会出错。</p>
<p>又或者 select id from usertable where <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#61;&#64;&#110;&#97;&#109;&#101;">username=@name</a> 这样的sql语句，如果找不到记录，那么ExecuteScalar则会返回null,所以千万不要</p>
<p>int userid=Convert.ToInt32(cmd.ExecuteScalar());</p>
<p>或者你会这样写 SQL 语句：select isnull(id,0) from usertable where <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#61;&#64;&#110;&#97;&#109;&#101;">username=@name</a> </p>
<p>但是 int userid=Convert.ToInt32(cmd.ExecuteScalar()); 依然会出错，因为上面的语句不成立时，仍然是不返回任何行。</p>
<p>对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value，如果为null,则代表该参数没有指定，或者是代表DEFAULT。如果为DBNull.Value，则代表SQL中的NULL</p>
<p>所以，如果你要调用存储过程，里面有参数 @val nvarchar(20)=&#8221;AABB&#8221; , <br>那么cmd.Parameters[&#8221;@val&#8221;].Value=null 代表使用这个默认的 &#8220;AABB&#8221;<br>而cmd.Parameters[&#8221;@val&#8221;].Value=DBNull.Value 代表使用NULL来传给 @val</p>
<p>你可以用Convert.IsDBNull来判断一个值是否DBNull。注意Convert.IsDBNull(null)是false。</p>
<p>备注：以上的SQL语句全是指SQLSERVER2000的。</p>
</div>
<img src ="http://www.cnblogs.com/AndyDavis/aggbug/500037.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>FCKEditor 2.2 的上传功能与Maxthon的兼容问题</title><link>http://www.cnblogs.com/AndyDavis/archive/2006/04/24/383107.html</link><dc:creator>AndyDavis</dc:creator><author>AndyDavis</author><pubDate>Sun, 23 Apr 2006 23:30:00 GMT</pubDate><guid>http://www.cnblogs.com/AndyDavis/archive/2006/04/24/383107.html</guid><wfw:comment>http://www.cnblogs.com/AndyDavis/comments/383107.html</wfw:comment><comments>http://www.cnblogs.com/AndyDavis/archive/2006/04/24/383107.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/AndyDavis/comments/commentRss/383107.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/AndyDavis/services/trackbacks/383107.html</trackback:ping><description><![CDATA[在ASP.NET 2.0下配置使用fckeditor 2.2，其它都没有问题，唯独这个上传功能一直不好使：用FCKeditor编辑器时, 按插下图片,弹出一个小对话框, 再按浏览服务器,但是打开窗口不在顶层,无法使用。 同样，插入FLASH等其它类似功能都有这个问题。<br><br>今天突然发现，竟然是与Maxthon&nbsp;的兼容问题造成。在IE下，则正常。应该是关于模式对话框的问题。<br><br>Google了一下，在Maxthon的论坛也有人提到了：<a href="http://forum.maxthon.com/index.php?showtopic=31760">http://forum.maxthon.com/index.php?showtopic=31760</a>&nbsp;但没有人解决。 不知道这里有人解决这个问题没？<br><br>
<img src ="http://www.cnblogs.com/AndyDavis/aggbug/383107.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>获得GridView的EmptyDataTemplate中的控件</title><link>http://www.cnblogs.com/AndyDavis/archive/2006/04/03/365216.html</link><dc:creator>AndyDavis</dc:creator><author>AndyDavis</author><pubDate>Sun, 02 Apr 2006 20:12:00 GMT</pubDate><guid>http://www.cnblogs.com/AndyDavis/archive/2006/04/03/365216.html</guid><wfw:comment>http://www.cnblogs.com/AndyDavis/comments/365216.html</wfw:comment><comments>http://www.cnblogs.com/AndyDavis/archive/2006/04/03/365216.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/AndyDavis/comments/commentRss/365216.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/AndyDavis/services/trackbacks/365216.html</trackback:ping><description><![CDATA[这个问题的提出，是我想在Gridview中整理添加记录的功能。<br>如果有数据的时候，我们可以把空的newTextBox放在FooterTemplate中，在程序里可以用<br>Gridview1.FooterRow.FindControl("newTextBox")来取得这个控件，完成添加记录的功能。<br>但如果数据表中没有记录，header和footer都不会显示出来。 这时，只会显示EmptyDataTemplate里的内容。<br>奇怪的是EmptyDataRow并不是Gridview的成员，于是上面的方法不行了。<br>找了很久，找到这样一个变通的办法来获得EmptyDataTemplate里的控件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;txbNew&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;TextBox&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GridView1.Controls(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">).Controls(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">).FindControl(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">newTextBox</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span></div>
很变态，但确实可行。<br>如果大家有更好的办法，请告诉我。 <br><br>neilchen123的回复问到这两层Control是什么，我又写了一段测试程序来弄清这个问题：<br><br>
<div>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img id=Codehighlighter1_14_504_Open_Image onclick="this.style.display='none'; Codehighlighter1_14_504_Open_Text.style.display='none'; Codehighlighter1_14_504_Closed_Image.style.display='inline'; Codehighlighter1_14_504_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_14_504_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_14_504_Closed_Text.style.display='none'; Codehighlighter1_14_504_Open_Image.style.display='inline'; Codehighlighter1_14_504_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Protected</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_14_504_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">Sub&nbsp;btnAddNew_Click()</span><span id=Codehighlighter1_14_504_Open_Text><span style="COLOR: #0000ff">Sub</span><span style="COLOR: #000000">&nbsp;btnAddNew_Click(</span><span style="COLOR: #0000ff">ByVal</span><span style="COLOR: #000000">&nbsp;sender&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Object</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">ByVal</span><span style="COLOR: #000000">&nbsp;e&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;System.EventArgs)<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label1.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">TypeName</span><span style="COLOR: #000000">(GridView1.Controls(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)).ToString&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;EmptyChildTable&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;Table&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GridView1.Controls(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;EmptyGridView&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;GridViewRow&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;EmptyChildTable.Rows(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label1.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Label1.Text&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;EmptyGridView.RowType.ToString&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;txbNewCltName&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;TextBox&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;EmptyGridView.FindControl(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">txbNewCltName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label1.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Label1.Text&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;txbNewCltName.Text<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">End&nbsp;Sub</span></span></div>
</div>
<div>其中的txbNewCltName和btnAddNew都是放在EmptyTemplate里的控件。<br>显示的结果是：<br>ChildTable EmptyDataRow 新添加的内容</div>
<div>可以知道，第一层Control是Table,第二层Control是Row.</div>
<div>&nbsp;</div>
<div>我现在的做法是在FooterTemplate里插入新建的相关控件应付有数据的情况下的插入工作，在EmptyTemplate里也插入新建的相关控件应付无数据的情况下的插入工作。　　这样，不需要虚增一行来显示FooterRow了。</div>
<img src ="http://www.cnblogs.com/AndyDavis/aggbug/365216.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42957/" target="_blank">[新闻]金融风暴波及全球创业板 中国概念股难独善其身</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充)</title><link>http://www.cnblogs.com/AndyDavis/archive/2006/03/31/363896.html</link><dc:creator>AndyDavis</dc:creator><author>AndyDavis</author><pubDate>Fri, 31 Mar 2006 13:13:00 GMT</pubDate><guid>http://www.cnblogs.com/AndyDavis/archive/2006/03/31/363896.html</guid><wfw:comment>http://www.cnblogs.com/AndyDavis/comments/363896.html</wfw:comment><comments>http://www.cnblogs.com/AndyDavis/archive/2006/03/31/363896.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/AndyDavis/comments/commentRss/363896.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/AndyDavis/services/trackbacks/363896.html</trackback:ping><description><![CDATA[摘要: 原文请见Leon.Zhou的：http://pfzhou.cnblogs.com/archive/2006/03/31/363342.html下载了示例代码，并转换成VB了，AJAX功能测试成功。但遇到些小问题：Demo1很正常。Demo2按Leon原来的写法testAJAX.aspx.vb中Line 22不成功。所以我直接在IDE环境中，修改button3的OnClientClick属性，见te&nbsp;&nbsp;<a href='http://www.cnblogs.com/AndyDavis/archive/2006/03/31/363896.html'>阅读全文</a><img src ="http://www.cnblogs.com/AndyDavis/aggbug/363896.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【原创】关于ASP,ASP.NET,VB.NET里的MD5加密函数</title><link>http://www.cnblogs.com/AndyDavis/archive/2006/03/23/356953.html</link><dc:creator>AndyDavis</dc:creator><author>AndyDavis</author><pubDate>Thu, 23 Mar 2006 09:04:00 GMT</pubDate><guid>http://www.cnblogs.com/AndyDavis/archive/2006/03/23/356953.html</guid><wfw:comment>http://www.cnblogs.com/AndyDavis/comments/356953.html</wfw:comment><comments>http://www.cnblogs.com/AndyDavis/archive/2006/03/23/356953.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/AndyDavis/comments/commentRss/356953.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/AndyDavis/services/trackbacks/356953.html</trackback:ping><description><![CDATA[老文章了，在这里再帖一遍吧。<br><br>在ASP中，我们使用过如动网论坛等用的ASP中MD5函数加密出的字符串则如：<br>1165d25d8cd021d5<br><br>而在Asp.Net中下面的方法： <br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MD5</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span></div>
<br>进行MD5加密出来的结果却是:<br>12C403B91165D25D8CD021D5F9B5BB7F <br><br>究其原因，是因为，在ASP中的MD5函数是使用了32位MD5 Hashvalue中的第9~25位再变小写作为密文。知道这个原因，把ASP.NET的结果稍加处理就可以用来比较老数据库中的密码字串了。<br>在ASP的MD5函数中第353、354行：
<div>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">'</span><span style="COLOR: #008000">MD5&nbsp;=&nbsp;LCase(WordToHex(a)&nbsp;&amp;&nbsp;WordToHex(b)&nbsp;&amp;&nbsp;WordToHex(c)&nbsp;&amp;&nbsp;WordToHex(d))</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;MD5</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">LCase</span><span style="COLOR: #000000">(WordToHex(b)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;WordToHex(c))&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">I&nbsp;crop&nbsp;this&nbsp;to&nbsp;fit&nbsp;16byte&nbsp;database&nbsp;password&nbsp;:D</span></div>
</div>
第一句是取全部的32位密文，第二句则是取中间第9~25位为16位密文。<br><br>到了vb.net问题又来了，在vb.net里，无法用到System.Web.Security名称空间，无法用上面简单的办法进行MD5加密。故我写了下面这个函数来处理：<br><br>VB.NET:
<div>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">'</span><span style="COLOR: #008000">MD5&nbsp;加密函数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Shared</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Function</span><span style="COLOR: #000000">&nbsp;MD5(</span><span style="COLOR: #0000ff">ByVal</span><span style="COLOR: #000000">&nbsp;strSource&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">String</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">ByVal</span><span style="COLOR: #000000">&nbsp;Code&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;Int16)&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">String</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">这里用的是ascii编码密码原文，如果要用汉字做密码，可以用UnicodeEncoding，但会与ASP中的MD5函数不兼容</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;dataToHash&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Byte</span><span style="COLOR: #000000">()&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">New</span><span style="COLOR: #000000">&nbsp;System.Text.ASCIIEncoding).GetBytes(strSource)<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;hashvalue&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Byte</span><span style="COLOR: #000000">()&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">CType</span><span style="COLOR: #000000">(System.Security.Cryptography.CryptoConfig.CreateFromName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MD5</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;System.Security.Cryptography.HashAlgorithm).ComputeHash(dataToHash)<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Case</span><span style="COLOR: #000000">&nbsp;Code<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">选择16位字符的加密结果</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">To</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MD5&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Hex</span><span style="COLOR: #000000">(hashvalue(i)).ToLower<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">选择32位字符的加密结果</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">To</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MD5&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Hex</span><span style="COLOR: #000000">(hashvalue(i)).ToLower<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Else</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">Code错误时，返回全部字符串，即32位字符</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">To</span><span style="COLOR: #000000">&nbsp;hashvalue.Length&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MD5&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Hex</span><span style="COLOR: #000000">(hashvalue(i)).ToLower<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">End</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Select</span><span style="COLOR: #000000"><br>&nbsp;</span><span style="COLOR: #0000ff">End&nbsp;Function</span></div>
</div>
<img src ="http://www.cnblogs.com/AndyDavis/aggbug/356953.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42955/" target="_blank">[新闻]2008年10月13日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>注册博客园</title><link>http://www.cnblogs.com/AndyDavis/archive/2006/03/23/356316.html</link><dc:creator>AndyDavis</dc:creator><author>AndyDavis</author><pubDate>Wed, 22 Mar 2006 16:34:00 GMT</pubDate><guid>http://www.cnblogs.com/AndyDavis/archive/2006/03/23/356316.html</guid><wfw:comment>http://www.cnblogs.com/AndyDavis/comments/356316.html</wfw:comment><comments>http://www.cnblogs.com/AndyDavis/archive/2006/03/23/356316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/AndyDavis/comments/commentRss/356316.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/AndyDavis/services/trackbacks/356316.html</trackback:ping><description><![CDATA[<p>傍晚提交的申请，晚上回来就回复了。<br>这里的处理速度还挺快的。<br><br>高兴的是，申请时顺便提的一个关于邮件地址里不能有+号的建议立刻被接纳并处理。</p>
<img src ="http://www.cnblogs.com/AndyDavis/aggbug/356316.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42955/" target="_blank">[新闻]2008年10月13日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>