<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>.NET(ASP.NET-進階篇)</title><link>http://blog.blueshop.com.tw/topcat/category/715.aspx</link><description>ASP.NET(進階)開發技術文章分享</description><managingEditor>topcat</managingEditor><dc:language>zh-TW</dc:language><generator>.Text Version 0.95.2004.101</generator><item><dc:creator>topcat</dc:creator><title>jQuery在VS2008 SP1中文版中可以使用Intellisense了 </title><link>http://blog.blueshop.com.tw/topcat/archive/2008/08/21/56719.aspx</link><pubDate>Thu, 21 Aug 2008 15:53:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/08/21/56719.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/56719.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/08/21/56719.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/56719.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/56719.aspx</trackback:ping><description>&lt;p&gt;上次提到jQuery開始勾引小喵後，在開發過程中，總覺得少了些什麼。沒錯，在被VS的Intellisense寵壞後的小喵，沒有這個實在有點痛苦。之前網友有篇&lt;a href="http://www.dotblogs.com.tw/kiwi/archive/2008/06/01/4194.aspx"&gt;在VS 2008 使用JQuery 自動提示( Intellisense) &lt;/a&gt;提到不過在中文的VS2008還是無法使用。不過自從更新了SP1後，這一切問題改善了。&lt;/p&gt;&lt;p&gt;使用有幾個必要的條件：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;VS2008 SP1:有需要的人可以到&lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&amp;amp;FamilyID=fbee1648-7106-44a7-9649-6d9f6d58056e"&gt;這裡&lt;/a&gt;下載&lt;/li&gt;&lt;li&gt;jQuery程式庫：當然去&lt;a target="_blank" href="http://docs.jquery.com/Downloading_jQuery"&gt;官方網頁&lt;/a&gt;下載最新的囉&lt;/li&gt;&lt;li&gt;&lt;a title="jQuery" target="_blank" rel="" href="http://www.dotblogs.com.tw/topcat/archive/2008/07/25/4711.aspx"&gt;jQuery&lt;/a&gt; Intellisense擋：&lt;a title="Intellisense" target="_blank" href="http://weblogs.asp.net/blogs/bradvincent/JQuery.Intellisense.zip"&gt;Intellisense&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;以上的條件必須是同時具備才能使用唷。&lt;/p&gt;&lt;p&gt;使用方式：&lt;/p&gt;&lt;p&gt;首先要把jQuery與jQuery Intellisense放到你的畫面中引用&lt;/p&gt;&lt;pre class="csharpcode"&gt;
    &amp;lt;script src=&lt;span class="str"&gt;&amp;quot;js/jquery.js&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&lt;span class="str"&gt;&amp;quot;js/JQuery.Intellisense.js&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;/p&gt;&lt;p&gt;接著，就能夠看到囉&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.dotblogs.com.tw/topcat/0808/jQueryVS2008SP1Intellisense_DD1D/jq01_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="275" alt="jq01" width="656" border="0" src="http://files.dotblogs.com.tw/topcat/0808/jQueryVS2008SP1Intellisense_DD1D/jq01_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;享受吧!!&lt;/p&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/56719.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>jQuery透過ajax取得yahoo新聞Rss範例</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/08/08/56540.aspx</link><pubDate>Fri, 08 Aug 2008 13:39:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/08/08/56540.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/56540.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/08/08/56540.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/56540.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/56540.aspx</trackback:ping><description>&lt;p&gt;這個範例是使用jQuery 的.ajax，從Yahoo新聞的Rss擷取後，產生超連結在自己的網頁中。測試的時候只需要一個html與jQuery.js即可。&lt;/p&gt; 
&lt;pre class="csharpcode"&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;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;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;META&lt;/span&gt; &lt;span class="attr"&gt;NAME&lt;/span&gt;&lt;span class="kwrd"&gt;="GENERATOR"&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Microsoft Visual Studio 6.0"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&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;Language&lt;/span&gt;&lt;span class="kwrd"&gt;="JavaScript"&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;="jQuery.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;
&amp;lt;Script Language=&lt;span class="str"&gt;"JavaScript"&lt;/span&gt;&amp;gt;
&amp;lt;!--
$(document).ready(&lt;span class="kwrd"&gt;function&lt;/span&gt;(){
    $(&lt;span class="str"&gt;'#button1'&lt;/span&gt;).click(&lt;span class="kwrd"&gt;function&lt;/span&gt;(){
        &lt;span class="kwrd"&gt;var&lt;/span&gt; strURL=&lt;span class="str"&gt;'http://tw.news.yahoo.com/rss/tech_3c'&lt;/span&gt;;
        $.ajax({
            type:&lt;span class="str"&gt;'GET'&lt;/span&gt;,
            dataType:&lt;span class="str"&gt;'xml'&lt;/span&gt;,
            url:strURL,
            success:&lt;span class="kwrd"&gt;function&lt;/span&gt;(xml){
                &lt;span class="kwrd"&gt;var&lt;/span&gt; myTitle;
                &lt;span class="kwrd"&gt;var&lt;/span&gt; myLink;
                $(&lt;span class="str"&gt;'item'&lt;/span&gt;,xml).each(&lt;span class="kwrd"&gt;function&lt;/span&gt;(e){
                    myTitle=$(&lt;span class="str"&gt;'title'&lt;/span&gt;,&lt;span class="kwrd"&gt;this&lt;/span&gt;).text();
                    myLink=$(&lt;span class="str"&gt;'link'&lt;/span&gt;,&lt;span class="kwrd"&gt;this&lt;/span&gt;).text();
                    $(&lt;span class="str"&gt;'&amp;lt;a/&amp;gt;'&lt;/span&gt;).attr(&lt;span class="str"&gt;'href'&lt;/span&gt;,myLink).attr(&lt;span class="str"&gt;'target'&lt;/span&gt;,&lt;span class="str"&gt;'_blank'&lt;/span&gt;).text(myTitle).appendTo($(&lt;span class="str"&gt;'#div1'&lt;/span&gt;));
                    $(&lt;span class="str"&gt;'&amp;lt;br/&amp;gt;'&lt;/span&gt;).appendTo($(&lt;span class="str"&gt;'#div1'&lt;/span&gt;));
                });
                alert($(&lt;span class="str"&gt;'#div1'&lt;/span&gt;).html());
            }
        })
    })
})

&lt;span class="rem"&gt;//--&amp;gt;&lt;/span&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;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;&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;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;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt; &lt;span class="attr"&gt;onbeforeunload&lt;/span&gt;&lt;span class="kwrd"&gt;="RunOnBeforeUnload()"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&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;action&lt;/span&gt;&lt;span class="kwrd"&gt;=""&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;=&lt;span class="attr"&gt;POST&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;=&lt;span class="attr"&gt;form1&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;=&lt;span class="attr"&gt;form1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;INPUT&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="button"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Button"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;=&lt;span class="attr"&gt;button1&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;=&lt;span class="attr"&gt;button1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&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;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;="div1"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;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;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;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;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/56540.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>轉貼_JavaScript的UrlEncode,UrlDecode</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/07/25/56244.aspx</link><pubDate>Fri, 25 Jul 2008 11:16:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/07/25/56244.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/56244.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/07/25/56244.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/56244.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/56244.aspx</trackback:ping><description>&lt;p&gt;來源：&lt;a title="http://www.wujianrong.com/archives/2006/11/javascripturlencodeurldecode.html" href="http://www.wujianrong.com/archives/2006/11/javascripturlencodeurldecode.html" target="_blank"&gt;http://www.wujianrong.com/archives/2006/11/javascripturlencodeurldecode.html&lt;/a&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:99fca18c-9b93-49f2-b448-eb8564988c06" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js"&gt;&amp;lt;script language="javascript"&amp;gt;
//可參考資料 http://www.wujianrong.com/archives/2006/11/javascripturlencodeurldecode.html
/*這裡開始 UrlEncode、UrlDecode 函數*/ 
function UrlEncode(str){ 
  var ret=""; 
  var strSpecial="!\"#$%&amp;amp;'()*+,/:;&amp;lt;=&amp;gt;?[]^`{|}~%"; 
  var tt= "";

  for(var i=0;i&amp;lt;str.length;i++){ 
   var chr = str.charAt(i); 
    var c=str2asc(chr); 
    tt += chr+":"+c+"n"; 
    if(parseInt("0x"+c) &amp;gt; 0x7f){ 
      ret+="%"+c.slice(0,2)+"%"+c.slice(-2); 
    }else{ 
      if(chr==" ") 
        ret+="+"; 
      else if(strSpecial.indexOf(chr)!=-1) 
        ret+="%"+c.toString(16); 
      else 
        ret+=chr; 
    } 
  } 
  return ret; 
} 

function UrlDecode(str){ 
  var ret=""; 
  for(var i=0;i&amp;lt;str.length;i++){ 
   var chr = str.charAt(i); 
    if(chr == "+"){ 
      ret+=" "; 
    }else if(chr=="%"){ 
     var asc = str.substring(i+1,i+3); 
     if(parseInt("0x"+asc)&amp;gt;0x7f){ 
      ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6))); 
      i+=5; 
     }else{ 
      ret+=asc2str(parseInt("0x"+asc)); 
      i+=2; 
     } 
    }else{ 
      ret+= chr; 
    } 
  } 
  return ret; 
}
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/56244.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>jQuery初體驗</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/07/25/56242.aspx</link><pubDate>Fri, 25 Jul 2008 10:16:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/07/25/56242.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/56242.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/07/25/56242.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/56242.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/56242.aspx</trackback:ping><description>&lt;h1&gt;緣起&lt;/h1&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 小喵經常會在各個技術blog中閒逛，有次逛到&lt;a href="http://blog.darkthread.net/" target="_blank"&gt;黑暗執行緒&lt;/a&gt;大大的網站，看到了一篇【&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/05/15/2399.aspx#3049" target="_blank"&gt;jQuery, I LOVE YOU~~~&lt;/a&gt;】文章，文章中說了他發給【ASP.NET AJAX Client Library】好人卡，並且移情別戀轉而跟【jQuery】在一起的經過。讓小喵留下了深刻的印象。不過，這時小喵還是不曉得jQuery是什麼。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 後來有次小喵剛好要買幾本書，在逛【&lt;a href="http://tlsj.tenlong.com.tw/WebModule/index.do" target="_blank"&gt;書店&lt;/a&gt;】的時候的時候(小喵目前已經很少跑真正的書店，逛得只是書店的網站)，還差一點就可免運費，所以順便找找看是否有什麼新書可以買。剛好看到jQuery有本新的中文書出版。於是小喵就把它放入購物車。從此開始與jQuery結緣。本來買了書後，打算先翻翻看看這個東西到底是什麼，能讓黑暗執行緒大大隊ASP.NET AJAX&amp;nbsp; Client Library發出好人卡。沒想到這個迷死人不償命的小寶貝，竟然開始勾引小喵。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h1&gt;jQuery是什麼??&lt;/h1&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jQuery是一組JavaScript的library，而且是免費的library。使用的時候也只需要指定&amp;lt;Script src="jQuery.js"&amp;gt;&amp;lt;/Script&amp;gt;就可以開始引用了。因此無論是用什麼樣的網頁開發程式(ASP,ASP.NET,JSP,PHP,CGI,....)，甚至只需要HTML就可以使用。因此要測試jQuery，甚至不必上網，只需要記事本撰寫html就可以測試使用了。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h1&gt;下載&lt;/h1&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 先說明要準備使用jQuery之前，需要些什麼：&lt;/p&gt; &lt;p&gt;首先需要把jQuery帶回家。有個繁體中文的網址【&lt;a href="http://www.jquery.com.tw/" target="_blank"&gt;jQuery: 寫得少, 做得多, JavaScript 程式庫&lt;/a&gt;】不過也僅止於這麼少少的幾頁，可以把最新版本的jQuery下載回來。下載的部分他分為三種：&lt;/p&gt; &lt;ol&gt; &lt;li&gt;GZip的版本(Minified)：js經過GZip壓縮過，檔案最小，適合放在正式環境中，1.26版大約16kb  &lt;li&gt;未壓縮版本(Uncompressed)：適用於測試開發學習。1.26版大約97kb  &lt;li&gt;包裝版(Packed)：給沒有辦法解GZip瀏覽器用的版本1.26版大約30kb &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;其實就算是使用Uncompressed的版本，大小也只有97kb，檔案非常的小(可能網頁中隨便一張圖就比這個大了)。而小喵自己則是取中庸的Packed版本使用。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h1&gt;測試&lt;/h1&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 接下來開始重頭戲，我們初體驗的實際運作範例。也開始體驗一下為何這個小東西會勾引小喵的原因。首先來個範例，小喵產生一個html檔案在畫面上安排了個兩個按鈕(&amp;lt;input type="button")以及一個img並且指向一個jpg。&lt;/p&gt; &lt;p&gt;現在假設要設定，一開始要把img1圖形隱藏，按下按鈕後，希望可以把他顯示出來，再按一次按鈕，又可以把他隱藏。這個對於已經熟悉JavaScript的人，應該不難。小喵寫個簡單的&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:58cef534-c99a-4cd3-9125-c215f2a54f91" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;

&amp;lt;script Language="JavaScript"&amp;gt;
&amp;lt;!--

function window_onload(){
	var img1=window.document.getElementById('img1');
	img1.style.display='none';
}

function btn1_click(){
	var img1=window.document.getElementById('img1');
	if(img1.style.display=='none')
	{
		img1.style.display='';
	}
	else
	{
		img1.style.display='none';
	}
}

//--&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body onload="window_onload()"&amp;gt;
	&amp;lt;input type="button" id="btn1" name="btn1" value="JavaScript按鈕" onclick="btn1_click()" /&amp;gt;
	&amp;lt;br /&amp;gt;
	&amp;lt;img id="img1" src="topcat.jpg" /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;而以上的動作，如果希望由jQuery來處理的話，那又如何呢&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0fc35322-afa3-4ab4-ae21-22e1c38532e0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;Script Language="JavaScript" src="jQuery.js"&amp;gt;&amp;lt;/Script&amp;gt;
&amp;lt;script Language="JavaScript"&amp;gt;
&amp;lt;!--
$(document).ready(function(){
	$('#img1').hide();
	$('#btn2').click(function(){
		$('#img1').toggle();
	})
})

//--&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;input type="button" id="btn2" name="btn2" value="jQuery按鈕" /&amp;gt;
	&amp;lt;br /&amp;gt;
	&amp;lt;img id="img1" src="topcat.jpg" /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;一樣的動作，發現了嗎??程式碼精簡到不行。真是太神奇了!!&lt;/p&gt;
&lt;p&gt;再來另外一個範例&lt;/p&gt;
&lt;p&gt;假設我的畫面中有一個&amp;lt;table&amp;gt;希望，&amp;lt;table&amp;gt;裡面的資料在顯示的時候，可以用不同底色交錯顯示，這樣方便在瀏覽的時候可以方便看。我們用固定的&amp;lt;table&amp;gt;當作示範，我們希望讓偶數行能夠加上class，這樣的要用Javascript有多麻煩各位可以想像一下。但是在jQuery來說確是很簡單的&lt;/p&gt;
&lt;p&gt;我們有Style設定&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:849e49d6-3c8f-4d25-a90c-d3e8386adf60" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="css"&gt;&amp;lt;style&amp;gt;
.TrEven1{background-color:pink;}
.TrEven2{background-color:blue;color:white;}
&amp;lt;/style&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在畫面中有兩個Table小喵用asp的方式表式：&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:74e2bd9c-e4c0-4dd9-8781-06d51961ffc7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;table1
&amp;lt;table id="tbl1" border="1"&amp;gt;
&amp;lt;%For y = 1 to 10%&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;td&amp;gt;&amp;lt;%=y%&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;aa&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;bb&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;cc&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;dd&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;ee&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;ff&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
&amp;lt;%Next%&amp;gt;
&amp;lt;/table&amp;gt;
table2
&amp;lt;table id="tbl2" border="1"&amp;gt;
&amp;lt;%For y2 = 1 to 10%&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;td&amp;gt;&amp;lt;%=y2%&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;aa&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;bb&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;cc&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;dd&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;ee&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;ff&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
&amp;lt;%Next%&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;接著，先想像一下如果要用JavaScript要怎麼寫??然後再來看看用jQuery怎麼做&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b393fc33-53ab-45a2-b6dc-6097e5f776de" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js"&gt;$(document).ready(function(){
	$('#tbl1 tr:even').addClass('TrEven1');
	$('#tbl2 tr:even').addClass('TrEven2');
})&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;看到了他的魔力了嗎??短短的一行【$('#tbl1 tr:even').addClass('TrEven1');】就可以處理了耶!!有沒有那種被【黯然消魂掌】擊中的感覺。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;初體驗就到此先告一段落，有機會在跟網友們分享jQuery的語法與使用方式。在此先介紹個不錯的網站，可以把他當作是jQuery使用時的一個操作說明【&lt;a title="http://jquery.org.cn/visual/cn/index.xml" href="http://jquery.org.cn/visual/cn/index.xml"&gt;http://jquery.org.cn/visual/cn/index.xml&lt;/a&gt;】&lt;/p&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/56242.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>Dispose測試：Dispose時是否立即釋放記憶體</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/07/07/55796.aspx</link><pubDate>Mon, 07 Jul 2008 08:45:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/07/07/55796.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/55796.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/07/07/55796.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/55796.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/55796.aspx</trackback:ping><description>&lt;h1&gt;緣起：&lt;/h1&gt;&lt;p&gt;小喵寫這篇是源自於小喵上一篇文章【&lt;a href="http://www.dotblogs.com.tw/topcat/archive/2008/07/03/4427.aspx"&gt;物件Object的New,Dispose與Connection的Open,Close概念分享&lt;/a&gt;】，小喵最後描述【&lt;strong&gt;當物件Dispose的時候，並沒有把該段記憶體清空，只是標註，這段空間不再使用&lt;/strong&gt;，直到GC啟動把他清空才算真正的清空。】。但是小喵看一些網路文章時，有些卻提到當呼叫Dispose的時候，記憶體立即釋放。因此小喵就做這個測試來看看到底是怎麼回事。&lt;/p&gt;&lt;p&gt;測試計畫：&lt;/p&gt;&lt;p&gt;於是小喵寫了個小小的Console程式，然後裡面使用一個小類別，該類別在New的時候，讀取一個很大的文字檔，並且把文字檔的內容放到一個變數中。讓這個類別使用大量的記憶體。接著呼叫Dispose將物件釋放，最後呼叫GC.Collect強迫做資源回收。在這個過程中，小喵使用系統中的工具【效能】來監視這個程式的記憶體使用狀況，藉此來觀察Dispose時，是否立即釋放記憶體。&lt;/p&gt;&lt;h1&gt;程式準備：&lt;/h1&gt;&lt;p&gt;首先先寫個Console的程式，在專案中開啟一個【主控台應用程式&lt;a href="http://files.dotblogs.com.tw/topcat/0807/DisposeDispose_AE0D/xx2_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="22" alt="xx2" width="128" border="0" src="http://files.dotblogs.com.tw/topcat/0807/DisposeDispose_AE0D/xx2_thumb.jpg" /&gt;&lt;/a&gt; 】，然後在專案中新增一個類別，這個類別因為需要有Dispose的功能，因此小喵【Implements System.IDisposable】的介面，讓這個類別有可以進行Dispose，接著安排屬性，撰寫New時的讀取文字檔內容。相關程式如下：&lt;/p&gt;&lt;p&gt;Class:myTestObj&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:579dcf02-9145-4c8a-a7bc-1a7bc29fe779" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
Imports System.IO

Public Class myTestObj
    Implements System.IDisposable

    Private m_TestStr As String

    Public Property TestStr() As String
        Get
            Return m_TestStr
        End Get
        Set(ByVal value As String)
            m_TestStr = value
        End Set
    End Property

    Public Sub New()

    End Sub
    Public Sub New(ByVal myFileName As String)
        m_TestStr = My.Computer.FileSystem.ReadAllText(myFileName)
    End Sub

    Private disposedValue As Boolean = False        ' 偵測多餘的呼叫

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: 釋放其他狀態 (Managed 物件)。
                m_TestStr = &amp;quot;&amp;quot;
            End If

            ' TODO: 釋放您自己的狀態 (Unmanaged 物件)
            ' TODO: 將大型欄位設定為 null。
        End If
        Me.disposedValue = True
    End Sub

#Region &amp;quot; IDisposable Support &amp;quot;
    ' 由 Visual Basic 新增此程式碼以正確實作可處置的模式。
    Public Sub Dispose() Implements IDisposable.Dispose
        ' 請勿變更此程式碼。在以上的 Dispose 置入清除程式碼 (ByVal 視為布林值處置)。
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接著在Console程式中，就使用該類別，之後Dispose接著呼叫GC.Collect做資源回收，程式如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:01b1bb89-a2ee-49e5-9ac0-99597195efc7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
Module Module1
    Sub Main()
        Dim oTest As myTestObj
        Try
            oTest = New myTestObj(&amp;quot;xx.txt&amp;quot;)
        Catch ex As Exception

        Finally
            oTest.Dispose()
            GC.Collect()
        End Try
    End Sub
End Module
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;剩下就是準備一個夠大的文字檔，讓記憶體的使用比較明顯，小喵準備一個23MB的文字檔&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.dotblogs.com.tw/topcat/0807/DisposeDispose_AE0D/xx_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="25" alt="xx" width="510" border="0" src="http://files.dotblogs.com.tw/topcat/0807/DisposeDispose_AE0D/xx_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;接著就是測試的開始囉&lt;/p&gt;&lt;p&gt;先開啟【控制台】中的【系統管理工具】找到【可靠性和效能監視器】&lt;a href="http://files.dotblogs.com.tw/topcat/0807/DisposeDispose_AE0D/xx3_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="87" alt="xx3" width="75" border="0" src="http://files.dotblogs.com.tw/topcat/0807/DisposeDispose_AE0D/xx3_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;然後按下F11讓程式啟動，接著在校能監視器中，新增一個監視，選擇【Process】，接著選擇【PageFileBytes】，並選擇我們的Process【ConsoleApplication1.vshost】藉此觀察記憶體的使用狀況。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;測試結果：&lt;/h1&gt;&lt;p&gt;測試過程小喵錄製下來，請參考以下的錄影過程&lt;/p&gt;&lt;p&gt;&lt;a title="http://vip2.blueshop.com.tw/topcat/DEMO/Dispose_GC/Dispose_GC.html" target="_blank" href="http://vip2.blueshop.com.tw/topcat/DEMO/Dispose_GC/Dispose_GC.html"&gt;http://vip2.blueshop.com.tw/topcat/DEMO/Dispose_GC/Dispose_GC.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;相關的程式碼，您可以到按此下載&lt;/p&gt;&lt;p&gt;&lt;a title="http://vip2.blueshop.com.tw/topcat/DEMO/Dispose_GC/ConsoleApplication1.rar" target="_blank" href="http://vip2.blueshop.com.tw/topcat/DEMO/Dispose_GC/ConsoleApplication1.rar"&gt;http://vip2.blueshop.com.tw/topcat/DEMO/Dispose_GC/ConsoleApplication1.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;從錄影的過程觀察到，當系統進行完Dispose之後，事實上記憶體並沒有立即釋放，而是直到呼叫了GC.collect之後才真正的釋放。&lt;/p&gt;&lt;p&gt;特別聲明：&lt;/p&gt;&lt;p&gt;GC.Collect方法是強制作業系統做資源回收的動作，不過&lt;font color="#ff0000"&gt;&lt;strong&gt;請您在寫程式的時候不要這麼做&lt;/strong&gt;&lt;/font&gt;，因為GC.Collect作用的區域並不只有你的程式部分，而是整個系統。並且這個動作是強制性的。再進行這個過程中，由於需要對全部的東西強制資源回收，所以&lt;strong&gt;該主機上其他的動作會等他做完之後再開始&lt;/strong&gt;。其實這個動作.NET Framework自己會依照系統的狀況自己處理。手動處理反而可能造成系統的負擔(想想馬路上隨時有救護車跑來跑去，頻率很高，大家都要停下來等他過)。因此寫程式時，只要使用Dispose讓系統標注這個記憶體可以被使用即可。有需要的時候讓系統自然啟動去清除。不要手動清除他。&lt;/p&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/55796.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>GridView編輯時使用DropDownList的錄影教學</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/07/04/55750.aspx</link><pubDate>Fri, 04 Jul 2008 10:55:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/07/04/55750.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/55750.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/07/04/55750.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/55750.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/55750.aspx</trackback:ping><description>&lt;p&gt;這個功能應該蠻多人會用到的，在GridView的某一筆資料點選【編輯】之後，希望能夠用下拉選取的方式選擇資料，然後按下更新後，可以將下拉後的選項更新到資料庫&lt;/p&gt; &lt;p&gt;全部過程都用設定的方式，並不需要寫任何程式碼，適合初學者學習。&lt;/p&gt; &lt;p&gt;小喵以Orders以及裡面的CustomerID維護時，使用下拉選單，從Customers選取適當的資料當作範例&lt;/p&gt; &lt;p&gt;設定過程請參考以下的錄影過程&lt;/p&gt; &lt;p&gt;&lt;a title="http://vip2.blueshop.com.tw/topcat/DEMO/DdlInGV/DdlInGV.html" href="http://vip2.blueshop.com.tw/topcat/DEMO/DdlInGV/DdlInGV.html" target="_blank"&gt;http://vip2.blueshop.com.tw/topcat/DEMO/DdlInGV/DdlInGV.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;範例檔下載：&lt;a title="http://vip2.blueshop.com.tw/topcat/DEMO/DdlInGV/tDDLInGV.zip" href="http://vip2.blueshop.com.tw/topcat/DEMO/DdlInGV/tDDLInGV.zip" target="_blank"&gt;http://vip2.blueshop.com.tw/topcat/DEMO/DdlInGV/tDDLInGV.zip&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/55750.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>物件Object的New,Dispose與Connection的Open,Close概念分享</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/07/03/55733.aspx</link><pubDate>Thu, 03 Jul 2008 16:27:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/07/03/55733.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/55733.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/07/03/55733.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/55733.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/55733.aspx</trackback:ping><description>&lt;p&gt;這篇文章源自於有位網友對於Using的疑問(&lt;a title="http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080703145519KXS&amp;amp;fumcde=FUM20041006161839LRJ" href="http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080703145519KXS&amp;amp;fumcde=FUM20041006161839LRJ"&gt;http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080703145519KXS&amp;amp;fumcde=FUM20041006161839LRJ&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;小喵就小喵的認知來說明，不見得正確，如有錯誤請大家指正，感恩&lt;/p&gt;&lt;h1&gt;什麼是New&lt;/h1&gt;&lt;p&gt;我們經常可以看到有人使用一個物件的時候會寫&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6c28b5f7-ec51-41e2-91e6-5b1e05bd26da" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
Dim oEmp as ObjEmployee
oEmp = New ObjEmployee
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而且少了New就不能執行，那麼什麼是New呢 &lt;a href="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E5%97%AF_2.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="54" alt="嗯" width="54" border="0" src="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E5%97%AF_thumb.gif" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;New&lt;/font&gt;&lt;/strong&gt;是產生執行個體，不過相信很多人又要問，什麼是【&lt;strong&gt;&lt;font color="#0000ff"&gt;產生執行個體&lt;/font&gt;&lt;/strong&gt;】 (能不能講明白一點啊!!&lt;a href="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E7%81%AB%E5%A4%A7_2.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="54" alt="火大" width="54" border="0" src="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E7%81%AB%E5%A4%A7_thumb.gif" /&gt;&lt;/a&gt; ) &lt;br /&gt;這要提到電腦的程式運作過程。程式在電腦上跑，會把程式的區段，在記憶體裡面挖一塊空間，然後把程式碼載入那塊空間 &lt;br /&gt;接著程式在運作的時候，就是記憶體與CPU之間溝通、運算、記錄等動作，而把【&lt;strong&gt;&lt;font color="#0000ff"&gt;挖塊記憶體，把程式載到那塊空間&lt;/font&gt;&lt;/strong&gt;】這個過程就是【&lt;strong&gt;&lt;font color="#0000ff"&gt;產生執行個體&lt;/font&gt;&lt;/strong&gt;】。 &lt;br /&gt;因此沒有New的話會怎樣，程式區塊根本沒有載入到記憶體中，因此也無法運作執行&lt;/p&gt;&lt;p&gt;講的擬人化一點&lt;/p&gt;&lt;p&gt;Dim oEmp as ObjEmployee&amp;nbsp; '宣告oEmp是ObjEmployee這種物件類別(此時有魂無體)&lt;a href="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E6%9C%89%E9%AC%BC_2.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="54" alt="有鬼" width="54" border="0" src="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E6%9C%89%E9%AC%BC_thumb.gif" /&gt;&lt;/a&gt; &lt;br /&gt;oEmp = New ObjEmployee&amp;nbsp;&amp;nbsp; '產生執行個體(此時投胎轉世，靈魂變成實體，可以開始工作)&lt;a href="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E6%9C%89%E4%B8%80%E5%A5%97_2.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="54" alt="有一套" width="54" border="0" src="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E6%9C%89%E4%B8%80%E5%A5%97_thumb.gif" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;什麼是Dispose&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;當一個物件已經使用完後，未來不會再使用，此時這個物件已經完成他這一生(New完之後到現在)的任務。因此他可以塵歸塵、土歸土...一切還諸天地...此時就進行Dispose &lt;a href="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E6%9C%89%E9%AC%BC_4.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="54" alt="有鬼" width="54" border="0" src="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E6%9C%89%E9%AC%BC_thumb_1.gif" /&gt;&lt;/a&gt; &lt;br /&gt;然而實際上，在記憶體中，&lt;strong&gt;當物件Dispose的時候，並沒有把該段記憶體清空，只是標註，這段空間不再使用&lt;/strong&gt;，直到GC啟動把他清空才算真正的清空。 &lt;br /&gt;因此如果用完後，不進行Dispose...那麼就會等到該位置很久沒動作了(就像有個人躺在地上，已經超過一定時間(一個月??)沒動作，也沒呼吸)，才會被其他的程式拿來用。&lt;/p&gt;&lt;p&gt;以上說明的是New(生)與Dispose(死)的關係&lt;/p&gt;&lt;hr /&gt;&lt;h1&gt;什麼是Open&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;當你有了實體後，代表可以開始運作 &lt;br /&gt;但不是真的已經運作了 &lt;br /&gt;以Connecion來說&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5194bae2-d5af-48fe-a9f8-dcd0e1d84fe6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
Using Conn As New Connetion(ConnStr)
    'Conn.Open
    Dim Dr as SqlDataReader
    Using Cmmd as New SqlCommand(&amp;quot;Select...&amp;quot;,Conn)
        Dr = Cmmd.ExecuteReader
    End Using
End Using
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面這段程式會出錯，他告訴你...Connection沒有Open，也就例如您&lt;strong&gt;&lt;font color="#0000ff"&gt;建立了一個橋&lt;/font&gt;&lt;/strong&gt;，但是這座橋卻&lt;strong&gt;&lt;font color="#0000ff"&gt;沒有通車&lt;/font&gt;&lt;/strong&gt;，因此也沒辦法用。因此使用DataReader或者Cmmd.ExecuteNoneQuery的時候，都需要告訴他已經通車了...他才會正常運作。&lt;/p&gt;&lt;p&gt;而如果使用&lt;strong&gt;&lt;font color="#0000ff"&gt;DataAdapter&lt;/font&gt;&lt;/strong&gt;的話這個傢伙比較厲害...&lt;a href="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E8%AE%9A_2.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="54" alt="讚" width="54" border="0" src="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E8%AE%9A_thumb.gif" /&gt;&lt;/a&gt; 他會看有沒有通車，有通車他就用；沒通車的話，他會&lt;strong&gt;自己把這通道打開&lt;/strong&gt;，然後去使用。&lt;/p&gt;&lt;h1&gt;最後說什麼是Close...&lt;/h1&gt;&lt;p&gt;Close是關閉通道，通道關了是可以再開的唷。 &lt;br /&gt;然後跟上面的Dispose再比對一下： &lt;br /&gt;Close只是把通道關閉 &lt;br /&gt;Dispose卻是通知作業系統...我已經完成任務，這段記憶體你可以拿去再用...然後壽終正寢 &lt;br /&gt;知道不一樣在哪了嗎??&lt;a href="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E5%B9%B8%E7%A6%8F_2.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="54" alt="幸福" width="54" border="0" src="http://files.dotblogs.com.tw/topcat/0807/ConnectionNewDisposeOpenClose_E240/%E5%B9%B8%E7%A6%8F_thumb.gif" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/55733.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>ObjectDataSouce簡介Part 2：範例程式(含畫面設定錄影教學)</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/07/01/55660.aspx</link><pubDate>Tue, 01 Jul 2008 08:43:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/07/01/55660.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/55660.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/07/01/55660.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/55660.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/55660.aspx</trackback:ping><description>&lt;p&gt;承繼上篇【&lt;a href="http://www.dotblogs.com.tw/topcat/archive/2008/06/27/4395.aspx"&gt;ObjectDataSouce簡介Part1：兼具ADO.NET的自由與DataSouce的方便&lt;/a&gt;】，我們這篇就來拿個實際範例，告訴各位如何撰寫相關的程式。&lt;/p&gt;

&lt;p&gt;首先介紹上次提到的這樣的方式&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods02_2.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;先示範如何撰寫類別的部分。&lt;/p&gt;

&lt;p&gt;首先，小喵建立一個物件用來讀取Connection String，未來無論Connection String用什麼方式來存放(存放的方式很多，可以直接放在物件中，也可放在Web.Config，小喵自己是存在沒有Web分享的硬碟裡)，都可以透過這個物件來取得Connection String。&lt;/p&gt;

&lt;p&gt;在專案中新增一個類別，取名為【objConnS.vb】，內容如下：&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; Microsoft.VisualBasic

&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; objConnS
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; m_ConnStr &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;&amp;quot;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NORTHWND.MDF;Integrated Security=True;User Instance=True&amp;quot;&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;ReadOnly&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt; ConnStr() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Get&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; m_ConnStr
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Get&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt;
&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;接著開始撰寫資料存取的類別(我們以北風資料庫中的Customers當作示範，示範時只取其中四個欄位當範例)，小喵取名為【daoCustomer.vb】，裡面寫了5個副程式，其中兩個Select用的用Function，剩下3個新增修改刪除不需要傳回值，就用Sub即可(當然如果想傳回值用Function也可)。程式內容如下：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;GetAllCusts()：用DataTable傳回所有的Customers&lt;/li&gt;

  &lt;li&gt;GetCustByID(ByVal CustomerID As String)：用參數傳入條件CustomerID，傳回符合條件的一筆，這可以用來當作是單筆維護的處理&lt;/li&gt;

  &lt;li&gt;UpdateCustomers,InsertCustomers,DeleteCustomers這三個則是透過參數傳遞要新增修改刪除的相關資料，然後透過ADO.NET維護資料。&lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.Data
&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.Data.SqlClient
&lt;span class="kwrd"&gt;Imports&lt;/span&gt; Microsoft.VisualBasic

&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; daoCustomer

    &lt;span class="kwrd"&gt;Private&lt;/span&gt; oConnS &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; objConnS
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; ConnStr &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = oConnS.ConnStr


    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetAllCusts() &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable
        &lt;span class="kwrd"&gt;Try&lt;/span&gt;
            Using Conn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlConnection(ConnStr)
                Conn.Open()
                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; SqlTxt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; SELECT  CustomerID,  CompanyName,  ContactName,  City  &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; FROM Customers &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;

                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; Dt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; DataTable
                Using Cmmd &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlCommand(SqlTxt, Conn)
                    Dt.Load(Cmmd.ExecuteReader)
                &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
                &lt;span class="kwrd"&gt;Return&lt;/span&gt; Dt

            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception
            &lt;span class="kwrd"&gt;Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Exception(ex.Message)
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetCustByID(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; CustomerID &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; DataTable
        &lt;span class="kwrd"&gt;Try&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; CustomerID &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                CustomerID = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            Using Conn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlConnection(ConnStr)
                Conn.Open()
                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; SqlTxt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; SELECT CustomerID,  CompanyName,  ContactName,  City &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; FROM Customers &amp;quot;&lt;/span&gt;
                &lt;span class="kwrd"&gt;If&lt;/span&gt; CustomerID &amp;lt;&amp;gt; &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                    SqlTxt += &lt;span class="str"&gt;&amp;quot; WHERE CustomerID = @CustomerID &amp;quot;&lt;/span&gt;
                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;
                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; Dt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; DataTable
                Using Cmmd &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlCommand(SqlTxt, Conn)
                    &lt;span class="kwrd"&gt;If&lt;/span&gt; CustomerID &amp;lt;&amp;gt; &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                        Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@CustomerID&amp;quot;&lt;/span&gt;, CustomerID)
                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
                    Dt.Load(Cmmd.ExecuteReader)
                &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
                &lt;span class="kwrd"&gt;Return&lt;/span&gt; Dt

            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception
            &lt;span class="kwrd"&gt;Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Exception(ex.Message)
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;

    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; UpdateCustomers(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; CustomerID &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; CompanyName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; ContactName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; City &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;)
        &lt;span class="kwrd"&gt;Try&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; CustomerID &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                CustomerID = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; CompanyName &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                CompanyName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; ContactName &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                ContactName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; City &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                City = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            Using Conn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlConnection(ConnStr)
                Conn.Open()
                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; SqlTxt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; UPDATE Customers &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; SET CompanyName = @CompanyName &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;     ,ContactName = @ContactName &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;     ,City = @City &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; WHERE CustomerID = @CustomerID &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;
                Using Cmmd &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlCommand(SqlTxt, Conn)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@CompanyName&amp;quot;&lt;/span&gt;, CompanyName)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@ContactName&amp;quot;&lt;/span&gt;, ContactName)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@City&amp;quot;&lt;/span&gt;, City)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@CustomerID&amp;quot;&lt;/span&gt;, CustomerID)
                    Cmmd.ExecuteNonQuery()
                &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception
            &lt;span class="kwrd"&gt;Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Exception(ex.Message)
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; InsertCustomers(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; CustomerID &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; CompanyName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; ContactName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; City &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;)
        &lt;span class="kwrd"&gt;Try&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; CustomerID &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                CustomerID = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; CompanyName &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                CompanyName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; ContactName &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                ContactName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; City &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                City = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;

            Using Conn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlConnection(ConnStr)
                Conn.Open()
                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; SqlTxt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; INSERT INTO Customers &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;     (CustomerID, CompanyName, ContactName, City) &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; VALUES (@CustomerID, @CompanyName, @ContactName, @City) &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;
                Using Cmmd &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlCommand(SqlTxt, Conn)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@CompanyName&amp;quot;&lt;/span&gt;, CompanyName)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@ContactName&amp;quot;&lt;/span&gt;, ContactName)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@City&amp;quot;&lt;/span&gt;, City)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@CustomerID&amp;quot;&lt;/span&gt;, CustomerID)
                    Cmmd.ExecuteNonQuery()

                &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception
            &lt;span class="kwrd"&gt;Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Exception(ex.Message)
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; DeleteCustomers(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; CustomerID &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;)
        &lt;span class="kwrd"&gt;Try&lt;/span&gt;
            Using Conn &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlConnection(ConnStr)
                Conn.Open()
                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; SqlTxt &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; DELETE Customers &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot; WHERE CustomerID = @CustomerID &amp;quot;&lt;/span&gt;
                SqlTxt += &lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;
                Using Cmmd &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SqlCommand(SqlTxt, Conn)
                    Cmmd.Parameters.AddWithValue(&lt;span class="str"&gt;&amp;quot;@CustomerID&amp;quot;&lt;/span&gt;, CustomerID)
                    Cmmd.ExecuteNonQuery()

                &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using
        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception
            &lt;span class="kwrd"&gt;Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Exception(ex.Message)
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;
&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;其中為了避免程式一開始，傳遞的參數是Nothing造成程式的錯誤，因此在程式中判斷如果傳入的參數是Nothing，就給預設值。&lt;/p&gt;

&lt;p&gt;寫好了物件後，接著就來看怎麼編輯畫面，怎麼設定ObjectDataSouce，怎麼讓物件控制相透過我們寫好的程式動起來。這部分請參考以下的錄影說明。(包含畫面設定、錯誤處理等)&lt;/p&gt;

&lt;p&gt;錄影： &lt;a title="http://vip2.blueshop.com.tw/topcat/DEMO/tObjectDataSouce/tObjectDataSouce.html" href="http://vip2.blueshop.com.tw/topcat/DEMO/tObjectDataSouce/tObjectDataSouce.html" target="_blank"&gt;http://vip2.blueshop.com.tw/topcat/DEMO/tObjectDataSouce/tObjectDataSouce.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;範例程式下載：&lt;a title="http://vip2.blueshop.com.tw/topcat/DEMO/tObjectDataSouce/tObjectDataSouce.html" href="http://vip2.blueshop.com.tw/topcat/DEMO/tObjectDataSouce/tObjectDataSouce.zip" target="_blank"&gt;http://vip2.blueshop.com.tw/topcat/DEMO/tObjectDataSouce/tObjectDataSouce.zip&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;而如果是結合商用物件的方式&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods03_thumb.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;請參考小喵的另外一篇文章裡面有範例&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://www.dotblogs.com.tw/topcat/archive/2008/06/20/4346.aspx" target="_blank"&gt;ObjectDataSouce結合物件設計方式&lt;/a&gt;&lt;/p&gt;
&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/55660.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>ObjectDataSouce簡介Part1：兼具ADO.NET的自由與DataSouce的方便</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/07/01/55659.aspx</link><pubDate>Tue, 01 Jul 2008 08:43:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/07/01/55659.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/55659.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/07/01/55659.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/55659.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/55659.aspx</trackback:ping><description>&lt;p&gt;一般市面上介紹的書籍，大部分都會從SqlDataSouce與GridView,DetailView等DataControl來介紹，當然這些東西很方便，可以在最少的程式碼的情況下，做出新增修改刪除查詢。但是，事實上在專案開發下並非如想像中這麼美好，您不會永遠都是處理單一資料表的新增修改刪除查詢。當遇到要處理兩個資料表以上的時候，又該如何呢??&lt;/p&gt;&lt;p&gt;在ASP.NET 2.0裡面多了一個ObjectDataSouce，這個東西可以讓我們在處理資料的時候，可以透過自己寫的程式，或者已經開發好的物件來撰寫。&lt;/p&gt;&lt;p&gt;我們從以下的示意圖來看：&lt;/p&gt;&lt;p&gt;1.SqlDataSouce：&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods01_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="131" alt="ods01" width="612" border="0" src="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods01_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;SqlDataSouce透過Select,Insert,Update,Delete四種Command設定來存取資料&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.使用ObjectDataSouce&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods02_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="130" alt="ods02" width="609" border="0" src="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods02_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ObjectDataSouce則是透過指定的類別、以及類別中所撰寫的Method(Function/Sub)來處理，其中Select必須傳回結果，傳回的結果可以用這幾種方式【DataReader、DataSet、DataTable、DavaView、Collection Objects(物件集合)】，也就是一般在寫Me.GridView1.DataSouce=XXXX這裡可以傳入的型態。而其他Insert,Update,Delete則是需要配合傳遞要維護的資料，並在裡面透過ADO.NET存取資料。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3.使用ObjectDataSouce配合Business Object(*.dll/Class)&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods03_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="84" alt="ods03" width="607" border="0" src="http://files.dotblogs.com.tw/topcat/0806/ObjectDataSoucePart1ADO.NETDataSouce_76BC/ods03_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;可以再把資料的存取、以及一些商業邏輯抽出來，寫成一些商用物件，然後在寫個類別來運用這些商用物件，與ObjectDataSouce結合。&lt;/p&gt;&lt;p&gt;從這邊我們可以了解，使用ObjectDataSouce，可以自己撰寫程式來做資料的存取。能夠依照自己的需求來撰寫程式，讓系統能夠更靈活的應用。又可以透過DataSouce的機制，與資料控制項(例如GridView,DetailView,FormView等)結合。讓界面的部分能夠將程式減少，應用更為便利。可說是【兼具ADO.NET的自由與DataSouce的方便】。&lt;/p&gt;&lt;p&gt;至於2.3的方式如何撰寫，我們將在另外的文章中介紹。&lt;/p&gt;&lt;p&gt;^_^&lt;/p&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/55659.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>ObjectDataSouce結合物件設計方式</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/06/21/55380.aspx</link><pubDate>Sat, 21 Jun 2008 00:30:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/06/21/55380.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/55380.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/06/21/55380.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/55380.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/55380.aspx</trackback:ping><description>&lt;p&gt;小喵以前撰寫ObjectDataSouce都是透過DataSet,DataTable,DataReader的方式傳回值，而要進行維護的動作，也是一個一個的參數慢慢傳遞，後來小喵看到Jeff大大的這篇文章【&lt;a href="http://www.dotblogs.com.tw/jeff377/archive/2008/06/06/4245.aspx"&gt;ObjectDataSoruce 繫結 BusinessObject 控制項&lt;/a&gt;】，原來可以用物件的方式來傳遞，於是小喵今天開始著手看看是否能夠改用物件的方式處理。&lt;/p&gt;&lt;p&gt;首先小喵先設計一個測試的資料表，資料表(Employees)欄位如下圖&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.vcnet.tw/topcat/aspx?n=fle&amp;amp;r=ODS001_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="120" alt="ODS001" width="476" border="0" src="http://www.vcnet.tw/topcat/aspx?n=fle&amp;amp;r=ODS001_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;接著就針對這個資料表，建立一個Employee的類別，未來這個物件類別可以抽出來當作是商業邏輯層或者資料層的元件，並撰寫相關的新增、修改、刪除、查詢等功能，相關程式碼如下：&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2dc9c5eb-a8ee-4ac6-9954-9964d5ff2b69" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualBasic

Public Class ObjEmployee
    
    ''' &amp;lt;summary&amp;gt;
    ''' 員工編號欄位
    ''' &amp;lt;/summary&amp;gt;
    Private m_EmployeeID As Integer
    ''' &amp;lt;summary&amp;gt;
    ''' 員工姓名欄位
    ''' &amp;lt;/summary&amp;gt;
    Private m_EmpName As String
    ''' &amp;lt;summary&amp;gt;
    ''' 員工電話欄位
    ''' &amp;lt;/summary&amp;gt;
    Private m_EmpTel As String

    Private oConns As New objConnS
    Private ConnStr As String = oConns.ConnStr

    ''' &amp;lt;summary&amp;gt;
    ''' 員工編號屬性
    ''' &amp;lt;/summary&amp;gt;
    Public Property EmployeeID() As Integer
        Get
            Return m_EmployeeID
        End Get
        Set(ByVal value As Integer)
            m_EmployeeID = value
        End Set
    End Property

    ''' &amp;lt;summary&amp;gt;
    ''' 員工姓名屬性
    ''' &amp;lt;/summary&amp;gt;
    Public Property EmpName() As String
        Get
            Return m_EmpName
        End Get
        Set(ByVal value As String)
            m_EmpName = value
        End Set
    End Property

    ''' &amp;lt;summary&amp;gt;
    ''' 員工電話屬性
    ''' &amp;lt;/summary&amp;gt;
    Public Property EmpTel() As String
        Get
            Return m_EmpTel
        End Get
        Set(ByVal value As String)
            m_EmpTel = value
        End Set
    End Property

    '建構函數
    Public Sub New()

    End Sub

    Public Sub New(ByVal myEmpID As Integer)
        GetEmp(myEmpID)
    End Sub

    Private Sub GetEmp(ByVal myEmpID As Integer)
        Try
            Using Conn As New SqlConnection(ConnStr)
                Conn.Open()
                Dim SqlTxt As String = &amp;quot;&amp;quot;
                SqlTxt += &amp;quot; SELECT * &amp;quot;
                SqlTxt += &amp;quot; FROM Employees &amp;quot;
                SqlTxt += &amp;quot; WHERE EmployeeID = @EmployeeID &amp;quot;
                Dim Cmmd As New SqlCommand(SqlTxt, Conn)
                Cmmd.Parameters.AddWithValue(&amp;quot;@EmployeeID&amp;quot;, myEmpID)
                Dim dr As SqlDataReader = Cmmd.ExecuteReader
                If dr.HasRows Then
                    While dr.Read
                        m_EmployeeID = myEmpID
                        m_EmpName = dr.Item(&amp;quot;EmpName&amp;quot;)
                        m_EmpTel = dr.Item(&amp;quot;EmpTel&amp;quot;)
                    End While
                End If
                dr.Close()
            End Using

        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
    End Sub

    ''' &amp;lt;summary&amp;gt;
    ''' 新增一筆Employee
    ''' &amp;lt;/summary&amp;gt;
    Public Sub Add()
        Try
            Using Conn As New SqlConnection(ConnStr)
                Conn.Open()
                Dim SqlTxt As String = &amp;quot;&amp;quot;
                SqlTxt += &amp;quot; INSERT INTO Employees &amp;quot;
                SqlTxt += &amp;quot;     (EmpName, EmpTel) &amp;quot;
                SqlTxt += &amp;quot; VALUES (@EmpName, @EmpTel) &amp;quot;
                SqlTxt += &amp;quot;  &amp;quot;
                Dim Cmmd As New SqlCommand(SqlTxt, Conn)
                Cmmd.Parameters.AddWithValue(&amp;quot;@EmpName&amp;quot;, m_EmpName)
                Cmmd.Parameters.AddWithValue(&amp;quot;@EmpTel&amp;quot;, m_EmpTel)

                Cmmd.ExecuteNonQuery()
            End Using
        Catch ex As Exception
            Throw New Exception(ex.Message)

        End Try
    End Sub

    ''' &amp;lt;summary&amp;gt;
    ''' 刪除一筆Employee
    ''' &amp;lt;/summary&amp;gt;
    Public Sub Del()
        Try
            Using Conn As New SqlConnection(ConnStr)
                Conn.Open()
                Dim SqlTxt As String = &amp;quot;&amp;quot;
                SqlTxt += &amp;quot; Delete Employees &amp;quot;
                SqlTxt += &amp;quot; WHERE EmployeeID=@EmployeeID &amp;quot;
                SqlTxt += &amp;quot;  &amp;quot;
                Dim Cmmd As New SqlCommand(SqlTxt, Conn)
                Cmmd.Parameters.AddWithValue(&amp;quot;@EmployeeID&amp;quot;, m_EmployeeID)

                Cmmd.ExecuteNonQuery()
            End Using
        Catch ex As Exception
            Throw New Exception(ex.Message)

        End Try

    End Sub

    ''' &amp;lt;summary&amp;gt;
    ''' 修改單筆Employee
    ''' &amp;lt;/summary&amp;gt;
    Public Sub Update()
        Try
            Using Conn As New SqlConnection(ConnStr)
                Conn.Open()
                Dim SqlTxt As String = &amp;quot;&amp;quot;
                SqlTxt += &amp;quot; UPDATE Employees &amp;quot;
                SqlTxt += &amp;quot; SET EmpName=@EmpName) &amp;quot;
                SqlTxt += &amp;quot;     , EmpTel=@EmpTel  &amp;quot;
                SqlTxt += &amp;quot; WHERE EmployeeID=@EmployeeID &amp;quot;
                SqlTxt += &amp;quot;  &amp;quot;
                Dim Cmmd As New SqlCommand(SqlTxt, Conn)
                Cmmd.Parameters.AddWithValue(&amp;quot;@EmployeeID&amp;quot;, m_EmployeeID)
                Cmmd.Parameters.AddWithValue(&amp;quot;@EmpName&amp;quot;, m_EmpName)
                Cmmd.Parameters.AddWithValue(&amp;quot;@EmpTel&amp;quot;, m_EmpTel)

                Cmmd.ExecuteNonQuery()
            End Using
        Catch ex As Exception
            Throw New Exception(ex.Message)

        End Try

    End Sub
End Class
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;另外為了方便處理Connection String，也寫了個小類別來存放&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9bca419d-3c37-4c27-9f86-abef8b7d1adc" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
Imports Microsoft.VisualBasic

Public Class objConnS
    Private m_ConnStr As String = &amp;quot;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MyDB.mdf;Integrated Security=True;User Instance=True&amp;quot;

    Public ReadOnly Property ConnStr() As String
        Get
            Return m_ConnStr
        End Get
    End Property

End Class
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再來設計一個配合ObjectDataSouce的物件，進行新增、修改、刪除、查詢的動作&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a9bc3adb-ae9f-44df-97d5-c8a34dbde1a8" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualBasic

Public Class daoEmployee
    Private oConnS As New objConnS
    Private ConnStr As String = oConnS.ConnStr

    Public Function GetAllEmployee() As List(Of ObjEmployee)
        Try
            Dim tEmps As New List(Of ObjEmployee)
            tEmps.Clear()
            Using Conn As New SqlConnection(ConnStr)
                Conn.Open()
                Dim SqlTxt As String = &amp;quot;&amp;quot;
                SqlTxt += &amp;quot; SELECT * &amp;quot;
                SqlTxt += &amp;quot; FROM Employees &amp;quot;
                Dim Cmmd As New SqlCommand(SqlTxt, Conn)
                Dim Dr As SqlDataReader = Cmmd.ExecuteReader
                If Dr.HasRows Then
                    Dim tEmp As ObjEmployee
                    While Dr.Read
                        tEmp = New ObjEmployee(Dr.Item(&amp;quot;EmployeeID&amp;quot;))
                        tEmps.Add(tEmp)
                    End While
                End If
            End Using
            Return tEmps

        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Sub EmpUpdate(ByVal oEmp As ObjEmployee)
        Try
            oEmp.Update()
        Catch ex As Exception
            Throw
        End Try
    End Sub

    Public Sub EmpDel(ByVal oEmp As ObjEmployee)
        Try
            oEmp.Del()
        Catch ex As Exception
            Throw
        End Try
    End Sub

    Public Sub EmpAddNew(ByVal oEmp As ObjEmployee)
        Try
            oEmp.Add()
        Catch ex As Exception
            Throw
        End Try
    End Sub

End Class
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;有趣的地方有看到嗎，GetAllEmployee傳回的不再是DataSet,DataTable,DataRead，而是&lt;b&gt;&lt;span style="color: #ff0000"&gt;objEmployee的物件集合&lt;/span&gt;&lt;/b&gt;，另外，新增修改刪除的程式碼&lt;span style="color: #ff0000"&gt;精減&lt;/span&gt;到一個不行。傳遞的參數沒有其他的，就是物件，而運作的，就是物件提供的新增修改刪除。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;接著設計一下測試的畫面&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:48ab3e91-0cf7-43f9-9303-252ee09f817b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="xml" name="code"&gt;
        &amp;lt;asp:GridView ID=&amp;quot;gvEmployees&amp;quot; runat=&amp;quot;server&amp;quot; AutoGenerateColumns=&amp;quot;False&amp;quot; 
            DataSourceID=&amp;quot;odsEmployees&amp;quot; DataKeyNames=&amp;quot;EmployeeID&amp;quot;&amp;gt;
            &amp;lt;Columns&amp;gt;
                &amp;lt;asp:CommandField ShowDeleteButton=&amp;quot;True&amp;quot; ShowEditButton=&amp;quot;True&amp;quot; /&amp;gt;
                &amp;lt;asp:BoundField DataField=&amp;quot;EmployeeID&amp;quot; HeaderText=&amp;quot;EmployeeID&amp;quot; 
                    SortExpression=&amp;quot;EmployeeID&amp;quot; /&amp;gt;
                &amp;lt;asp:BoundField DataField=&amp;quot;EmpName&amp;quot; HeaderText=&amp;quot;EmpName&amp;quot; 
                    SortExpression=&amp;quot;EmpName&amp;quot; /&amp;gt;
                &amp;lt;asp:BoundField DataField=&amp;quot;EmpTel&amp;quot; HeaderText=&amp;quot;EmpTel&amp;quot; 
                    SortExpression=&amp;quot;EmpTel&amp;quot; /&amp;gt;
            &amp;lt;/Columns&amp;gt;
        &amp;lt;/asp:GridView&amp;gt;
        &amp;lt;asp:ObjectDataSource ID=&amp;quot;odsEmployees&amp;quot; runat=&amp;quot;server&amp;quot; 
            DataObjectTypeName=&amp;quot;ObjEmployee&amp;quot; DeleteMethod=&amp;quot;EmpDel&amp;quot; 
            SelectMethod=&amp;quot;GetAllEmployee&amp;quot; TypeName=&amp;quot;daoEmployee&amp;quot; 
            UpdateMethod=&amp;quot;EmpUpdate&amp;quot; InsertMethod=&amp;quot;EmpAddNew&amp;quot;&amp;gt;
        &amp;lt;/asp:ObjectDataSource&amp;gt;
        &amp;lt;asp:DetailsView ID=&amp;quot;dvEmployee&amp;quot; runat=&amp;quot;server&amp;quot; AutoGenerateRows=&amp;quot;False&amp;quot; 
            DataSourceID=&amp;quot;odsEmployees&amp;quot; DefaultMode=&amp;quot;Insert&amp;quot; Height=&amp;quot;50px&amp;quot; 
            Width=&amp;quot;125px&amp;quot; DataKeyNames=&amp;quot;EmployeeID&amp;quot;&amp;gt;
            &amp;lt;Fields&amp;gt;
                &amp;lt;asp:BoundField DataField=&amp;quot;EmployeeID&amp;quot; HeaderText=&amp;quot;EmployeeID&amp;quot; 
                    InsertVisible=&amp;quot;False&amp;quot; SortExpression=&amp;quot;EmployeeID&amp;quot; /&amp;gt;
                &amp;lt;asp:BoundField DataField=&amp;quot;EmpName&amp;quot; HeaderText=&amp;quot;EmpName&amp;quot; 
                    SortExpression=&amp;quot;EmpName&amp;quot; /&amp;gt;
                &amp;lt;asp:BoundField DataField=&amp;quot;EmpTel&amp;quot; HeaderText=&amp;quot;EmpTel&amp;quot; 
                    SortExpression=&amp;quot;EmpTel&amp;quot; /&amp;gt;
                &amp;lt;asp:CommandField ShowInsertButton=&amp;quot;True&amp;quot; /&amp;gt;
            &amp;lt;/Fields&amp;gt;
        &amp;lt;/asp:DetailsView&amp;gt;
        &amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;唯一畫面要寫的程式是，在DetailView的資料新增之後，要讓GridView重新整理一次&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b0644830-086f-409e-8ff7-12dfba02ef7e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre class="vb" name="code"&gt;
    Protected Sub dvEmployee_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertedEventArgs) Handles dvEmployee.ItemInserted
        Me.gvEmployees.DataBind()
    End Sub&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;這樣就能夠使用物件的方式來處理並且方便把物件抽離出去，並且不用寫ObjectDataSouce的搭配物件時，需要撰寫一堆傳遞的參數。&lt;/p&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/55380.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>