<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CU4AQ3c9eCp7ImA9WhVVE0g.&quot;"><id>tag:blogger.com,1999:blog-9257728</id><updated>2012-05-06T18:25:42.960-07:00</updated><category term="Course" /><category term="KB" /><category term="Performance" /><category term="SQL" /><category term="Encoding" /><category term="vs2008" /><category term="ActionScript" /><category term="Misc" /><category term="Windows" /><category term="Fix" /><category term="RIA" /><category term="ASP.NET" /><category term="Code" /><category term="Flash" /><category term="PowerShell" /><category term="Chrome" /><category term="COM+" /><category term="SqlServer" /><category term="SQL2005" /><category term="MCPD" /><category term="vs2005" /><category term="SSIS" /><category term="DotNet20" /><category term="非關DotNET" /><category term="HTML5" /><category term="FireFox" /><category term="Command Line" /><category term="LINQ" /><category term="SQL2008" /><category term="CSS" /><category term="Javascript" /><category term="C#3.0" /><category term="ASP" /><category term="XML" /><category term="DotNet" /><category term="IIS" /><category term="C#" /><category term="ASP.NET AJAX" /><category term="WCF" /><category term="Rule" /><category term="SQL2000" /><category term="MCTS" /><category term="T-SQL" /><category term="SVN" /><category term="Tricks" /><category term="Messenger Plus Live" /><category term="compiler" /><category term="Serialization" /><category term="Silverlight" /><title>Clark Rabbit 的DotNet世界</title><subtitle type="html">記錄和分享我的DotNet體驗</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ClarkRabbitdotnet" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="clarkrabbitdotnet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0MNQno9cCp7ImA9WhZXEUg.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-1643624868570851087</id><published>2011-04-28T22:40:00.001-07:00</published><updated>2011-04-30T02:24:53.468-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:53.468-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="KB" /><category scheme="http://www.blogger.com/atom/ns#" term="SVN" /><title>[KB] SVN 出現 『有缺陷的檔案』時的處理方式</title><content type="html">這兩天在使用 Subversion 控管中某個專案的 "Show Log" 功能時，每每出現要我選擇是否使用離線查看Log的功能，如果一直選擇否的話，最後就跳出一個『有缺陷的檔案』的錯誤訊息，當時直覺認為可能是自已的專案目錄有什麼問題而造成，因為Update 和 commit 是正常的，由於正在趕著把某項功能做出來，所以暫時沒有花時間去解決它。沒多久，其他同事也發現Check Out整個專案的目錄也無法成功，最後出現一樣的錯誤訊息『有缺陷的檔案』。由於訊息並不明確，所以問題為何實在令人費解。

上網搜尋了一下『有缺陷的檔案』，發現有相關訊息的文章實在少得可憐，而且似乎都沒有較好的解決方式。如果直接還原備份的Subversion檔案，這樣一定是可以解決的(前提是必需先知道從哪天開始就出現這樣的問題)，且必需冒著遺失這幾天Commit版本的風險，所以當下並不是最好的解決方式。既然中文訊息找不到，那改成搜尋英文的訊息看看呢？前題是得先知道對應的英文訊息是什麼(通常這種程式訊息，直接用翻譯軟體是找不出正確的對應訊息的，千萬別犯傻了!)；所幸找到一段svn的程式碼如下：
&lt;pre name="code" class="csharp"&gt; #: include/svn_error_codes.h:951
msgid "Malformed file"
msgstr "有缺陷的檔案"
&lt;/pre&gt;
網址：&lt;a href="http://svn.apache.org/repos/asf/subversion/branches/artem-soc-work/subversion/po/zh_TW.po"&gt;http://svn.apache.org/repos/asf/subversion/branches/artem-soc-work/subversion/po/zh_TW.po&lt;/a&gt;&lt;br/&gt;
由此可以得知對應的英文訊息為『Malformed file』，上網再搜尋一下，馬上發現有許多的文章，看了幾篇文章以後，發現錯誤的問題可能在於某個版本Commit上去的時候出現了問題，導致一遇到該版本時，SVN就會回出這樣的錯誤訊息，不過因為事情已經發生了幾天，中間大概也commit了上百個版本，所以實在不知道問題在哪裡。後來找到StackOverflow中也有人提出這樣的&lt;a href="http://stackoverflow.com/questions/4407638/svn-malformed-file-corrupt-repository"&gt;問題&lt;/a&gt;，原來svnadmin 工具有個Dump的功能，可以藉此跑過所有的版本，來確認問題是出在哪一版本上，用法如下：
&lt;pre name="code" class="csharp"&gt; 
svnadmin dump /SVN目錄/MyProject &gt; nul 
&lt;/pre&gt;
&lt;img style="margin:0 10px 10px 0;width: 320px; height: 210px;" src="http://3.bp.blogspot.com/--6wxG2ZxnBI/TbvSE6r6r0I/AAAAAAAAF7c/hjMcZykEeGc/s320/SVNError.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5601301543480110914" /&gt;&lt;br/&gt;
這樣就會依序Dump所有的版本號碼出來，如果遇到錯誤的版本，就會跳出錯誤訊息，這麼一來要解決問題就不是難事了(看了幾篇討論的結果，也知道File Base的 Repository 能夠針對該版本進行修改(最好是用前一版覆蓋錯誤的版本，以免改錯)。 Dump 的結果，錯誤發生在10號版本，到SVN Server的目錄下(\SVN目錄\MyProject\db\revprops\)一查，果然該版本內容都是NULL Code，顯然檔案內容不正確(經過確認，在Client端，如果使用離線瀏覽Log時，最早的版本也停在11)刪掉該版本檔案後，用前一版9複製成10以後，問題解決，免除掉一段可能遺失的&lt;span class="deleted"&gt;回憶&lt;/span&gt;修改記錄的感覺真好！

&lt;blockquote&gt;特別提醒一下，由於操作SVN檔案事關重大，為免發生不可回復的問題，務必事先備份SVN檔案再進行俢復的操作。&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-1643624868570851087?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/1643624868570851087/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=1643624868570851087" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/1643624868570851087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/1643624868570851087?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2011/04/kb-fix-malformed-file-on-subversion.html" title="[KB] SVN 出現 『有缺陷的檔案』時的處理方式" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/--6wxG2ZxnBI/TbvSE6r6r0I/AAAAAAAAF7c/hjMcZykEeGc/s72-c/SVNError.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0cNQHs8fip7ImA9Wx9bFkw.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-4168760824398008946</id><published>2011-02-24T20:11:00.001-08:00</published><updated>2011-02-24T21:18:11.576-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-24T21:18:11.576-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vs2008" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Chrome" /><category scheme="http://www.blogger.com/atom/ns#" term="FireFox" /><title>[Fix] 在 Chrome/Firefox 開啟 ASP.NET Development server 下網站速度緩慢問題</title><content type="html">已經忘了大約有多久的時間，可能是在升級到win7當作開發環境以後，就遇到了使用Chrome/Firefox 來開啟開發中的網站載入網頁速度非常緩慢的問題；開啟或重新整理一個網頁的時間絕對超過10秒鐘以上，加上網頁上載入的javascript檔案非常多，所以之前常常在Debug時直接改用IE來作業，但是如果一遇到Bug是發生在非IE瀏覽器上時，就非常頭痛了。&lt;br/&gt;&lt;br/&gt;
之前遇到這樣的情況是，使用fiddler來觀察時，發現只要網頁一開，同時載入5個資源(js,css or image)時，browser就會卡住，所以當時朝著加大max connection數量的方向在想，但是由於在趕案子(好吧，我承認這只是一個藉口..現在看來只是一個不要先入為主的認定，再加上花5分鐘google一下就可以解決的事)，所以一直沒能解決這件事。&lt;br/&gt;&lt;br/&gt;
今天因為在開發新的網站，又遇到了一樣的情況；這回真的忍不住了，直覺的打了幾個keyword搜尋一下，沒想到困擾已久的問題就迎刃而解，前後絕對花不到5分鐘..Orz&lt;br/&gt;&lt;br/&gt;
原來問題出在IPv6的問題造成DNS解析速度緩慢，有以下3種解決方式
&lt;ul&gt;
&lt;li&gt;修改hots，將localhost指定為127.0.0.1&lt;/li&gt;
&lt;li&gt;如果使用Firefox，關掉它的IPv6設定,Chrome的話似乎還沒有解法&lt;/li&gt;
&lt;li&gt;關掉系統的IPv6功能&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;&lt;br/&gt;
在以不改變系統設定的情況下，我選擇修改hosts來處理掉這件事，相關文章可以參考下列網址：&lt;br/&gt;
&lt;a href="http://www.wagnerdanda.me/2009/12/asp-net-development-server-slow-on-windows-vista7-with-firefox-or-chrome/" target="_blank"&gt;ASP.NET Development server slow on Windows Vista/7 with Firefox or Chrome&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://weblogs.asp.net/dwahlin/archive/2007/06/17/fixing-firefox-slowness-with-localhost-on-vista.aspx" target="_blank"&gt;Fixing Firefox Slowness with localhost on Vista (or XP with IPv6)&lt;/a&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-4168760824398008946?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/4168760824398008946/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=4168760824398008946" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4168760824398008946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4168760824398008946?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2011/02/fix-development-server-site-was-slowly.html" title="[Fix] 在 Chrome/Firefox 開啟 ASP.NET Development server 下網站速度緩慢問題" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEMGSHo4fip7ImA9Wx9UGUs.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-2400073625766766636</id><published>2011-02-16T08:38:00.001-08:00</published><updated>2011-02-17T09:07:09.436-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-17T09:07:09.436-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Serialization" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="DotNet" /><title>[CODE] 解決反序列化時 『__type』 造成的錯誤訊息</title><content type="html">這兩天在工作上遇到一個需求，要將原來A網站上用Ajax-Enabled WCF做出來的Ajax查詢ID的功能提供給Server上的B網站使用。本來這樣的需求可以透過直接在B網站上呼叫A網站的WCF服務來達成，但是考慮一旦這樣做下來，後續2個網站將必需放在同一台Server上，且在開發時期得另外架一個網站提供這樣的服務，並不便宜開發及除錯。於是改為在B網站上，直接透過在B網站的查詢字串在Server端以Post方式直接連到A網站的WCF服務來取得資料，而不在Client端完成(不過這樣相對的也有它的成本需要考量，必需自行取捨)。 &lt;br/&gt;&lt;br/&gt;
這樣的方式之前在其他Case也有做過，不過當時A網站並不是直接透過WCF的做法來提供Ajax的查詢，而是自行寫一隻.AXD(Http Handler)的方式來完成。本以為類似的模式只要依樣畫葫蘆就可以完成，但卻在將WCF轉出的JSON Data再轉回B網站程式中的物件時出現了錯誤『System.ArgumentNullException: 值不能為 null。參數名稱: type』，遇到這樣的問題，先查了一下A網站出來的JSON，格式如下：『 {"__type":"SimpleType:#TestTypeResolver", "ID":"00001","Name":"Jacky"}"』，其中SimpleType 為A網站Server轉出來的物件type； 看到這裡，直覺認為是『__type』這個欄位在作崇，於是先從程式Replace掉再試一次看看...！！果不其然，只要拿掉了__type 欄位，錯誤訊息則不再出現。
&lt;br/&gt;&lt;br/&gt;
得到了這樣的線索之後，問題就變得明確多了；拜了一下G大神之後，雖然沒有得到直接的解決方式，但卻找到一個解決問題的關鍵訊息...『&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascripttyperesolver(v=VS.90).aspx"&gt;JavaScriptTypeResolver 物件&lt;/a&gt; 』！ 這個物件依名稱大概可以猜出七八成它的意義，主要是  JavaScriptSerializer 在遇到__type 這樣的meta資訊時，如何將物件Type轉成string 存到__type中，以及反解時將__type中的字串轉回type的功能。 有了這樣的訊息以後問題就容易解了，只要在建立 JavaScriptSerializer ，傳入自行實作的 JavaScriptTypeResolver ，就可以避開這樣的問題。
&lt;pre name="code" class="csharp"&gt;
 //訂為private，以免外部程式誤用
 private class SimpleTypeResolver : JavaScriptTypeResolver
        {
            public override Type ResolveType(string id)
            {
                return typeof(SimpleType); //在這個例子中只做SimpleType的轉換，暫不考慮其他物
            }

            public override string ResolveTypeId(Type type)
            {
                throw new NotImplementedException(); //在這個例子中不做Serialize，所以不會被呼叫
            }
        }


public SimpleType Deserialize(string json){
     JavaScriptSerializer serial = new JavaScriptSerializer(new SimpleTypeResolver());
     var myType = serial.DeserializeObject(@"{""__type"":""SimpleType:#TestTypeResolver"",""ID"":""00001"",""Name"":""Jacky""}");
}
&lt;/pre&gt;

結論：&lt;br/&gt;
原本在使用 JavaScriptSerializer 並沒有留意到內部是透過 JavaScriptTypeResolver 來做 Reflection 的工作，所以遇到這樣情況時，可能一時無法理解原因為何，只能多花時間再去追可能造成問題的原因，若是在開發上能針對使用的物件多花一點心思，不只懂如何使用它，還要瞭解背後的原理或細節，這樣對於各種問題的狀況應該能夠更快的掌握才是！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-2400073625766766636?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/2400073625766766636/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=2400073625766766636" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/2400073625766766636?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/2400073625766766636?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2011/02/code-using-javascripttyperesolver.html" title="[CODE] 解決反序列化時 『__type』 造成的錯誤訊息" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkYGSHkzfCp7ImA9WxBbGU4.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-8159631021037578713</id><published>2010-03-18T09:30:00.001-07:00</published><updated>2010-03-18T09:35:29.784-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-18T09:35:29.784-07:00</app:edited><title>[Code] 建立Template式的 User Controls</title><content type="html">&lt;p&gt;在ASP.NET網站上使用UserControl是常見的一種使用方法，不過Clark以往比較少在User Control上使用到Template的方法。前陣子遇到一個需求：要將所有的Grid的下方加上不同的廣告；由於這些Grid統一都是使用了一個GridControl 的UserControl，而廣告加的位置正好就在Grid和分頁器的中間。一遇到這種情況時，在還不知道Template的作法時，直覺式的用法可能就是在UserControl中加一個MultiView的ServerControl，再利用外部帶參數進入UserControl來決定要顯示什麼廣告。這樣的方式的確可以達到功能，但是每次一改廣告，就要去改動這個GridControl，似乎不是長久之計，也不是良好的設計方法。&lt;/p&gt;  &lt;p&gt;但是一想到Panel or Repeater這種Server Control明明可以使用&amp;lt;xxxTemplte/&amp;gt;的方法來從元件外部指定內部的Control 或HTML，那一定有種方法可以讓UserControl也達到這種功能囉！？沒錯！只要宣告 ITemplate 型別的屬性就可以讓UserControl多了指定內部Control的功能，再加上實作部份程式碼就能夠將外部指定的元素Render出來。&lt;/p&gt;  &lt;p&gt;MyBox.ascx:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; ClassName=&amp;quot;MyBox&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; String Title { get; set; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;     &lt;span class="kwrd"&gt;private&lt;/span&gt; ITemplate _contentTemplate = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;     &lt;span class="rem"&gt;/// 宣告ContentTemplate，供外部指定(e.g.&amp;lt;ContentTemplate&amp;gt;xxxx&amp;lt;/ContentTemplate&amp;gt;)&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;     &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum8" class="lnum"&gt;   8:&lt;/span&gt;     [TemplateContainer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ControlContainer))]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum9" class="lnum"&gt;   9:&lt;/span&gt;     [PersistenceMode(PersistenceMode.InnerProperty)]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum10" class="lnum"&gt;  10:&lt;/span&gt;     [TemplateInstance(TemplateInstance.Single)]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum11" class="lnum"&gt;  11:&lt;/span&gt;     &lt;span class="rem"&gt;/* TemplateInstance.Single 表示Template只實例化一次，&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum12" class="lnum"&gt;  12:&lt;/span&gt; &lt;span class="rem"&gt;     * 此時才可以用ID直接指定Template中的Control, 否則 Compile 會失敗 */&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum13" class="lnum"&gt;  13:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; ITemplate ContentTemplate&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum14" class="lnum"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum15" class="lnum"&gt;  15:&lt;/span&gt;         get&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum16" class="lnum"&gt;  16:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum17" class="lnum"&gt;  17:&lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; _contentTemplate;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum18" class="lnum"&gt;  18:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum19" class="lnum"&gt;  19:&lt;/span&gt;         set&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum20" class="lnum"&gt;  20:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum21" class="lnum"&gt;  21:&lt;/span&gt;             _contentTemplate = value;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum22" class="lnum"&gt;  22:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum23" class="lnum"&gt;  23:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum24" class="lnum"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum25" class="lnum"&gt;  25:&lt;/span&gt;     &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Init()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum26" class="lnum"&gt;  26:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum27" class="lnum"&gt;  27:&lt;/span&gt;         &lt;span class="rem"&gt;///一旦外部有指定&amp;lt;ContentTemplate&amp;gt;內容則將內容實例化到Container中&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum28" class="lnum"&gt;  28:&lt;/span&gt;         &lt;span class="rem"&gt;///再加入PlaceHolder中&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum29" class="lnum"&gt;  29:&lt;/span&gt;         &lt;span class="kwrd"&gt;if&lt;/span&gt; (_contentTemplate != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum30" class="lnum"&gt;  30:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum31" class="lnum"&gt;  31:&lt;/span&gt;             ControlContainer container = &lt;span class="kwrd"&gt;new&lt;/span&gt; ControlContainer();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum32" class="lnum"&gt;  32:&lt;/span&gt;             _contentTemplate.InstantiateIn(container);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum33" class="lnum"&gt;  33:&lt;/span&gt;             placeHolder1.Controls.Add(container);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum34" class="lnum"&gt;  34:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum35" class="lnum"&gt;  35:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum36" class="lnum"&gt;  36:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum37" class="lnum"&gt;  37:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ControlContainer : Control, INamingContainer&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum38" class="lnum"&gt;  38:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum39" class="lnum"&gt;  39:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; ControlContainer()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum40" class="lnum"&gt;  40:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum41" class="lnum"&gt;  41:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum42" class="lnum"&gt;  42:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum43" class="lnum"&gt;  43:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;legend&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;&lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; =Title &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;legend&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:PlaceHolder&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;placeHolder1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Demo.aspx&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Register Src=&amp;quot;~/MyBox.ascx&amp;quot; TagName=&amp;quot;MyBox&amp;quot; TagPrefix=&amp;quot;My&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt;     &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnbtnSearch_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;         txtSearch.Text = DateTime.Now.ToString();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;demo templated User Control&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        fieldset&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;            border: 2px;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;            border-style:solid;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;            border-color: Black;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;            padding: 2px;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;            width: 250px;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;leftBlock&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;My:MyBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mybox1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SearchBox&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ContentTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                &lt;span class="rem"&gt;&amp;lt;!-- 測試Template中的Server Control是否可用 --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;txtSearch&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnSearch&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;送出&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OnbtnSearch_Click&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ContentTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;My:MyBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;執行結果：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_nZrf1_vAjR0/S6JVGW_0DHI/AAAAAAAACCU/or080BEQzf0/s1600-h/template%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="template" border="0" alt="template" src="http://lh6.ggpht.com/_nZrf1_vAjR0/S6JVHsrhqkI/AAAAAAAACCY/HzKizAMhjcU/template_thumb.png?imgmax=800" width="244" height="67" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;當然，Template的用法不僅僅這麼簡單，當然也可以做到類似Repleater這樣的Server Control的功能。不過在這樣的實作方式中，已經可以解決Clark的問題了，如此一來只要在原來的GridControl上加上該功能，廣告就可以一率從外部指定，這樣一來元件就會更加具有彈性！&lt;/p&gt;

&lt;p&gt;更多說明請參考MSDN 上的範例：&lt;a href="http://msdn.microsoft.com/en-us/library/36574bf6(VS.80).aspx"&gt;How to: Create Templated ASP.NET User Controls&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#ff0000"&gt;※此範例和MSDN上的範例在VS2008上均有無法在Design Mode中檢視UserControl的問題 (Error Creating Control – xxxx Type 'System.Web.UI.UserControl' does not have a public property named 'ContentTemplate' )，這個問題目前Clark還未找到解法，但是不影響執行的結果，若有網友有解決方式也請不吝賜教，造福大家一下~&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-8159631021037578713?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/8159631021037578713/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=8159631021037578713" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8159631021037578713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8159631021037578713?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/03/code-templated-aspnet-user-controls.html" title="[Code] 建立Template式的 User Controls" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_nZrf1_vAjR0/S6JVHsrhqkI/AAAAAAAACCY/HzKizAMhjcU/s72-c/template_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkcDSXk7fyp7ImA9WxBbEUk.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-7422513202867245106</id><published>2010-03-08T20:25:00.001-08:00</published><updated>2010-03-09T05:07:58.707-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-09T05:07:58.707-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>[Memo] 當Memcached 安裝成為 Windows Service 時如何指定參數</title><content type="html">&lt;p&gt;前陣子由於負責的網站Loading越來越重，加上前端Web Server Load Balance 有N台主機，在原本只有.NET Cache當作Cache的情況下，每個網頁仍需要Query N次資料才能夠全部進Cache。這個情況下只好求助Memcached這樣的Cache Server機製，好讓多台Web Server能夠共用Cache資料。達到『一人吃N人補』的境界。&lt;/p&gt;  &lt;p&gt;Memcached 應該算是目前還滿流行的Cache Server，除了功能強大之外使用上也算簡單。安裝部份則只要下二行參數&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;memcached -d install&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;memcached -d start &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;就能夠將memcached安裝並啟動成為Windows Service。不過有一個比較垢病的地方是無法指定服務啟動時的參數，導致memcached啟動時只能使用預設的最大64MB的記憶體。&lt;/p&gt;

&lt;p&gt;就目前為止查到的解決這個問題的方法只有一種，進Regstry修改。&lt;/p&gt;

&lt;p&gt;修改的路徑為： 
  &lt;br /&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached 下的 ImagePath中的值，將原來『&amp;quot;N:xxxx\xxx\xxx\memcached.exe&amp;quot; -d runservice』後方下參數(e.g. –m1024)，像這樣 

  &lt;br /&gt;『&amp;quot;N:xxxx\xxx\xxx\memcached.exe&amp;quot; -d runservice -m1024』。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_nZrf1_vAjR0/S5XbVMeJvHI/AAAAAAAAB-E/rL7Xcqpc_vk/s1600-h/memcached-1%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="memcached-1" border="0" alt="memcached-1" src="http://lh3.ggpht.com/_nZrf1_vAjR0/S5XbWMdpHII/AAAAAAAAB-I/jIudVbtC4h0/memcached-1_thumb%5B3%5D.png?imgmax=800" width="507" height="263" /&gt;&lt;/a&gt; 修改完成後，重新啟動即可。&lt;/p&gt;

&lt;p&gt;Memcached相關文章：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.miniasp.com/post/2010/01/Memcached-for-ASPNET-Quick-Start-Guide.aspx" target="_blank"&gt;ASP.NET 環境下使用 Memcached 快速上手指南&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://memcachedproviders.codeplex.com/" target="_blank"&gt;Memcached Providers&lt;/a&gt; (Memcached Server的Client 端Library for .NET)&lt;/li&gt;
&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-7422513202867245106?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/7422513202867245106/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=7422513202867245106" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7422513202867245106?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7422513202867245106?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/03/memo-assign-parameters-to-memcached-on.html" title="[Memo] 當Memcached 安裝成為 Windows Service 時如何指定參數" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_nZrf1_vAjR0/S5XbWMdpHII/AAAAAAAAB-I/jIudVbtC4h0/s72-c/memcached-1_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4NRH4yeCp7ImA9WxBbEU8.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-7869623415647674320</id><published>2010-03-06T19:54:00.001-08:00</published><updated>2010-03-09T00:39:55.090-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-09T00:39:55.090-08:00</app:edited><title>[Tips] Runtime JavaScript and Css 壓縮方式</title><content type="html">&lt;p&gt;&lt;a href="http://www.clarkrabbit.net/2010/02/tips-compress-javascript-for-better.html"&gt;上回&lt;/a&gt;有提到過壓縮JavaScript來加快網頁載入速度的方式，而實際導入專案中使用的方式有許多種；一般來說我們在開發期間會以未壓縮的js&amp;amp;css檔案進行開發工作，以方便修改及Debug工作，等到了測試期間才會改用壓縮格式的檔案來測試。所以通常會採用的作法是在Debug和Release version時Include不同的檔案來達成，並透過類似MSBuild的方式在Build Release版本時將.js的檔案做壓縮，產出類似xxx-min.js這樣的壓縮檔案。&lt;/p&gt;&lt;p&gt;產出不同版本檔案的方式其實很直覺，但是Clark覺得這樣還不夠彈性，由於YUI Compressor for .Net版本也和YUI Compressor一樣支援css檔案的壓縮，自然就可以考慮如果是在輸出js及css檔案時即時做壓縮。不過前提是即時壓縮需要搭配一些機製來減少Server的負擔，例如Client Side 和 Server Side 的Cache。不然光是應付每個User Request的js檔案就讓你的Server吃不消了！&lt;/p&gt;&lt;p&gt;Clark是以Handler的方式實作即時壓縮的功能，只要頁面在include js時指定"Scripts/js.ashx?path=jquery-1.3.2.js"，handler就會將該js檔讀入並使用YUI Compressor for .Net做壓縮，並吐回壓縮過的檔案到Client端。為了針對Debug and Release version而吐出不同的js，使用#if DEBUG來區分版本。&lt;/p&gt;&lt;p&gt;以下是程式碼:&lt;/p&gt;&lt;p&gt;js.ashx.cs:&lt;/p&gt;&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="rem"&gt;/// js.ashx.cs&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; js : IHttpHandler&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProcessRequest(HttpContext context)&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        String filePath = context.Request[&lt;span class="str"&gt;"path"&lt;/span&gt;];&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        String fullPath = Path.Combine(Path.GetDirectoryName(context.Request.PhysicalPath), filePath);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        String ext = Path.GetExtension(fullPath);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(ext)  ext.ToLower() != &lt;span class="str"&gt;".js"&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        String orgJS = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//TODO: 將原始資料存入Cache，不必每次做載入&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (FileStream fs = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileStream(fullPath, FileMode.Open))&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;            StreamReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(fs);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;            orgJS = reader.ReadToEnd();&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;            reader.Close();&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        &lt;span class="rem"&gt;//TODO: 將壓縮過的資料存入Cache，不必每次壓縮&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;#if DEBUG&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        String outputJS = orgJS;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;#else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        String outputJS = JavaScriptCompressor.Compress(orgJS);            &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        &lt;span class="rem"&gt;//TODO: 判斷Browser是否支援GZip, 支援則將資料做GZip壓縮等..&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        context.Response.ContentType = &lt;span class="str"&gt;"text/javascript"&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        context.Response.ContentEncoding = Encoding.UTF8;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        context.Response.ExpiresAbsolute = DateTime.Today.AddYears(1);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        context.Response.Write(outputJS);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsReusable&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        get&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;css.ashx.cs:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="rem"&gt;/// css.ashx.cs&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; css : IHttpHandler&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProcessRequest(HttpContext context)&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        String filePath = context.Request[&lt;span class="str"&gt;"path"&lt;/span&gt;];&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        String fullPath = Path.Combine(Path.GetDirectoryName(context.Request.PhysicalPath), filePath);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        String ext = Path.GetExtension(fullPath);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(ext)  ext.ToLower() != &lt;span class="str"&gt;".css"&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        String orgCss = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        &lt;span class="rem"&gt;//TODO: 將原始資料存入Cache，不必每次做載入&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (FileStream fs = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileStream(fullPath, FileMode.Open))&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;            StreamReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(fs);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;            orgCss = reader.ReadToEnd();&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;            reader.Close();&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//TODO: 將壓縮過的資料存入Cache，不必每次壓縮&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;#if DEBUG&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        String outputCss = orgCss;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;#else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        String outputCss = CssCompressor.Compress(orgCss);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//TODO: 判斷Browser是否支援GZip, 支援則將資料做GZip壓縮等..&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        context.Response.ContentType = &lt;span class="str"&gt;"text/css"&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        context.Response.ContentEncoding = Encoding.UTF8;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        context.Response.Write(outputCss);&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsReusable&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;        get&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Default.aspx&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebSite._Default"%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt; &lt;span class="kwrd"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Css &amp;amp; JavaScript Compressor Test&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    &lt;span class="rem"&gt;&amp;lt;!-- 借用ZenGarden的css sample. 所有要include的css檔都丟給 css.ashx處理 --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/css"&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;="stylesheet"&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;="Styles/css.ashx?path=zengarden-sample.css"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    &lt;span class="rem"&gt;&amp;lt;!-- 所有include的js檔都丟給js.ashx處理 --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;="Scripts/js.ashx?path=jquery-1.3.2.js"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt;  &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt;     &amp;lt;script type=&lt;span class="str"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;         $(&lt;span class="kwrd"&gt;function&lt;/span&gt; () {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;             &lt;span class="rem"&gt;//test for jquery&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;             $(&lt;span class="str"&gt;'#pageHeader h1'&lt;/span&gt;).fadeOut().fadeIn();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;         });&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;     &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="form1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="pageHeader"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;            Css And Javascript Test&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;這樣一來，只要在include css &amp;amp; js時都照此方式來處理，那在Release Version時，Client就會自動改用壓縮過的js和css檔，而不需要另外做設定，也不會產出多個檔案減少檔案管理上的負擔。&lt;/p&gt;

&lt;p&gt;&lt;span style="color:#ff0000;"&gt;※以上的範例僅為Demo壓縮的概念，若要架構在Production Site上還有一些功能需要去實作，以免造成Server Loading過重，以及沒有Client端Cache導致User Experience不佳等問題。&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-7869623415647674320?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/7869623415647674320/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=7869623415647674320" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7869623415647674320?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7869623415647674320?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/03/tips-runtime-javascript-and-css.html" title="[Tips] Runtime JavaScript and Css 壓縮方式" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUEFRng4fSp7ImA9WxBUFko.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-7165167662952963334</id><published>2010-03-03T20:32:00.001-08:00</published><updated>2010-03-03T20:40:17.635-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T20:40:17.635-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Fix" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>[Memo] 『無法辨認的逸出序列』的另一種可能性</title><content type="html">&lt;p&gt;Compile不知道幾千次以上的Web Project突然蹦出一則錯誤 Unrecognized escape sequence (中文訊息:無法辨認的逸出序列)。打開出現錯誤的Souce Code，發現都是在中文字的後方才會出現這樣的問題；照MSDN上的解釋為&amp;quot;在字串中反斜線 (\) 的後方出現未預期的字元&amp;quot;，不過光從Editor上看來該行根本沒有出現&amp;quot;\&amp;quot;的字元。&lt;/p&gt;  &lt;p&gt;遇到這個問題，加上錯誤出現在中文字串後面，所以直覺認為是Encoding問題。在另存檔案看了一下檔案的Encoding方式為big5。由於之前沒有仔細在看是否所有檔案都是以utf-8編碼，所以猜想難道是什麼動作改了檔案的編碼方式？！先不管是否這樣，在將檔案改以utf-8格式存檔以後，該行的錯誤已經沒出現了，但是其他行陸續出現這個問題，顯示錯誤的檔案不止一個，這樣改下去不是辦法。&lt;/p&gt;  &lt;p&gt;在看了一下Subversion中的Log之後，確認近期並沒有動到該檔案，本地的檔案時間也一樣停留在上次修改的時間，所以證實並非檔案編碼遭到修改而造成。&lt;/p&gt;  &lt;p&gt;回頭想想這幾天修改了什麼設定，想到昨天為了測試某個Open Source Project而將根目錄改成該Project的目錄。但是心想遇到問題的Project是以虛擬目錄的方式存在，應該不會被影響才對！為了證實問題，將目錄改回原來的C:\inetpub\wwwroot下，重新Compile一次…鏘鏘！錯誤訊息不見了，Compile完成！&lt;/p&gt;  &lt;p&gt;既然知道了問題，本著求知的精神將Web.config打開來看，發現有一段設定相當可疑..&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;globalization&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        &lt;span class="attr"&gt;requestEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        &lt;span class="attr"&gt;responseEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        &lt;span class="attr"&gt;fileEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;fileEncoding 指定為utf-8，但是剛剛出現錯誤的Project中不少檔案是以big5編碼的，所以問題應該是虛擬目錄繼承了根目錄的設定，使用utf-8當作檔案的編碼格式。回頭將Project中的Web.config加了一行。&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;&amp;lt;!-- 如果是線上環境，千萬別直接照著修改，請先確認自已的encoding方式 --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;globalization&lt;/span&gt; &lt;span class="attr"&gt;fileEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;不指定fileEncoding的值，讓Compiler直接以檔案的BOM記錄的編碼方式來當作檔案編碼，重新Compile一次，問題解決！&lt;/p&gt;

&lt;p&gt;結論：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;虛擬目錄中如果未指定Encoding方式，會直接繼承根目錄&amp;quot;指定&amp;quot;的Encoding。&lt;/li&gt;

  &lt;li&gt;若未指定fileEncoding的值，Compiler會以檔案的BOM值來作為檔案Encoding格式。&lt;/li&gt;

  &lt;li&gt;光從錯誤訊息不一定能直接看出問題，但是可以懷疑造成問題的可能性！&lt;/li&gt;
&lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-7165167662952963334?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/7165167662952963334/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=7165167662952963334" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7165167662952963334?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7165167662952963334?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/03/memo-unrecognized-escape-sequence.html" title="[Memo] 『無法辨認的逸出序列』的另一種可能性" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0IDQn0-cCp7ImA9WxBUFk4.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-7343283837126046939</id><published>2010-03-03T08:57:00.001-08:00</published><updated>2010-03-03T08:59:33.358-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T08:59:33.358-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vs2008" /><title>.NET Reflector Pro 讓你遇到問題不再"不知所謂"</title><content type="html">&lt;p&gt;在Coding的不歸路上，隨著專案越來越大，歷史越來越久遠，用到的Library也越多，這個時候每當到問題時，常常發生的一個情況是在Debug到某個Library的method時由於無法再追下去(沒有Source Code或者就算有也不一定能確定版本是否正確)。這個時候常常需要用到.NET Reflector 加上&amp;quot;充份的相像力&amp;quot;來查看Library的method裡頭哪裡有可能會出問題。而越是分散式的寫法，在看Code時就更需要來回切換在不同的Class裡頭。&lt;/p&gt;  &lt;p&gt;而這種刻苦的情節在Clark發現了.NET Reflector Pro提供了Debug Assembly這樣的好物之後將不再會發生了！幾乎所有的Library都可以被Decompile然後攤在陽光下，讓你 一步一步的追出問題的根源，或者瞭解它的實作方式，來提供做為問題分析的依據。&lt;/p&gt;  &lt;p&gt;不過這套工作是需要付費的，請花195美元來享用它的功能。但大家可以先下載並執行最新版本的.NET Reflector 來將.NET Reflector Pro自動安裝到Visual Studio 2008 or Visual Sutdio 2010上做15天的試用。&lt;/p&gt;  &lt;p&gt;Debug Code or Assembly 的方式&lt;a href="http://www.red-gate.com/products/reflector/walkthrough.htm"&gt;官網&lt;/a&gt;已經說明得很清楚了，所以就不再多做說明，有圖有真相。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_nZrf1_vAjR0/S46VcC-unjI/AAAAAAAAB98/3ZveX9JhEyM/s1600-h/ReflectorPro%5B9%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ReflectorPro" border="0" alt="ReflectorPro" src="http://lh6.ggpht.com/_nZrf1_vAjR0/S46VdJbLgII/AAAAAAAAB-A/DQZplv3CfrI/ReflectorPro_thumb%5B5%5D.jpg?imgmax=800" width="644" height="343" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-7343283837126046939?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/7343283837126046939/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=7343283837126046939" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7343283837126046939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7343283837126046939?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/03/net-reflector-pro.html" title=".NET Reflector Pro 讓你遇到問題不再&amp;quot;不知所謂&amp;quot;" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_nZrf1_vAjR0/S46VdJbLgII/AAAAAAAAB-A/DQZplv3CfrI/s72-c/ReflectorPro_thumb%5B5%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcBQHg7cCp7ImA9WxBUEEs.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-5820596756544590683</id><published>2010-02-23T21:33:00.001-08:00</published><updated>2010-02-24T19:20:51.608-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-24T19:20:51.608-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>[Tips] HttpUtility.ParseQueryString 使用注意事項</title><content type="html">&lt;p&gt;之前在&lt;a href="http://blog.darkthread.net/" target="_blank"&gt;黑暗執行緒&lt;/a&gt;上看到&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/06/parsequerystring.aspx" target="_blank"&gt;這篇文章&lt;/a&gt;，知道了有PrseQueryString這個工具，由於一般在網頁上如果遇到參數的需求，不外乎以Request[xx]方式就可以讀出需要的參數，所以這樣的需求應該比較少會遇到。不過偶然情況下在最近的專案中需要用到一個將 &amp;quot;var1=1&amp;amp;var2=2&amp;amp;..” 這樣將 url 傳遞過來的參數做拆解的功能。由於該key-value傳是存在 url 的某個參數下(如&amp;quot;demo.aspx?type=a&amp;amp;keyList=…&amp;quot;的keyList中)，所以直接使用Request當然就無法讀到需要的值了。&lt;/p&gt;  &lt;p&gt;遇到這個情況，如果自已寫一個拆解的method當然不是問題，不過直覺想起HttpUtility.ParseQueryString應該可以解決這個需求，所以直接使用了這個元件來解決問題。但是隔沒多久就有User反應功能有問題；在debug之後，發現一旦遇到傳遞的key-value中含有plus(『+』)字元時，就會變成空白。回頭研究了一下確認，證實ParseQueryString會將未UrlEncode過的plus字元轉換成空白。&lt;/p&gt;  &lt;p&gt;針對此一情況，一種的解法是在使用ParseQueryString前事先將plus轉換成&amp;quot;%2b”，如此一來ParseQueryString即可正確解決變成空白的問題。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="rem"&gt;//keylist = HttpUtility.UrlEncode(&amp;quot;var1=1&amp;amp;var2=2&amp;amp;total=1+2&amp;quot;);&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="rem"&gt;//http://localhost/ParseTest.aspx?type=parse&amp;amp;keylist=var1%3d1%26var2%3d2%26total%3d1%2b2&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;String query = Request[&lt;span class="str"&gt;&amp;quot;keylist&amp;quot;&lt;/span&gt;];&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;Response.Write(HttpUtility.ParseQueryString(query)[&lt;span class="str"&gt;&amp;quot;total&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;//output: 1 2&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;Response.Write(HttpUtility.ParseQueryString(query.Replace(&lt;span class="str"&gt;&amp;quot;+&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;%2b&amp;quot;&lt;/span&gt;))[&lt;span class="str"&gt;&amp;quot;total&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;//output: 1+2&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;不過由於這種修補方式不夠正式，所以雖然可以解決遇到&amp;quot;+&amp;quot;時出現錯誤的問題，但仍不建議這麼使用。由於需求的功能較單純，為確保讀出的資料都可以如實的取回來，最後還是改用自行解析的方式來處理。&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; NameValueCollection ParseQueryString(String query)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    NameValueCollection nvList = &lt;span class="kwrd"&gt;new&lt;/span&gt; NameValueCollection();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    String[] fieldList = query.Split(&lt;span class="str"&gt;'&amp;amp;'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (String field &lt;span class="kwrd"&gt;in&lt;/span&gt; fieldList)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; eqIndex = field.IndexOf(&lt;span class="str"&gt;'='&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        &lt;span class="rem"&gt;//=存在且不在第1個和最後一個字元&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (eqIndex &amp;gt; 0 &amp;amp;&amp;amp; eqIndex != (field.Length-1))&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;            String name = field.Substring(0, eqIndex);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;            String &lt;span class="kwrd"&gt;value&lt;/span&gt; = field.Substring(eqIndex + 1);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;            nvList.Add(name, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; nvList;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;結論： 
  &lt;br /&gt;HttpUtility.ParseQueryString對於一般&amp;quot;編碼&amp;quot;過的QueryString的折解沒有問題，但如果遇到QueryString中的類QueryString的情況，由於類QueryString中的各個value無法先行編碼，所以一旦被HttpUtility.ParseQueryString解讀時就可能會出現&amp;quot;+&amp;quot;字元被解成空的問題，這個時候就無法再偷懶了，請自行解析吧！&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-5820596756544590683?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/5820596756544590683/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=5820596756544590683" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/5820596756544590683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/5820596756544590683?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/02/tips-httputilityparsequerystring.html" title="[Tips] HttpUtility.ParseQueryString 使用注意事項" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkMER306fyp7ImA9WxBVFko.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-1569926885079618973</id><published>2010-02-19T06:30:00.001-08:00</published><updated>2010-02-20T07:06:46.317-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-20T07:06:46.317-08:00</app:edited><title>[Memo] 以命令列工具 appcmd 管理 IIS7</title><content type="html">&lt;p&gt;之前的一篇文章 &lt;a href="http://www.clarkrabbit.net/2010/02/memo-iis-manage-command-line-tools.html"&gt;命令列管理IIS&lt;/a&gt; 提到如何使用Command Line來管理IIS，更精確來講應該是『&lt;font color="#ff0000"&gt;命令列管理IIS6&lt;/font&gt;』。由於該指令只存在於IIS6，所以不管是IIS5 or IIS7 都無法透過該指令來進行管理。有鑑於此，特別另外寫一篇來記錄IIS7的命令列管理方式以求一個完整性。&lt;/p&gt;  &lt;p&gt;由於IIS7已改為統一使用 appcmd.exe 來管理IIS ，所以不再需要像IIS6一樣分成幾種Script來進行管理動作，省去不少麻煩。另外一個特殊的功能是將查輸出結果以XML格式回傳；這個功能搭配上 pipe 的功能，就可以上一個 appcmd 的輸出結果設定當成第二個 appcmd 的輸入來使用，增加指令使用上的變化性和彈性。舉個例子，如果要將目前正在停止中的”多個”網站重新啟動可以執行以下指令：&lt;/p&gt;  &lt;div style="width: 97.5%; height: 48px" id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 於目錄 %windir%\system32\inetsrv 下執行&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;appcmd list site /state:Stopped /xml | appcmd start site /in&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;其中2個指令以 『|(pipe)』連接，前半部使用 &amp;quot;/xml&amp;quot; 指定將目前正在停止中的網站以XML格式輸出，後半部加上 &amp;quot;/in&amp;quot; 表示將前半部XML輸出資料當成輸入，並將該輸入中所列的網站啟動。 
  &lt;br /&gt;反之，當然也可以將所有正在執行中的網站停止&lt;/p&gt;

&lt;div style="width: 97.5%; height: 37px" id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;appcmd list site /state:Started /xml | appcmd start site /in&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;pre class="brush: vb;"&gt;有了這樣彈性的使用方式，只要再熟悉使用的參數，就可以將部份設定工作批次來進行，節省不少時間。&lt;/pre&gt;

&lt;pre class="brush: vb;"&gt;以下列出幾種常用的指令當作參考：&lt;/pre&gt;

&lt;div style="width: 97.5%; height: 471px" id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 列出網站(SITE)支援的命令&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;appcmd site -?&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="rem"&gt;REM 列出所有網站 &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;appcmd list site&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 列出網站的List命令的參數及說明(其他功能的說明方式依此類推)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;appcmd list site -?&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="rem"&gt;REM 建立網站到8088 port下，並指定對應到d:\temp目錄下&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;appcmd add site /name:&lt;span class="str"&gt;&amp;quot;My Test Site&amp;quot;&lt;/span&gt; /id:99 /bindings:http://*:8088 /physicalPath:&lt;span class="str"&gt;&amp;quot;d:\temp\&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 列出所出電腦上所有虛擬目錄 &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;appcmd list vdir&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="rem"&gt;REM 列出指定網站下的所有虛擬目錄&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;appcmd list vdir &lt;span class="str"&gt;&amp;quot;預設網站/&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 建立虛擬目錄&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;appcmd add vdir /app.name:&lt;span class="str"&gt;&amp;quot;My Test Site/&amp;quot;&lt;/span&gt;  /path:/MyVdir /physicalPath:&lt;span class="str"&gt;&amp;quot;d:\temp\MyVdir&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="rem"&gt;REM 刪除虛擬目錄&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;appcmd delete vdir &lt;span class="str"&gt;&amp;quot;My Test Site/MyVdir&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 刪除網站&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;appcmd delete site /site.name:&lt;span class="str"&gt;&amp;quot;My Test Site&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;由於指令用法甚多，所以僅列出較常用的幾種當作範例，以便了解參數的給法的方式為何；更多詳細的內容以及進階的需求就需要再參考MSDN上的說明了。
  &lt;br /&gt;

  &lt;br /&gt;

  &lt;br /&gt;MSDN參考資源：&lt;a title="http://technet.microsoft.com/zh-tw/library/cc772200(WS.10).aspx" href="http://technet.microsoft.com/zh-tw/library/cc772200(WS.10).aspx"&gt;http://technet.microsoft.com/zh-tw/library/cc772200(WS.10).aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-1569926885079618973?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/1569926885079618973/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=1569926885079618973" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/1569926885079618973?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/1569926885079618973?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/02/memo-manage-iis7-from-command-line.html" title="[Memo] 以命令列工具 appcmd 管理 IIS7" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkEFRHwyfCp7ImA9WxBVEEU.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-6474006052655905572</id><published>2010-02-12T04:31:00.001-08:00</published><updated>2010-02-13T11:16:55.294-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-13T11:16:55.294-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="CSS" /><title>[Tips] 壓縮JavaScript檔案以加快網頁載入速度</title><content type="html">&lt;p&gt;隨著jQuery的使用率越來越普遍，網頁上許多UI上的功能大家都會透過jQuery plug-in來解決。在這個情況下，頁似乎都免不了會在網頁上include不少 .js &amp;amp; .css 檔案。而在考慮 performance issue 的情況下，網頁上引入的檔案應該是越小、越少越好，這樣不但能夠加快User載入頁面的速度，也能夠減少網站的流量及connection數量，尤其對流量大的網站來說，差距應該就更加明顯。&lt;/p&gt;  &lt;p&gt;大型網站如Google, Yahoo一定都會做的一件事情，就是盡可能的減少js &amp;amp; css檔案的size，以提供User最快的服務速度以及使用者體驗。雖然大概沒有多少人有機會經營這樣大型的網站，不過即使對一般中小型網站來說，頻寬仍然是重要的一項資源，而對User來講，速度慢的網站始終讓人無法忍受。&lt;/p&gt;  &lt;p&gt;對於js &amp;amp; css這樣的靜態檔案壓縮，還可以分出2種階段，分別為Gzip壓縮及檔案內容的壓縮(去除不必要的空白字元、註解或替換JavaScript變數名稱等)；Gzip需要Browser能夠支援Gzip解壓縮時才能夠使用這種壓縮檔案的方式，而檔案內容的壓縮的方式則不受Browser的限制，所以是必定可行的一種壓縮方式。&lt;/p&gt;  &lt;p&gt;而關於js檔的內容的壓縮工具，Google,Microsoft,Yahoo分別都有提供了對應的工具，以下列出這三種工具供大家參考，基本上三種工具都有一定的品質，至於哪個工具好用的話除了以&lt;a href="http://www.coderjournal.com/2010/01/yahoo-yui-compressor-vs-microsoft-ajax-minifier-vs-google-closure-compiler/"&gt;瘦身的比例來比較&lt;/a&gt;之外，也不外乎是青菜蘿蔔各有所好，不必爭論誰比誰好了。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://code.google.com/p/closure-compiler/" target="_blank"&gt;Closure Compiler&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;Google提供的工具，提供Comand-line及&lt;a href="http://closure-compiler.appspot.com/home"&gt;Online&lt;/a&gt;方式來進行分析、重寫(rewrite)、壓縮的動作(視使用的模式而定)，目前已廣泛應用在Google Maps, Google Docs等服務上。該工具使用Java開發，目前在Codeplex上已經有以一個Closure Compiler 為基礎使用.NET開發出來的非官方版本的&lt;a href="http://uicompiler.codeplex.com/" target="_blank"&gt;UI Compiler .NET&lt;/a&gt;，不過目前還在Beta階段。&lt;/li&gt;    &lt;li&gt;&lt;a href="http://aspnet.codeplex.com/releases/view/35893" target="_blank"&gt;Microsoft Ajax Minifier&lt;/a&gt;       &lt;br /&gt;Microsoft開發出來提供給Ajax Library使用的工具，提供Command-line式的使用介面，以及MSBuild task的方式將檔案壓縮的功能整合在Build動作上來達到流程自動化的功能。&lt;/li&gt;    &lt;li&gt;&lt;a href="http://developer.yahoo.com/yui/compressor/" target="_blank"&gt;YUI Compressor&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;使用提供針對css&amp;amp;js檔案壓縮的Command-line工具，也是使用Java進行開發的OpenSource Project；目前在Codeplex上也有非官方的.NET版 &lt;a href="http://yuicompressor.codeplex.com/" target="_blank"&gt;YUI Compressor for .Net&lt;/a&gt; 可以用，而且也支援MSBuild task功能。由於它多提供了一種針對css檔案壓縮的功能，所以對Clark來說可用性相對的較高一些。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;p&gt;以上三種工具大家都可以選擇自已喜好的來用，不過考慮針對css檔處理的部份來說的話，Clark會選擇使用YUI Compressor，使用統一的工具在管理上也較為方便。&lt;/p&gt;    &lt;p&gt;而當有了工具以後，該怎麼用又是另一個問題了！由於大家在開發時期如果直接include壓縮過的js檔案，容易造成控管及debug上的不便(Closure Compiler倒是可以搭配&lt;a href="http://code.google.com/intl/zh-TW/closure/compiler/docs/inspector.html"&gt;Closure Inspector&lt;/a&gt; + &lt;a href="http://getfirebug.com/ "&gt;FireBug&lt;/a&gt;來避開這個問題)，所以Clark自已也會選擇在Build時期來產出壓縮過的檔案，減少控管上的問題。&lt;/p&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-6474006052655905572?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/6474006052655905572/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=6474006052655905572" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/6474006052655905572?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/6474006052655905572?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/02/tips-compress-javascript-for-better.html" title="[Tips] 壓縮JavaScript檔案以加快網頁載入速度" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUcNRH45eip7ImA9WxBWGU0.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-6772064035521682</id><published>2010-02-10T21:41:00.001-08:00</published><updated>2010-02-11T07:44:55.022-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-11T07:44:55.022-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Code" /><title>[Code] 讀取及匯入Excel (XLS) 檔案</title><content type="html">&lt;p&gt; 前陣子遇到一個需求，需要一個功能是將資料庫中的資料轉入Excel檔中讓PM編輯，之後再從Excel轉回到資料庫中。在一般情況下通常會考慮使用.csv檔案來將資料匯入或匯出。不過由於資料庫的內容無法控制，資料中可能含和.csv的分隔方式有衝突的字元(如tab or 『,』)，且若存在.csv檔案中，若有多個table則需要產出多個.csv，對於使用及管理不易；在考慮使用的便利性之下，決定以標準的.xls檔案搭配活頁簿的方式來區分不同的資料表來當作資料轉換的媒介。&lt;/p&gt;  &lt;p&gt;原本認為這樣的功能應該有許多便利的Library可以使用，但是卻在不斷的 Try and Error 到也花了不少時間在不對的工具上頭。現在Clark回過頭來整理一下用過幾個工具下來自已的心得供大家參考。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Excel object model     &lt;br /&gt;直接使用Microsft Excel的COM元件來建立或讀取Excel的檔案。條件為需要先行安裝Excel才能夠使用這個COM 元件的功能。使用官方的元件的好處是相容性較高，不過由於在做匯入匯出的時候系統會先開啟一個Excel的Instance來做這些工具，所以相當耗系統資源，且資料一多的情況下轉檔的速度相當慢。由於Clark匯出的檔案格式較簡單，只有表格和活頁簿，所以其實並不需要使用到這種方式。&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.nika-soft.com/nativeexcelnet/" target="_blank"&gt;NativeExcel&lt;/a&gt;      &lt;br /&gt;需要付費購買的元件，由於在試用版的Library中都會強制在檔案中加上未註冊的訊息，所以對於測試來講相當不方便，不過轉檔的速度比使用Excel object model的方式快相當多。另一個缺點是在讀取檔案時偵測的有資料的Range(有用到的Column數)時有時會造成誤判，導致無法正確匯出所有的欄位(由於已經有一段時間了，所以不確定是我的用法錯誤還是它的功能確實有問題，不過在使用上的確有些不便)。&lt;/li&gt;    &lt;li&gt;&lt;a href="http://npoi.codeplex.com/" target="_blank"&gt;NPOI&lt;/a&gt;      &lt;br /&gt;話說『天下沒有白吃的午餐』，但實際的情況卻是OpenSource的Library解決了Clark的問題。NOPI原來是以Java實作的 Excel, doc, ppt 讀/寫檔案的Library後來被porting到.NET上。它的轉檔速度快，且在判斷使用的行、列上沒有誤判問題。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;NPOI是這次Clark推薦的針對讀/寫 Excel檔案工具，有句話說『程式碼就是最好的說明文件』，所以一定要po一下Clark的使用方法供大家參考，也可以節省下找Sample Code的時間。&lt;/p&gt;  &lt;div style="width:98%;height:100%" id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NPOIExcelHelper : ISpreadsheetHelper&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;     &lt;span class="preproc"&gt;#region&lt;/span&gt; ISpreadsheetHelper Members&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SaveDataSetToExcel(System.Data.DataSet dsSource, &lt;span class="kwrd"&gt;string&lt;/span&gt; filePath, CallBackEvent.UpdateProgressCallBack callBack)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         &lt;span class="rem"&gt;//建立一個工作簿&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         HSSFWorkbook workbook = &lt;span class="kwrd"&gt;new&lt;/span&gt; HSSFWorkbook();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         &lt;span class="rem"&gt;//為每table建立一個活頁簿WorkSheet&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; dsSource.Tables.Count; i++)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             &lt;span class="rem"&gt;//callback部份用來判斷目前讀到的table百分比，供顯示進度表之用&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (callBack != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 callBack((&lt;span class="kwrd"&gt;int&lt;/span&gt;)(((&lt;span class="kwrd"&gt;float&lt;/span&gt;)i / (&lt;span class="kwrd"&gt;float&lt;/span&gt;)dsSource.Tables.Count) * (&lt;span class="kwrd"&gt;float&lt;/span&gt;)100));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             System.Data.DataTable dt = dsSource.Tables[i];&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             &lt;span class="rem"&gt;//建立活頁簿&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             HSSFSheet sheet = workbook.CreateSheet(dt.TableName);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="rem"&gt;//為避免日期格式被Excel自動換掉，所以設定 format 為 『@』 表示一率當成text來看&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             HSSFCellStyle textStyle = workbook.CreateCellStyle();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             textStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat(&lt;span class="str"&gt;&amp;quot;@&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="rem"&gt;//用column name 當成標題列&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             List&amp;lt;String&amp;gt; columns = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; colIndex = 0; colIndex &amp;lt; dt.Columns.Count; colIndex++)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 &lt;span class="kwrd"&gt;string&lt;/span&gt; name = dt.Columns[colIndex].ColumnName;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 HSSFCell cell = sheet.CreateRow(0).CreateCell(colIndex);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 cell.SetCellValue(name);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 cell.CellStyle = textStyle;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 columns.Add(name);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             &lt;span class="rem"&gt;//建立資料列&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; row = 0; row &amp;lt; dt.Rows.Count; row++)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 DataRow dr = dt.Rows[row];&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; col = 0; col &amp;lt; columns.Count; col++)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                     &lt;span class="kwrd"&gt;string&lt;/span&gt; data = dr[columns[col]].ToString();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                     HSSFCell cell = sheet.CreateRow(row+1).CreateCell(col);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                     cell.SetCellValue(data);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                     cell.CellStyle = textStyle;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         &lt;span class="kwrd"&gt;if&lt;/span&gt; (callBack != &lt;span class="kwrd"&gt;null&lt;/span&gt;) callBack(100);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         &lt;span class="rem"&gt;//寫入檔案&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         FileStream file = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileStream(filePath, FileMode.OpenOrCreate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         workbook.Write(file);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         file.Close();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; System.Data.DataSet ReadExcelToDataSet(&lt;span class="kwrd"&gt;string&lt;/span&gt; filePath, CallBackEvent.UpdateProgressCallBack callBack)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         &lt;span class="rem"&gt;//開啟要讀取的Excel檔案&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         FileStream file = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileStream(filePath, FileMode.Open);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         &lt;span class="rem"&gt;//讀入Excel檔&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         HSSFWorkbook workbook = &lt;span class="kwrd"&gt;new&lt;/span&gt; HSSFWorkbook(file);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         file.Close();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         DataSet dsSource = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataSet();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         &lt;span class="rem"&gt;//為每個WorkSeeh建立出一個table&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; sheetIndex = 0; sheetIndex &amp;lt; workbook.NumberOfSheets; sheetIndex++)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             HSSFSheet sheet = workbook.GetSheetAt(sheetIndex);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             &lt;span class="rem"&gt;//建立一個新的table&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             DataTable dtNew = dsSource.Tables.Add(workbook.GetSheetName(sheetIndex));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             HSSFRow row = sheet.GetRow(0);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             &lt;span class="rem"&gt;//讀取第0列當作column name&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; columnIndex = 0; columnIndex &amp;lt; row.LastCellNum; columnIndex++)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 DataColumn dc = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataColumn(row.GetCell(columnIndex).ToString());&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 dtNew.Columns.Add(dc);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="kwrd"&gt;int&lt;/span&gt; rowId = 1;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             &lt;span class="rem"&gt;//第一列以後為資料，一直讀到最後一行&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="kwrd"&gt;while&lt;/span&gt; (rowId &amp;lt;= sheet.LastRowNum)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 DataRow newRow = dtNew.NewRow();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 &lt;span class="rem"&gt;//讀取所有column&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                 &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; colIndex = 0; colIndex &amp;lt; dtNew.Columns.Count; colIndex++)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;                     newRow[dtNew.Columns[colIndex]] = sheet.GetRow(rowId).GetCell(colIndex).ToString();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 dtNew.Rows.Add(newRow);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;                 rowId++;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;             &lt;span class="rem"&gt;//dsSource.Tables.Add(dtNew);&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; dsSource;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;     &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-6772064035521682?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/6772064035521682/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=6772064035521682" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/6772064035521682?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/6772064035521682?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/02/code-readwrite-xls.html" title="[Code] 讀取及匯入Excel (XLS) 檔案" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcGRng5eCp7ImA9WxBWF04.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-2346677592201795167</id><published>2010-02-08T09:43:00.001-08:00</published><updated>2010-02-09T09:53:47.620-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-09T09:53:47.620-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="HTML5" /><title>HTML5 on Google Chrome</title><content type="html">&lt;p&gt;&amp;#160; &lt;a href="http://lh4.ggpht.com/_nZrf1_vAjR0/S3BNNTWG-QI/AAAAAAAABcc/x8NClKD5lAA/s1600-h/google-chrome-logo%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="google-chrome-logo" border="0" alt="google-chrome-logo" src="http://lh6.ggpht.com/_nZrf1_vAjR0/S3BNPFLhzKI/AAAAAAAABcg/U5S0r8xoZsk/google-chrome-logo_thumb.jpg?imgmax=800" width="132" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;前陣子 Google 推出了新的 Google Chrome，也搶先將還在制定中的HTML5規格實作出來，顯示Google對於以發展Chrome來決定自已命運的決心。而根據先前 &lt;a href="http://latimesblogs.latimes.com/technology/2009/11/google-gears.html" target="_blank"&gt;報導&lt;/a&gt; 引述Google的說法，未來&lt;a href="http://gears.google.com/" target="_blank"&gt;Google Gear&lt;/a&gt; 將會被HTML5的規格所取代。言下之意即是Google Gear將不再是Google發展的主力，取而代之的是會在未來以HTML5的規格來取代 Google Gear的功能。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Clark 之前就因為工作而有接觸過Google Gear，在看過HTML5上的規格之後其實可以發現到不少Google Gear的影子。也由於Google Gear早已實際應用在Google Docs,Gmail等服務上，所以相對的在Google力推將Google Gear的功能加到HTML5的規格上時就更能以實際應用面來考量它的功能。&lt;/p&gt;  &lt;p&gt;以下是本次Chrome 4 Release出來的版本中部份的HTML5功能，Clark將它列出來並寫了一些簡單的範例，供大家做參考。&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Web SQL Database:      &lt;br /&gt;這在 Google Gear 上就有的一個本地資料庫功能，它提供了一個以 &lt;a href="http://www.sqlite.org/" target="_blank"&gt;SQLite&lt;/a&gt; 為核心的本地資料庫功能，如此一來在Client端也能夠擁有一個簡單的SQL資料庫供前端頁面資料存取之用。       &lt;br /&gt;範例： &lt;a href="http://clarkrabbit.myweb.hinet.net/chrome4example/webSqlDatabase.html" target="_blank"&gt;http://clarkrabbit.myweb.hinet.net/chrome4example/webSqlDatabase.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;LocalStorage:      &lt;br /&gt;      &lt;br /&gt;提供一個Name-Value式的資料儲存區供HTML &amp;amp; JavaScript使用，存放的資料會持續存在本地的一個資料庫檔案中，不會因為關掉Browser而消失，所以可以做為一個類似Cookie的儲存區之用。       &lt;br /&gt;      &lt;br /&gt;範例：&lt;a href="http://clarkrabbit.myweb.hinet.net/chrome4example/localStorageExample.html" target="_blank"&gt;http://clarkrabbit.myweb.hinet.net/chrome4example/localStorageExample.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;SessionStorage:      &lt;br /&gt;      &lt;br /&gt;顧名思義，功能上和LocalStorage相同，差別在於一旦關閉Browser之後資料即被刪除。這個功能在Chrome 4上是預設為關閉的，所以必需下指令來開啟該功能(設定語法請看範例說明)       &lt;br /&gt;      &lt;br /&gt;範例：&lt;a href="http://clarkrabbit.myweb.hinet.net/chrome4example/sessionStorageExample.html" target="_blank"&gt;http://clarkrabbit.myweb.hinet.net/chrome4example/sessionStorageExample.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Notification API:      &lt;br /&gt;這個功能很有意思；主要是提供HTML &amp;amp; JavaScrip 一個能夠在OS上出現通知訊息的功能，適合用來當網頁有需要通知User的事件時能夠跳出一個以文字或網頁呈現的訊息視。頗有將Google企圖逐步讓Web AP取代一般AP的意味。       &lt;br /&gt;範例：&lt;a href="http://clarkrabbit.myweb.hinet.net/chrome4example/notificationAPIExample.html" target="_blank"&gt;http://clarkrabbit.myweb.hinet.net/chrome4example/notificationAPIExample.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;WebSocket:      &lt;br /&gt;      &lt;br /&gt;提供 Socket 式的連線方式，持續的連線方式能夠加快存取資料的速度，這個需要Server端的配合，由於未看到有提供在Windows平台上實作該功能的說明文件，所以Clark並沒有做出範例。但是已有日本？網友使用 Google提供的 python 版本 Library架起來了。       &lt;br /&gt;範例：&lt;a title="http://bloga.jp/ws/jq/conn/wsdemo2.htm" href="http://bloga.jp/ws/jq/conn/wsdemo2.htm" target="_blank"&gt;http://bloga.jp/ws/jq/conn/wsdemo2.htm&lt;/a&gt;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;結論：    &lt;br /&gt;隨著HTML規格的持續發展，Web AP的功能性越來越強大，已經逐漸有取代一般AP的趨勢。未來RIA所需要的功能可能將不再需要透過外掛來實現，到時候Flash or Silverlight是否會被HTML 6 or HTML 7的規格給取代掉就是很令人值得留意的一件事情了！不過由IE6這樣的產品歷經數載撐到現在來看，相信要淘汰他們可能還需要一段相當的時間才有可能會發生。&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;參考資源：&lt;/p&gt;  &lt;p&gt;(W3C) HTML 5 differences from HTML 4: &lt;a title="http://www.w3.org/TR/html5-diff/" href="http://www.w3.org/TR/html5-diff/" target="_blank"&gt;http://www.w3.org/TR/html5-diff/&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;(Google) More Resources for Developers: &lt;a title="http://blog.chromium.org/2010/01/more-resources-for-developers.html" href="http://blog.chromium.org/2010/01/more-resources-for-developers.html" target="_blank"&gt;http://blog.chromium.org/2010/01/more-resources-for-developers.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-2346677592201795167?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/2346677592201795167/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=2346677592201795167" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/2346677592201795167?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/2346677592201795167?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/02/html5-on-google-chrome.html" title="HTML5 on Google Chrome" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_nZrf1_vAjR0/S3BNPFLhzKI/AAAAAAAABcg/U5S0r8xoZsk/s72-c/google-chrome-logo_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcBR3c7fyp7ImA9WxBWGUo.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-8013908435629238926</id><published>2010-02-07T21:54:00.001-08:00</published><updated>2010-02-12T04:34:16.907-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-12T04:34:16.907-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SqlServer" /><category scheme="http://www.blogger.com/atom/ns#" term="XML" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>[Tricks] 使用 SQLXMLBulkLoad 將 XML 檔案匯入 SQL Server</title><content type="html">&lt;p&gt;工作上遇到一個簡單的小需求，要將事先做好的XML檔案匯入資料庫。Clark 以往對於這種一次性的需求，仍舊會不怕麻煩的寫或者改一隻程式來做匯入的動作，不過其實這樣的方式很直覺卻似乎不合乎效率(每遇到一次不同Schema的xml就需要動code才能解決問題)。再設想一個情況，假設遇到不方便寫程式或著在沒有辦法進行compile的機器上，要做這些事情似乎就顯得很無力了！&lt;/p&gt;  &lt;p&gt;所幸SQL Server其實早就有提供一組XML載入資料時的元件來提供大家做類似性質的工具，只是我們不一定有用過而已。(此時只怪自已所學不夠多，如果早些知道有這樣的利器，Clark何必自已學原始人磨石頭當武器？！)&lt;/p&gt;  &lt;p&gt;SQLXMLBulkLoad 元件附在 SQLXML 4.0 中，而在Microsoft Support中被翻譯為 “XML大量載入元件”。乍看之下實在不容易瞭解它的功能為何，不過還是可以大概知道它做些什麼。而這套元件並沒有單獨的可轉散發(Redistributable)套件提供下載，而是可以在SQL Server安裝檔案中找到它。&lt;/p&gt;  &lt;p&gt;SQLXMLBulkLoad 在做XML檔案匯入的概念是利用自行建立的一個架構檔(XML)來提供來源XML對應到Database中的table Schema。只要我們建立好架構檔，即可呼叫元件來將來源XML匯入到指定的Database中。由於可以使用VBScript來呼叫該元件，所以幾乎不必寫程式；只要指定好檔案來源及ConnectionString即可進行轉換。&lt;/p&gt;  &lt;p&gt;文章最後附有Microsoft Support中的範例文章做參考，不過由於該Sample未使用到XML中的Attribute當作欄位，所以和Clark所需要的功能有所不同，所以提供一下自已的使用方式供參考及自已備忘之用。   &lt;br /&gt;     &lt;br /&gt;XML格式：Word.xml&lt;/p&gt;  &lt;div style="width: 97.25%; height: 142px" id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Data&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Row&lt;/span&gt; &lt;span class="attr"&gt;v1&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2010/01/01&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;v2&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;AAA&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Row&lt;/span&gt; &lt;span class="attr"&gt;v1&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2010/01/02&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;v2&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BBB&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Row&lt;/span&gt; &lt;span class="attr"&gt;v1&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2010/01/03&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;v2&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CCC&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Row&lt;/span&gt; &lt;span class="attr"&gt;v1&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2010/01/04&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;v2&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DDD&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Row&lt;/span&gt; &lt;span class="attr"&gt;v1&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2010/01/05&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;v2&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EEE&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Data&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Table Schema:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt; ANSI_NULLS &lt;span class="kwrd"&gt;ON&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt; QUOTED_IDENTIFIER &lt;span class="kwrd"&gt;ON&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[Words](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    [&lt;span class="kwrd"&gt;Date&lt;/span&gt;] [smalldatetime] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    [Word] [nvarchar](512) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt; &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; [PK_Words] &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt; &lt;span class="kwrd"&gt;CLUSTERED&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    [&lt;span class="kwrd"&gt;Date&lt;/span&gt;] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;)&lt;span class="kwrd"&gt;WITH&lt;/span&gt; (PAD_INDEX  = &lt;span class="kwrd"&gt;OFF&lt;/span&gt;, STATISTICS_NORECOMPUTE  = &lt;span class="kwrd"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span class="kwrd"&gt;OFF&lt;/span&gt;, ALLOW_ROW_LOCKS  = &lt;span class="kwrd"&gt;ON&lt;/span&gt;, ALLOW_PAGE_LOCKS  = &lt;span class="kwrd"&gt;ON&lt;/span&gt;) &lt;span class="kwrd"&gt;ON&lt;/span&gt; [&lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;) &lt;span class="kwrd"&gt;ON&lt;/span&gt; [&lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;架構檔：Mapping.xml&lt;/p&gt;

&lt;div style="width: 97.5%; height: 368px" id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Schema&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:xml-data&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        &lt;span class="attr"&gt;xmlns:dt&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:xml:datatypes&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        &lt;span class="attr"&gt;xmlns:sql&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:xml-sql&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;&amp;lt;!-- 範例中使用 ElementType，由於v1為屬性，所以改用 AttributeType --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;AttributeType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;v1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;dt:type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;datetime&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;AttributeType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;v2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;dt:type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ElementType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Data&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;sql:is-constant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;element&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Row&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ElementType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ElementType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Row&amp;quot;&lt;/span&gt;  &lt;span class="attr"&gt;sql:relation&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Words&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        &lt;span class="rem"&gt;&amp;lt;!-- 範例中使用 element ，這邊我們用 attribute --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;attribute&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;v1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;sql:field&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Date&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;attribute&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;v2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;sql:field&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Word&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ElementType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Schema&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;VBScript: Import.vbs&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objBL = CreateObject(&lt;span class="str"&gt;&amp;quot;SQLXMLBulkLoad.SQLXMLBulkLoad&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;objBL.ConnectionString = &lt;span class="str"&gt;&amp;quot;provider=SQLOLEDB.1;data source=MyDBNameOrIP;database=MyDB;uid=MyAccount;pwd=MyPassword&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;objBL.ErrorLogFile = &lt;span class="str"&gt;&amp;quot;d:\temp\error.log&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;objBL.Execute &lt;span class="str"&gt;&amp;quot;d:\temp\Mapping.xml&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;d:\temp\Word.xml&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objBL = Nothing&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;參考來源：&lt;a title="http://support.microsoft.com/kb/316005" href="http://support.microsoft.com/kb/316005"&gt;http://support.microsoft.com/kb/316005&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;SQLXML 於 SQL Server 2005 中安裝檔位置：\DEVELOPER\SQL Server x86\Tools\Setup\sqlxml4.msi&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-8013908435629238926?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/8013908435629238926/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=8013908435629238926" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8013908435629238926?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8013908435629238926?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/02/tricks-import-xml-file-to-sql-server-by.html" title="[Tricks] 使用 SQLXMLBulkLoad 將 XML 檔案匯入 SQL Server" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk4CR3w7fip7ImA9WhRTE0Q.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-724581262672105494</id><published>2010-02-02T22:54:00.001-08:00</published><updated>2011-11-04T01:22:46.206-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-04T01:22:46.206-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><title>[Memo] 命令列管理 IIS</title><content type="html">一直以來對於IIS的設定我都是使用 “網站管理員”來進行管理。以這種GUI方式來管理網站，對於小網站且Server數量不多的情況下倒還沒有什麼大問題。不過一但遇到多台Server要做設定上的修改時就顯得相當累贅且不可信賴(在設定步驟複雜的情況下難保不會漏掉什麼)。在這個情況下，勢必需要用上Batch Command Line的方式來管理你的Server，來完成你要做的設定。&lt;br /&gt;
以下是幾個常用的設定，在此做一個備註，提供大家也提供自已做參考。&lt;br /&gt;
&lt;div class="csharpcode-wrapper" id="codeSnippetWrapper" style="height: 491px; width: 98%;"&gt;&lt;div class="csharpcode" id="codeSnippet"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 切換到Script所在的目錄&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cd %systemroot%\system32&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 列出IIS下所有 WebSite&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cscript iisweb.vbs /query&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 刪除IIS下的某個 WebSite&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cscript iisweb.vbs /delete MyWebSite&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 列出WebSite下所有虛擬目錄&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cscript iisvdir /query “預設的網站”&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM or&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cscript iisvdir /query w3svc/1&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 建立虛擬目錄&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cscript iisvdir.vbs /create “預設的網站” MyVdir c:\inetpub\wwwroot\MyVdir&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM (2011/11/04 新增) 建立不在根目錄下的虛擬目錄，需在預設網站下指定路徑&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cscript iisvdir.vbs /create "預設的網站/Event/2011/" Evt1105 c:\inetpub\wwwroot\Event/2011/ Evt1105&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;cscript iisvdir.vbs /create w3svc/1 MyVdir c:\inetpub\wwwroot\MyVdir&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;REM 設定虛擬目錄的.NET版本為2.0 (於%systemroot%\Microsoft.NET\Framework\v2.0.50727\下執行)&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;aspnet_regiis -s w2svc/1/ROOT/MyVdir &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;MSDN上的說明：&lt;a href="http://technet.microsoft.com/zh-tw/library/cc739440(WS.10).aspx" title="http://technet.microsoft.com/zh-tw/library/cc739440(WS.10).aspx"&gt;http://technet.microsoft.com/zh-tw/library/cc739440(WS.10).aspx&lt;/a&gt;&lt;br /&gt;
※以上命令適用IIS6, 由於XP 是IIS5 所以未提供該命令。&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;&lt;span style="color: #0080ff;"&gt;-- 2010/2/25 新增&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;    &lt;br /&gt;
IIS7的使用方式請參考：&lt;a href="http://www.clarkrabbit.net/2010/02/memo-manage-iis7-from-command-line.html"&gt;以命令列工具 appcmd 管理 IIS7&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-724581262672105494?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/724581262672105494/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=724581262672105494" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/724581262672105494?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/724581262672105494?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2010/02/memo-iis-manage-command-line-tools.html" title="[Memo] 命令列管理 IIS" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUEESX49fCp7ImA9WxBQFk4.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-4725590688631512474</id><published>2009-12-03T02:04:00.000-08:00</published><updated>2010-01-16T01:20:08.064-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-16T01:20:08.064-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="Encoding" /><title>[Tricks] 用Javascript 在big5 網頁上 UrlEncode utf-8 格式字串</title><content type="html">由於公司的網站目前大多仍使用big5編碼，但是為了能夠在網站上的文章能夠提供 facebook, twitter 及plurk 等&lt;a href="http://en.wikipedia.org/wiki/Social_network_service" target="_blank" title="Social network service"&gt;SNS&lt;/a&gt;網站的文章發表功能，遇到需要在big5網頁下將title等訊息帶入網址列的功能。之前一直認為在big5網頁下，使用 encodeURI 會得以big5編碼的格式，所以如果必需互達到這項功能就得靠程式將big5的字串轉為utf-8。但是同事卻在big5網頁下正確將title編碼成功，經過測試，證實不論在big5 or utf-8 網頁下，同一串中文編碼出來的格式都相同!! 又學到一招！

&lt;pre name="code" class="javascript"&gt;
encodeURI('BIG5網頁上的中文字串');
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
註：同樣的情況，如果遇到big5網頁要帶encode過的字串出去時反而是另一個問題，這時只有靠Server Side的Code or 使用 javascript escape() 來達成。(部份語言對esacpe()轉過的格式似乎不支援，但clark未確認過，供大家參考)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-4725590688631512474?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/4725590688631512474/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=4725590688631512474" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4725590688631512474?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4725590688631512474?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/12/tricks-encode-big5-content-to-utf-8-by.html" title="[Tricks] 用Javascript 在big5 網頁上 UrlEncode utf-8 格式字串" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEcBQn86eip7ImA9WxNVGE8.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-1249605504042827212</id><published>2009-10-29T07:19:00.001-07:00</published><updated>2009-10-29T07:20:53.112-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T07:20:53.112-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>『無法在Web伺服器上啟動偵錯, 與Web伺服器通信時, 發生驗証錯誤』 的另一種可能性</title><content type="html">最近在Visual Studio好一陣子沒有直接進入 Debug Mode 來檢查做 Debug 工作，直到某項ASP.NET的程式有些問題，需要Debug看進一步的時候，按下F5, Compile 完之後卻給不給面子的出現了『無法在Web伺服器上啟動偵錯, 與Web伺服器通信時, 發生驗証錯誤』的訊息。&lt;br/&gt; &lt;br/&gt;
在遇到這個問題的當下clark心想，這訊息也不是沒見過，不過就是檢查一下IIS的虛擬目錄的Windows驗證設定，或是IIS重新啟動就可以解決的小問題，但幾經測試卻發現怎麼也解決不了這個問題，出動google大神得到的訊息也多半是提到相同的訊息(&lt;a href='http://support.microsoft.com/kb/306165/en-us'&gt;英文版的訊息在這裡&lt;/a&gt;)，這下好了！由於正在趕案子，花了半個小時還沒能找到問題的情況下，clark就沒再多花時間研究，先以苦力方式Response.Write可能的錯誤點先來將問題解決，以處理迫在眉睫的問題。&lt;br/&gt;&lt;br/&gt;
不過問題還是得處理，總不能老是靠Response.Write過日子吧？！(畢竟以前在asp時代已經苦夠了!!..)在幾經測試之下clark突然想到前陣子為了處理xp 上的IIS5 連結數過多造成無法使用的情況，而調了一些IIS設定，而其中有一項是Keep Alive的設定，或許兇手正是它。回到IIS上，將Keep Alive設定勾起來，重新啟動IIS ....DEBUG正常！！......原來真正的犯人就是Clark自已，但是不明確的錯誤訊息也實在讓Clark實在摸不著頭緒。&lt;br/&gt;&lt;br/&gt;
知道問題原因以後，再去搜尋Keep Alive + DEBUG 確實可以得到一些相關的&lt;a href='http://msdn.microsoft.com/en-us/library/aa290100(VS.71).aspx'&gt;訊息&lt;/a&gt;，雖然打了一場迷糊打仗，但是以後遇到這種問題時，除了那102招之外，Clark還是有多加一招以備不時之需，也希望給有遇到這個問題的朋友們提供另一種解決問題的可能性！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-1249605504042827212?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/1249605504042827212/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=1249605504042827212" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/1249605504042827212?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/1249605504042827212?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/10/unable-to-start-debugging-on-web-server.html" title="『無法在Web伺服器上啟動偵錯, 與Web伺服器通信時, 發生驗証錯誤』 的另一種可能性" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0YGQHsyeSp7ImA9WxJXGUg.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-5764714844883756441</id><published>2009-06-13T21:59:00.000-07:00</published><updated>2009-06-13T22:58:41.591-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-13T22:58:41.591-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vs2008" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>[Tricks] 修改 WCF ，吐出簡單格式的 JSON</title><content type="html">WCF是微軟近年來推行的解決Windows通訊架構，由於加上了對Ajax的支援，使得原來使用WebService的方式可以更方便的升級到WCF的加構來實現。&lt;br /&gt;&lt;br /&gt;
Clark 在近期將幾個使用 vs2008 開發的實作中，將原來使用 HttpHandler 吐出Json格式的方式改為使用 Ajax-Enabled WCF 的方式來開發。由於 vs2008 提供很簡單的 Add New Item的動作將支援JSON的 .svc 產生出來。而且還替我們將 web.config 裡的設定都設好了 (這種越簡單的方式也讓 Clark 越擔心以後寫程式像在工廠作業，只懂自已負責的部份，完全不瞭解其運作方式為何！)。不過自動化的結果，並不一定能夠符合大家的需求。&lt;br /&gt;&lt;br /&gt;
以預設的設定加上 [WebGet] 後，所吐出來的一個 string "Hello World!" 的 JSON 為例，以下為程式。
&lt;pre name="code" class="csharp"&gt;
 [WebGet]
 [OperationContract]
 public string DoWork()
 {
  // Add your operation implementation here
  return "Hello World!";
 }
&lt;/pre&gt;
吐出的json為 {"d":"Hello World!"} ，由於輸出的資料格式為 DataContractJsonSerializer 處理過輸出的格式，功能較為強大，但由於格式較為複雜，不若原來較單純的 JSON 格式容易處理，特別是對於複雜的 JSON 格式且更為明顯。 &lt;br /&gt;&lt;br /&gt;
所幸 WCF 提供了多樣化的設定，讓我們可以得到更單純未修飾的 JSON 格式，但需要自行修改 web.config &amp; .cs，以下為設定。 &lt;br /&gt;
web.config 中設定 : 
&lt;pre name="code" class="xml"&gt;
 &lt;behavior name="WawaCompAspNetAjaxBehavior"&gt;
      &lt;!-- &lt;enableWebScript /&gt; 拿掉,加上下面設定 --&gt;
      &lt;webHttp /&gt;
 &lt;/behavior&gt;
&lt;/pre&gt;
.cs 檔設定 : 
&lt;pre name="code" class="csharp"&gt;
    //WebGet 後面加上設定, 吐出格式為 Bare (未包裝格式) , Json format
 [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
 [OperationContract]
 public string DoWork()
 {
  // Add your operation implementation here
        return "Hello World!";
 }
&lt;/pre&gt;
輸出結果為 "Hello World!" ，結果即為單純的 JSON 格式，前端的作業就可以照原本的作法不需要再針對格式做修改！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-5764714844883756441?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/5764714844883756441/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=5764714844883756441" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/5764714844883756441?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/5764714844883756441?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/06/tricks-enable-wcf-to-response-pure-json.html" title="[Tricks] 修改 WCF ，吐出簡單格式的 JSON" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkQNQnY_eyp7ImA9WxJXEkw.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-8723895437100957145</id><published>2009-06-05T07:38:00.000-07:00</published><updated>2009-06-05T08:06:33.843-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-05T08:06:33.843-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>[Tricks] Bind Textbox to formated DateTime</title><content type="html">Clark 一直很少直接使用 FormView or GridView + SqlDataSource 的方式來製作 CRUD (Create, read, update and delete 就是我們常說的 "增、刪、修、查" ) 功能的網頁。不過在一次朋友問到相關的功能時，倒是讓 Clark 興趣挑戰問題、解決問題的樂趣。 &lt;br /&gt;&lt;br /&gt;
這次的問題其實也不難，主要是知不知道解決的方法。 問題出在 FormView 中要顯示出指定格式的出生日期，而不要顯示成 "1970/11/12 上午12:00:00" 這種精確到連自已也不確定的時間；由於使用到 Bind()， 所以也不能像 Eval() 一樣在外面套個 Method 做轉換就好。 &lt;br /&gt;
以下是案發現場..
&lt;pre name="code" class="html"&gt;
 &amp;lt;asp:TextBox ID="txtBirthday" runat="server" 
    Text='&amp;lt;%# Bind("Birthday") %&amp;gt;' /&amp;gt;
&lt;/pre&gt;
初步想到的解決方式有2種，第一種是直接在FormView的DataBound 完時將時間格式做修改。這種方式顯示有點麻煩且不直覺，且破壞了原來直接使用 Server Control 的用意。另一種方式顯然就簡單的多。 直接在 Bind 後面加 Format 字串，就如同 BoundField 的DataFormatString 用法一樣。

&lt;pre name="code" class="html"&gt;
      &amp;lt;asp:TextBox ID="txtBirthday" runat="server" 
         Text='&amp;lt;%# Bind("OnboardDay", "{0:yyyy/MM/dd}")  %&amp;gt;' /&amp;gt;

&amp;lt;!-- 再配合 CalendarExtender 相得益彰 --&amp;gt;
      &amp;lt;cc1:CalendarExtender ID="cldExBirthday" runat="server" 
          Enabled="True" TargetControlID="txtBirthday" Format="yyyy/MM/dd"&amp;gt;
        &amp;lt;/cc1:CalendarExtender&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-8723895437100957145?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/8723895437100957145/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=8723895437100957145" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8723895437100957145?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8723895437100957145?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/06/tricks-bind-textbox-to-formated.html" title="[Tricks] Bind Textbox to formated DateTime" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0QDR38zeyp7ImA9WxJRE0w.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-8043234988106506446</id><published>2009-05-14T09:26:00.000-07:00</published><updated>2009-05-14T09:42:56.183-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-14T09:42:56.183-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Command Line" /><title>[Tricks] 如何以命令列方式刪除指定的 IE 視窗</title><content type="html">不知道大家是否會有這種需求，不過 Clark 在設定網站的排程時有時會需要開啟固定的網址來達成工作，所以會遇到一個情況是在幾天以後在Server上開了一堆 IE 的 Instance，多到足讓系統開始運作不正常。&lt;br /&gt;&lt;br /&gt;
其實這樣的排程方式應該是從根本上的設計來避開這個問題；但由於有些排程工作已經行之有行，加上近期可能也找不到時間去改寫這樣的排程方式，那麼第一個想到的解決問題的方式可能就是如何定期將 Windows 裡的一些 IE Instance 給關掉。&lt;br /&gt;
其實Windows裡內建了一些功能，但是常常沒有被大家所廣為流傳(當然有可能大家都知道只有我不懂..?!)。&lt;br /&gt;
幸運的，taskkill 這個工具就能夠幫大家達成類似這種的需求，只要打上對應的Thread名稱，以及一些相關的條件設定，它就能夠替你找到符合條件的 Instance 並加以刪除。以 Clark 的需求來講，需要關閉的是 IE ，而且該 IE 的網址列正好有 "home page" 字樣，那麼就可以下&lt;br /&gt;&lt;br /&gt;
『 taskkill /FI "WINDOWTITLE eq home page*" /IM iexplore.exe 』
&lt;br /&gt;
其中 /FI 表示過濾功能&lt;br /&gt;
"WINDOWTITLE" 表示該視窗名稱&lt;br /&gt;
eq 表示當視窗名稱等於後面的pattern&lt;br /&gt;
/IM 表示刪除後面的程序名稱&lt;br /&gt;
(詳細功能請參考該命令的說明)&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
將這個命令包在.bat裡，加入排程。如此一來即可不費吹灰之力定時的將不要的Thread清除掉囉！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-8043234988106506446?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/8043234988106506446/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=8043234988106506446" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8043234988106506446?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8043234988106506446?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/05/tricks-kill-task-in-command-line.html" title="[Tricks] 如何以命令列方式刪除指定的 IE 視窗" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08EQX4_fCp7ImA9WxJREko.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-4319637678841901327</id><published>2009-05-13T21:24:00.000-07:00</published><updated>2009-05-13T21:36:40.044-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-13T21:36:40.044-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><title>[Tips] 在  utf-8 頁面 使用 big5 的 Javascript 檔</title><content type="html">之前在上線網站的時候， Clark 遇到在 utf-8 的網頁下要include big5 的 js 的問題，當時出現的問題是由於big5 的 js 檔中有中文字，include 到 utf-8 的 page 上時就造成 javascript error 或文字變成亂碼，當時趕著上線，所以就選擇將原來的 js 另存一份成為 utf-8 格式的 js 。就這樣使用了到現在將近一年，最近正在改這個 js 檔時發現為什麼不延用一份共用的 js ，而去另外自已建一份呢？一測試之下終於回想到當初的原因。由於在這陣子 Clark 也處理過類似問題，得到的結論是，在語法中下 charset="big5" 就可以讓 browser 不依照該 page 的 encoding 去做解譯，所以顯示的結果就正常了！&lt;/br&gt;&lt;/br&gt;
經過修改，顯示一切正常，其他Browser也沒有發現問題，上線！
&lt;pre name="code" pre="html"&gt;
&amp;lt;script type="text/javascript" src="../big5.js" charset="big5"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-4319637678841901327?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/4319637678841901327/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=4319637678841901327" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4319637678841901327?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4319637678841901327?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/05/tips-include-big5-javascript-in-utf-8.html" title="[Tips] 在  utf-8 頁面 使用 big5 的 Javascript 檔" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEQMQnY7eip7ImA9WxJSGEo.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-7062582242060942608</id><published>2009-05-09T01:26:00.000-07:00</published><updated>2009-05-09T06:39:43.802-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-09T06:39:43.802-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PowerShell" /><title>[Tips] 開始使用 PowerShell 刪除過期檔案</title><content type="html">知道 PowserShell 的便利性已經好一陣子了，不過一直沒空找出時間來將工作所需的排程改用 PowserShell 來達成，今天遇到一個普遍都會遇上的需求-刪除目錄中過期的文章時，Clark 決定來開始試用看看，以免成為嚴重落後時代潮流的科技文盲。 &lt;br /&gt;&lt;br /&gt;
花了一點時間Survey的結果，不幸直接找到類似需求的Example，讓 Clark 沒空發揮寫程式的才能，在Copy &amp; Paste 下完成了這樣工作！&lt;br /&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; 在PowerShell命令列下執行：Set-ExecutionPolicy RemoteSigned &lt;/li&gt;
&lt;li&gt;建立一個文字檔取名:del-expired.ps1&lt;/li&gt;
&lt;li&gt;在del-expired.ps1用貼入以下代碼
&lt;pre name="code" class="csharp"&gt;
$a = Get-ChildItem C:\temp
foreach($x in $a)
    {
        $y = ((Get-Date) - $x.CreationTime).Days
        if ($y -gt 7 -and $x.PsISContainer -ne $True)
            {$x.Delete()}
    }
&lt;/pre&gt; 其中 c:\temp 改為需要刪除的目錄路徑。
&lt;/li&gt;
&lt;li&gt;建立一個批次檔案取名:del-expired.bat&lt;/li&gt;
&lt;li&gt;貼上 PowerShell c:\manage\del-expired.ps1&lt;/li&gt;
&lt;li&gt;存檔，執行del-expired.bat 即可進行刪除工作。&lt;/li&gt;
&lt;/ul&gt;
難度不高，不過有幾點要注意的事項如下：
&lt;ul&gt;
&lt;li&gt;剛安裝好PowerShell的預設環境下，是無法在批次下執行PowserShell 的ps1檔，所以必需先執行 &lt;br /&gt;Set-ExecutionPolicy RemoteSigned &lt;/li&gt;
&lt;li&gt;批次檔中要執行ps1的指令時必需指定.ps1檔的完整路徑 Ex. PowerShell c:\manage\del-expired.ps1&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;br /&gt;
刪除工作順利完成！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-7062582242060942608?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/7062582242060942608/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=7062582242060942608" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7062582242060942608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/7062582242060942608?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/05/tips-tips-for-using-powershell.html" title="[Tips] 開始使用 PowerShell 刪除過期檔案" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEUDQXc4eCp7ImA9WxJSEUs.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-8101395099766259386</id><published>2009-05-01T01:12:00.000-07:00</published><updated>2009-05-01T01:24:30.930-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T01:24:30.930-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>[Tricks] 如何使用 Stored Procdure 呼叫 Stored Procdure</title><content type="html">Clark 很久沒抽空出來寫寫文章了，剛剛遇到一個需要，要在SP裡取得另一隻共用的SP中輸出的結果，
這件簡單的工作竟然因為放在腦海角落的最深處，沒有定時清理而慘遭蟲蛀。
&lt;br/&gt;&lt;br/&gt;
今天查完特此將這個方式再做個記錄，會比直接去查MSDN要來的快一些！&lt;br /&gt;&lt;br /&gt;
以下是範例，大家可以直接COPY下來修改即可。
&lt;pre name='code' class='sql'&gt;
-- #表示暫存的SP，正式使用時請將 '#' 去掉
CREATE PROCEDURE #TempResponsable
 @words nvarchar(16) , 
 @out nvarchar(32) OUTPUT
AS
BEGIN
 SET @out = 'You said:"'+ @words+'"'
END

GO

CREATE PROCEDURE #TempSay
 @words nvarchar(16)
AS
BEGIN
 DECLARE @result varchar(32)
 EXEC #TempResponsable @words, @result OUTPUT
 SELECT @result as 'output'
END

GO

EXEC #TempSay 'Hi'
--輸出結果為: You said:"Hi"
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-8101395099766259386?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/8101395099766259386/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=8101395099766259386" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8101395099766259386?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/8101395099766259386?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/05/tricks-using-stored-procdure-output.html" title="[Tricks] 如何使用 Stored Procdure 呼叫 Stored Procdure" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUNSH8ycSp7ImA9WxVQFks.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-4487032142942618936</id><published>2009-02-02T08:34:00.001-08:00</published><updated>2009-02-03T05:38:19.199-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-03T05:38:19.199-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SqlServer" /><category scheme="http://www.blogger.com/atom/ns#" term="DotNet" /><title>[Tricks] smalldatetime 還是 datetime ?</title><content type="html">今天公司的QA開了一bug，說表格裡列的文章排序和文章的時間並不一致，舉例如下
&lt;table style='border:solid 1px gray'&gt;
&lt;tr&gt;
 &lt;td width='200px' style='border:solid 1px gray'&gt;2009/1/2 12:30&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; aaaaaaaaaa &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red;border:solid 1px gray'&gt;2009/1/2 12:29&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; bbbbbbbbbb &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red;border:solid 1px gray'&gt;2009/1/2 12:28&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; cccccccccc &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red;border:solid 1px gray'&gt;2009/1/2 12:29&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; dddddddddd &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='border:solid 1px gray'&gt;2009/1/2 12:25&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; eeeeeeeeee &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;乍看之下 b 行 和 d 行中間夾了一行 d 行，時間差了一分鐘，並未照順序排列。但怪的是這個排列順序明明是從資料庫order by 出來的結果直接show在GridView上的，怎麼可能會有順序錯誤的問題呢？而且這個情況剛好都只差在一分鐘，不會有排錯的時間是相差超過1分鐘的，這就讓 Clark 起疑了..由於排序依照的時間和文章的資料、文章時間分屬不同資料庫中，該不會是兩邊時間不同發生錯誤了吧？！&lt;/p&gt;
&lt;p&gt;經過一番追查，發現在文章資料庫裡時間是像這樣的&lt;/p&gt;
&lt;table style='border:solid 1px gray'&gt;
&lt;tr&gt;
 &lt;td  width='200px' style='border:solid 1px gray'&gt;2009/1/2 12:30:12.145&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; aaaaaaaaaa &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red' style='border:solid 1px gray'&gt;2009/1/2 12:29:23.121&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; bbbbbbbbbb &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red' style='border:solid 1px gray'&gt;2009/1/2 12:28:36.420&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; cccccccccc &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red' style='border:solid 1px gray'&gt;2009/1/2 12:29:22.731&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; dddddddddd &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='border:solid 1px gray'&gt;2009/1/2 12:25:04.222&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; eeeeeeeeee &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
而排序的資料表裡的內容卻是
&lt;table style='border:solid 1px gray'&gt;
&lt;tr&gt;
 &lt;td  width='200px' style='border:solid 1px gray'&gt;2009/1/2 12:30:00&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; aaaaaaaaaa &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red' style='border:solid 1px gray'&gt;2009/1/2 12:29:00&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; bbbbbbbbbb &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red' style='border:solid 1px gray'&gt;2009/1/2 12:29:00&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; cccccccccc &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='color:red' style='border:solid 1px gray'&gt;2009/1/2 12:29:00&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; dddddddddd &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style='border:solid 1px gray'&gt;2009/1/2 12:25:00&lt;/td&gt;&lt;td style='border:solid 1px gray'&gt; eeeeeeeeee &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;看來，排序的結果是照排序資料庫裡的時間沒錯，但是排序資料庫裡的時間似乎進位了，而Show出來的結果應該是從文章資料庫裡來的，所以時間看來是被直接截掉秒數，導致兩邊對不起來。不過這樣也能夠解釋為什麼資料會只差一秒了。&lt;/p&gt;
&lt;p&gt;仔細查了一下，原來因為排序資料庫裡的時間是以 smalldatetime 方式來儲存的，但是文章資料庫裡的時間卻是 datetime 格式，所以這中間必定是從 datetime 轉到 smalldatetime 時有做了一些進位的處理。上&lt;a href='http://msdn.microsoft.com/en-us/library/aa258277(SQL.80).aspx' target='_blank'&gt;MSDN&lt;/a&gt; 查了一下，看到下面這個範例&lt;/p&gt;
&lt;pre name='code' class='sql'&gt;
--returns time as 12:35
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
GO
--returns time as 12:36
SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime)
GO
&lt;/pre&gt;
原來，只要秒數大於 29.999 以上的datetime 格式，轉成smalldatetime以後會自動進位(因為smalldatetime記錄只到分鐘)，加1分鐘。所以原來的12:28:36.420就變成 12:29:00，這樣一來問題就好解了，只要在Show到GridView上時，把原本的DateTime.ToString("yyyy/MM/dd HH:mm") 的Code，修改一下即可。

&lt;pre name='code' class='csharp'&gt;
        public static String ToDateTimeString(DateTime dtime)
        {
            if ((dtime.Second &gt; 29) || (dtime.Second == 29 &amp;&amp; dtime.Millisecond == 999))
            {
                dtime = new DateTime(dtime.Year, dtime.Month, dtime.Day, dtime.Hour, dtime.Minute, 0);
                dtime = dtime.AddMinutes(1);
            }
            return dtime.ToString("yyyy/MM/dd HH:mm");
        }
&lt;/pre&gt;

&lt;p&gt;
結論：&lt;br /&gt;
像這樣的問題，一開始在選擇使用smalldatetime時並沒有想到，只單純的認為以smalldatetime的方式可以節省一些資料庫存放的空間以及存取的速度(可能需要上萬筆以上的資料同時取出才能感覺到它的差別)。smalldatetime有它節省空間的好處，但也有時間上的限制(只能記錄到2079/6/6)。雖然對我們來講遙不可及，但是誰又能保證到時會不會像千禧年一樣會是未來SQL Server的夢靨呢？！還是謹慎用之為上！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-4487032142942618936?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/4487032142942618936/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=4487032142942618936" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4487032142942618936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/4487032142942618936?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/02/tricks-smalldatetime-and-datetime.html" title="[Tricks] smalldatetime 還是 datetime ?" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DE4CSH8-fip7ImA9WxVQFEQ.&quot;"><id>tag:blogger.com,1999:blog-9257728.post-3053381842816677620</id><published>2009-02-01T05:33:00.000-08:00</published><updated>2009-02-01T06:02:49.156-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-01T06:02:49.156-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DotNet20" /><title>[Course] 如何使用 Attribute</title><content type="html">自從出了學校以後，一直以來 Clark 學習東西的方式已經鮮少是看完一本完整的書籍。除了沒有時間是一直是一個藉口之外，要學的東西也真的太多了，多到沒辦法好好的空出時間把一樣東西學習到透徹；這也是 Clark 一直比較遺憾的一點。而這樣的的結果常常會讓自已遺漏掉一些基本但卻很好用的技巧或方法，只能從其他人的Code中去發現或學習到。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
以上說了這些，其實就是要提到 Attribute ，這個東西。它是一個在.Net中常常會用到的一個『預先定義屬性』的方式，特別像是 UnitTest ，常常會用到類似[TestClass]、[TestMethod] 的宣告，來提供 UnitTest 程式解析組件中哪些Class or Method 是拿來做UnitTest的，而這個東西正是 Clark 提到"好用的技巧或方法"，但是之前卻一直沒時間搞懂它。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
話不多說，以下直接看Sample !&lt;br /&gt;
&lt;pre name="code" class="csharp"&gt;
   public enum Shape
    {
        Circle,
        Rectangle
    }

    //決定屬性可以被使用在Class及Struct上
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
    public class ShapeAttribute : Attribute
    {
        private Shape _shapeType;
        private String _rgb;
        public int BolderWidth; //設為 Public ,可直接在屬性列指定該屬性
        public ShapeAttribute(Shape shape, String rgb)
        {
            _shapeType = shape;
            _rgb = rgb;
        }

        public Shape Shape
        {
            get { return _shapeType; }
        }
    }

    //前2個參數為ShapeAttribute建構式的參數，之後可以自行增加對內部屬性的設定
    [ShapeAttribute(Shape.Circle, "#ffffff", BolderWidth = 1)]
    public class Block1
    {
        public Block1()
        {
        }
    }

    [ShapeAttribute(Shape.Rectangle, "#fcfcfc", BolderWidth = 2)]
    public class Block2
    {
        public Block2()
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //解析兩個Class中的Attribute
            PrintInfo(typeof(Block1));
            PrintInfo(typeof(Block2));
        }

        static void PrintInfo(Type type)
        {
            //取得這個type下所有的Attribute
            Attribute[] attrs = Attribute.GetCustomAttributes(type);
            foreach (Attribute attr in attrs)
            {
                if (attr is ShapeAttribute)
                {
                    ShapeAttribute attribute = (ShapeAttribute)attr;
                    Debug.WriteLine("Shape=" + attribute.Shape.ToString() + ", BorderWidth=" + attribute.BolderWidth);
                }
            }
        }
    }

//輸出結果如下：
//Shape=Circle, BorderWidth=1
//Shape=Rectangle, BorderWidth=2
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;
以上為參考MSDN上的Sample做修改而來。看過例子以後我們可以知道，利用『預先定義屬性』(請注意"預先定義4個字，表示我們在編譯時間就需要先決定它屬性值，它甚至只能是一個常數，而不能是一個執行時期才決定的變數)來幫助我們對類別或其他物作做基本的定義，而在執行時期才去解析它的定義，或取出定義的值。這樣對於設計上來講會多了一些彈性；我們也可以選擇繼承來達成相同的功能，但在某些情況下，繼承也許不一定是方便的作法，這時就可以考慮是否以屬性的方式來實作了。&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;
需要更多的資訊，可以參考：&lt;a href='http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx' target='_blank'&gt;Attributes Tutorial&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9257728-3053381842816677620?l=www.clarkrabbit.net' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.clarkrabbit.net/feeds/3053381842816677620/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9257728&amp;postID=3053381842816677620" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/3053381842816677620?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9257728/posts/default/3053381842816677620?v=2" /><link rel="alternate" type="text/html" href="http://www.clarkrabbit.net/2009/02/course-using-attribute.html" title="[Course] 如何使用 Attribute" /><author><name>Clark Rabbit</name><uri>http://www.blogger.com/profile/13392076754459375853</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry></feed>

