<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>N-Tiers多層式架構</title><link>http://blog.blueshop.com.tw/topcat/category/526.aspx</link><description>ASP---COM+----SQL
架構設計網頁的相關技術文章</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>VB6 撰寫元件過程錄影檔</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/09/25/40341.aspx</link><pubDate>Mon, 25 Sep 2006 17:31:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/09/25/40341.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/40341.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/09/25/40341.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/40341.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/40341.aspx</trackback:ping><description>&lt;P&gt;小喵之前有將VB6撰寫元件、註冊元件的過程錄影下來，放在小舖的下載區&lt;/P&gt;
&lt;P&gt;提供大家參考&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.blueshop.com.tw/download/show.asp?pgmcde=PGM20050624134625OTC"&gt;http://www.blueshop.com.tw/download/show.asp?pgmcde=PGM20050624134625OTC&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/40341.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>N-Tiers開發方式(ASP/ASP.NET、VB6/VB.NET呼叫使用COM+元件)</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/08/28/36695.aspx</link><pubDate>Mon, 28 Aug 2006 19:05:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/08/28/36695.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/36695.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/08/28/36695.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/36695.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/36695.aspx</trackback:ping><description>&lt;P&gt;續接：&lt;A id=_dd85df0e09b5c35a_HomePageDays_DaysList__ctl2_DayItem_DayList__ctl0_TitleUrl href="/topcat/archive/2006/08/09/35630.aspx"&gt;N-Tiers開發方式(COM+元件的註冊、修改)&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;在元件安裝完成後，接下來的工作就是要如何呼叫使用我們寫好的元件了。我們假設我們寫好的元件的名稱如下：&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=xml style="WIDTH: 681px; HEIGHT: 100px" name=code rows=6 cols=80&gt;Package:KDMO1000
Project：PDMOMenu
Class：
    CDMOMenu1(無Transaction)
    CDMOMenu2(有Transaction)
假設CDMOMenu1中有一個Function是GetNodeName，傳入參數NodeId(整數)，傳回NodeName(字串)

GetNodeName(Byval NodeId as Integer) As String&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;Late Binding：&lt;/P&gt;
&lt;P&gt;我這邊所提的使用方式，是使用Late Binding的呼叫方式。也就是說，不會預先將元件註冊到您的ASP.NET的專案中，或者是您的VB.NET的專案中，當系統運作的時候，在動態的從Server把該物件Bind上來使用。這樣做的缺點是，您無法透過obj.就彈出元件內的屬性方法讓您選擇，使用屬性方法的時候都必須自己Keyin進去。但是優點則是，當您的元件有做了變更，您不必去一個一個的專案裡重新的Reference您的元件；另外就是不論您寫的是ASP、ASP.NET、VB、VB.NET，您呼叫元件的方式是一致的。&lt;/P&gt;
&lt;P&gt;呼叫元件：&lt;/P&gt;
&lt;P dir=ltr&gt;呼叫元件的方式如下：&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr&gt;ASP:&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 607px; HEIGHT: 100px" name=code rows=6 cols=71&gt;Set obj = CreateObject("PDMOMenu.CDMOMenu1")
NodeId = 2
NodeName = obj.GetNodeName(NodeId)&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;VB:&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 606px; HEIGHT: 100px" name=code rows=6 cols=71&gt;Dim obj as Object
Set obj = CreateObject("PDMOMenu.CDMOMenu1")
Dim NodeId as Integer
NodeId = 2
Dim NodeName as String
NodeName = obj.GetNodeName(NodeId)&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;ASP.NET/VB.NET&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;TEXTAREA class=vb style="WIDTH: 609px; HEIGHT: 179px" name=code rows=7 cols=72&gt;Dim NodeId As Integer = 2
Dim obj As Object = CreateObject("PDMOMenu.CDMOMenu1")
Try
    Dim NodeName As String = obj.GetNodeName(NodeId)
Catch ex As Exception
    Me.lblErrMsg.Text=ex.Message.toString()
Finally
    '資源回收
    obj.Dispose()
    obj = Nothing
End Try&lt;/TEXTAREA&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;&amp;nbsp;.NET呼叫元件需自行釋放元件：&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr&gt;從以上的這些程式碼，可以發現，呼叫元件的過程幾乎相同，使用.NET撰寫時，呼叫的方式更可以簡潔。&lt;/P&gt;
&lt;P dir=ltr&gt;當元件被呼叫執行後，可以在【元件服務】中找到該Package中的元件被呼叫而轉起來。如果是用ASP,VB6呼叫元件，可以發現當元件呼叫完成後，元件的轉動會停下來，呼叫中的元件數字也會歸零。但次使用.NET呼叫元件，如果沒有撰寫【Try..Catch..Finally..End Try】並且把【&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;obj.Dispose()&lt;/FONT&gt;&lt;/STRONG&gt;】、【&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;obj = Nothing&lt;/FONT&gt;&lt;/STRONG&gt;】放在Finally裡，那麼【元件服務】中的元件將會轉不停。這是因為ASP,VB6再程式執行完畢時，會自動的做【&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;資源回收&lt;/FONT&gt;&lt;/STRONG&gt;】的動作；但是在.NET中【&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;資源回收&lt;/FONT&gt;&lt;/STRONG&gt;】必須經由程式設計者手動的執行，否則需當系統資源不足時啟動GC才能夠真正的回收。&lt;/P&gt;
&lt;P dir=ltr&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/36695.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>N-Tiers開發方式(COM+元件的註冊、修改)</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35630.aspx</link><pubDate>Wed, 09 Aug 2006 16:45:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35630.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/35630.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35630.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/35630.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/35630.aspx</trackback:ping><description>&lt;P&gt;當COM+的元件已經撰寫完成後，接著就是要如何將撰寫好的元件註冊的主機的【元件服務】上&lt;/P&gt;
&lt;P&gt;以往小喵用VB6撰寫元件，要註冊元件時，只需要在元件服務中建立空的Package，然後將寫好的元件托拉進去即可，要修改時，只要元件的機碼相容，也只需要將Package停止後，將元件覆蓋即可。請參考&lt;A href="http://www.blueshop.com.tw/download/show.asp?pgmcde=PGM20050624134625OTC"&gt;元件撰寫、註冊過程錄影檔&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;但是進入.NET開發元件，小喵發現無法使用原來的方式處理，必須透過【.NET Framework 2.0】的【SDK命令提示字元】，使用這樣的Command視窗透過下指令的方式來註冊，註冊後元件會依照原件撰寫時所指定的Package存放，而如果該Package不存在，也會自動產生&lt;/P&gt;
&lt;P&gt;首先Server除了要安裝.NET Framework 2.0以外，還得安裝SDK才能使用，相關鏈結如下：&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;.NET Framework 2.0&lt;BR&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&amp;amp;DisplayLang=zh-tw"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&amp;amp;DisplayLang=zh-tw&lt;/A&gt; 
&lt;LI&gt;.NET Framework 2.0 SDK&lt;BR&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=zh-tw"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=zh-tw&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;註冊與反註冊過程如下&lt;/P&gt;
&lt;P&gt;手先準備好兩個批次檔，分別用來註冊與反註冊元件&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;註冊元件(RegNetCom.bat)：&lt;BR&gt;&lt;TEXTAREA class=xml name=code rows=6 cols=50&gt;REGSVCS %1.dll
GACUTIL /i %1.dll&lt;/TEXTAREA&gt; 
&lt;LI&gt;反註冊元件(UnRegNetCom.bat)：&lt;BR&gt;&lt;TEXTAREA class=xml name=code rows=6 cols=50&gt;GACUTIL /u %1
REGSVCS /u %1.dll&lt;/TEXTAREA&gt;
&lt;LI&gt;有人反應原有方式GAC無法移除，所以小喵稍微改寫了一下，這樣註冊移除就可以都正常了。【&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;New&lt;/FONT&gt;&lt;/STRONG&gt;】&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;安裝完.NET Framework SDK後，會有【SDK命令提示字元】，首先將您要註冊的元件，複製到適當的目錄中，小喵通常是將相關的dll複製到【D:\Application\(專案名稱)\】中，其中專案名稱依不同需求會訂定不同的名稱，例如：D:\Application\PDMO&lt;/P&gt;
&lt;P&gt;接著將以上兩個批次檔(RegNetCom.bat、UnRegNetCom.bat)也複製到該資料夾中&lt;/P&gt;
&lt;P&gt;然後開啟【SDK命令提示字元】，假設元件產生後的dll名稱為PDMOMenu.dll那麼下以下指令：&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;註冊時：&lt;BR&gt;RegNetCom PDMOMenu 
&lt;LI&gt;反註冊(移除)時：&lt;BR&gt;UnRegNetCom PDMOMenu&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;反註冊時必須注意：元件是否有被呼叫起來→如果有→先停止Package&lt;/P&gt;
&lt;P&gt;當元件註冊完後，如果是該Package的第一個元件，還需針對元件設定【使用者識別】讓呼叫元件時可切換指定的帳號權限執行，方式如下：&lt;/P&gt;
&lt;UL&gt;
&lt;LI dir=ltr style="MARGIN-RIGHT: 0px"&gt;在Package上按右鍵→內容 
&lt;LI dir=ltr style="MARGIN-RIGHT: 0px"&gt;識別碼→使用下列使用者 
&lt;LI dir=ltr style="MARGIN-RIGHT: 0px"&gt;瀏覽→選取適當使用者→輸入該帳號密碼 
&lt;LI dir=ltr style="MARGIN-RIGHT: 0px"&gt;確認&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN-RIGHT: 0px"&gt;這樣就能夠依據需求，在呼叫該Package中的元件時，切換身分為指定的使用者，透過該使用者的權限來執行元件了&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/35630.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>N-Tiers開發方式(如何使用VB.NET撰寫COM+元件)</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35629.aspx</link><pubDate>Wed, 09 Aug 2006 16:21:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35629.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/35629.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35629.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/35629.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/35629.aspx</trackback:ping><description>&lt;P&gt;小喵撰寫COM+元件開始於VB6的年代，撰寫與註冊的方式還算不是很複雜，不過隨著進入了.NET的世界，撰寫的過程也變得比較複雜了許多。&lt;/P&gt;
&lt;P&gt;以下是撰寫的步驟&lt;/P&gt;
&lt;P&gt;假設要撰寫的是一個資料庫DDMO中的資料表(TDMOMenu)的資料存取元件，要產生一個元件服務中的Package名稱為【KDMO1000】，裡面有個元件PDMOMenu.dll內有兩個COM+元件分別是&lt;BR&gt;Project.Class&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;PDMOMenu.CDMOMenu1(無Transaction)：用以讀取資料 
&lt;LI&gt;PDMOMenu.CDMOMenu2(有Transaction)：用以維護資料&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;撰寫步驟：&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;建專案：&lt;BR&gt;&lt;TEXTAREA class=xml style="WIDTH: 619px; HEIGHT: 100px" name=code rows=6 cols=73&gt; 1.請在適當的目錄下，建立您元件專案的目錄【PDMOMenu】 

 2.建立專案(Create Project),選擇【類別庫(Class Library)】，目錄請設定為您專案的目錄，Name設定為【PDMOMenu】 

 3.方案總管(Solution Explorer)中點選Class1.vb，變更屬性(Properties)中的檔名(File Name)為【CDMOMenu1.vb】(無TranSaction)，【CDMOMenu2.vb】(有Transaction) 

 4.參考(Reference)右鍵→加入參考，增加【System.EnterpriseServices】 

  

 →步驟二 &lt;/TEXTAREA&gt; 
&lt;LI&gt;專案內容：&lt;BR&gt;&lt;TEXTAREA class=xml style="WIDTH: 615px; HEIGHT: 100px" name=code rows=6 cols=72&gt; 1.點選專案(Project)右鍵→屬性(Properties) 

 2.點選【簽署(Signing)】，勾選【簽署組件】 

   在選擇強勢名稱金鑰檔(Choose a strong name key file): 
   選擇新增(New)→輸入【PDMOMenu】 

 3.點選【應用程式(Application)】 
   檢查【組件名稱(Assembly Name)】、【根命名空間(Root NameSpace)】是否是【PDMOMenu】 

 **4.按【組件資訊】，將【讓組件成為COM-Visiable(Make assembly COM-Visiable)】打勾 
  

 →步驟三 &lt;/TEXTAREA&gt; 
&lt;LI&gt;AssemblyInfo.vb：&lt;BR&gt;&lt;TEXTAREA class=xml style="WIDTH: 614px; HEIGHT: 100px" name=code rows=6 cols=72&gt;1.請在最上方Imports加入：
Imports System.EnterpriseServices

2.請在最下方加入以下指令：
&amp;lt;Assembly: ApplicationName("KDMO1000")&amp;gt; '*設定元件服務的專案名稱  
&amp;lt;Assembly: ApplicationAccessControl(False)&amp;gt;  
&amp;lt;Assembly: ApplicationActivation(ActivationOption.Server)&amp;gt;  
  &lt;/TEXTAREA&gt; 
&lt;LI&gt;Class&amp;nbsp;內容：&lt;BR&gt;無Transaction Class(CDMOMenu1.vb)：&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 613px; HEIGHT: 100px" name=code rows=6 cols=72&gt;Imports System.EnterpriseServices
Imports System.Runtime.InteropServices
Imports System.Data.SqlClient
Imports System.Data
Imports System.IO

'Guid請在元件第一次建立時，產生新的，之後修改時不必變更
&amp;lt;Guid("838A5FE4-2DCC-43DF-8658-0697E8FB7C0F"), _
EventTrackingEnabled(True)&amp;gt; _
Public Class CDMOMenu1

    Inherits ServicedComponent
    Const DBName as String = "DDMO"   



    Public Function Test1(ByVal In1() As String, ByVal Out1() As String, ByRef P As String, ByRef R As String, ByVal User As String) As String
        '*************************************************************************
        '**     撰寫者：topcat             撰寫日期：2006/8/9
        '**     用途：  1.
        '**     做法：
        '**             1.
        '**     注意事項：
        '**             1.
        '**             2.
        '**     維護記錄：
        '**         維護者：姓名             維護日期：日期
        '**         維護項目：
        '**                 1.
        '**                 2.
        '**         做法：  1.
        '**                 2.
        '**         注意事項：
        '**                 1.
        '*************************************************************************

        Dim ConnStr As String = GetConnStr(DBName)

        Try

            Test1 = "Success"

        Catch ex As Exception
            Test1 = "False"
            Throw New Exception(ex.Message)

        Finally


        End Try
    End Function

    Public Function GetConnStr(ByVal DBName As String) As String
        '*************************************************************************
        '**     撰寫者：topcat     撰寫日期：2006/2/8
        '**     用途：  1.讀取Connection String的方式
        '**     做法：
        '**             1.傳入參數DataBase Name DBName
        '**             2.透過Stream將文字檔讀出
        '**             3.將取得的資料傳回
        '**             4.關閉相關物件
        '**     注意事項：
        '**             1.
        '**             2.
        '**     維護記錄：
        '**         維護者：姓名(員工代號)     維護日期：日期
        '**         維護項目：
        '**                 1.
        '**                 2.
        '**         做法：  1.
        '**                 2.
        '**         注意事項：
        '**                 1.
        '*************************************************************************

        Dim StrmRd As New StreamReader("C:\DataLink\" + DBName + ".ini")
        Dim Line As String = ""
        Dim ConnStr As String = ""
        Try
            Do
                Line = StrmRd.ReadLine()
                If Line &amp;lt;&amp;gt; "" Then
                    ConnStr += Line
                End If
            Loop Until Line Is Nothing
            GetConnStr = ConnStr

        Catch ex As Exception
            Throw New Exception(ex.Message.ToString)

        Finally
            StrmRd.Close()
            StrmRd.Dispose()
            StrmRd = Nothing

        End Try
    End Function
End Class&lt;/TEXTAREA&gt;&lt;BR&gt;有Transaction Class(CDMOMenu2.vb)：&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 611px; HEIGHT: 100px" name=code rows=6 cols=72&gt;Imports System.EnterpriseServices
Imports System.Runtime.InteropServices
Imports System.Data.SqlClient
Imports System.Data
Imports System.IO


&amp;lt;Guid("28549732-9A0F-4731-9688-10CEE644500E") _
, Transaction(TransactionOption.Required) _
, Synchronization(SynchronizationOption.Required) _
, JustInTimeActivation(True) _
, EventTrackingEnabled(True)&amp;gt; _
Public Class CDMOMenu2
    Inherits ServicedComponent

    Const DBName as String = "DDMO"   


    &amp;lt;AutoComplete()&amp;gt; _
    Public Function Test2(ByVal In1() As String, ByVal Out1() As String, ByRef P As String, ByRef R As String, ByVal User As String) As String
        '*************************************************************************
        '**     撰寫者：topcat             撰寫日期：2006/8/9
        '**     用途：  1.
        '**     做法：
        '**             1.
        '**     注意事項：
        '**             1.
        '**             2.
        '**     維護記錄：
        '**         維護者：姓名(員工代號)     維護日期：日期
        '**         維護項目：
        '**                 1.
        '**                 2.
        '**         做法：  1.
        '**                 2.
        '**         注意事項：
        '**                 1.
        '*************************************************************************

        Dim ConnStr As String = GetConnStr(DBName)

        Try


            Test2 = "Success"
        Catch ex As Exception
            Test2 = "False"
            Throw New Exception(ex.Message)

        Finally

        End Try
    End Function

    Public Function GetConnStr(ByVal DBName As String) As String
        '*************************************************************************
        '**     撰寫者：topcat     撰寫日期：2006/2/8
        '**     用途：  1.讀取Connection String的方式
        '**     做法：
        '**             1.傳入參數DataBase Name DBName
        '**             2.透過Stream將文字檔讀出
        '**             3.將取得的資料傳回
        '**             4.關閉相關物件
        '**     注意事項：
        '**             1.
        '**             2.
        '**     維護記錄：
        '**         維護者：姓名(員工代號)     維護日期：日期
        '**         維護項目：
        '**                 1.
        '**                 2.
        '**         做法：  1.
        '**                 2.
        '**         注意事項：
        '**                 1.
        '*************************************************************************

        Dim StrmRd As New StreamReader("C:\DataLink\" + DBName + ".ini")
        Dim Line As String = ""
        Dim ConnStr As String = ""
        Try
            Do
                Line = StrmRd.ReadLine()
                If Line &amp;lt;&amp;gt; "" Then
                    ConnStr += Line
                End If
            Loop Until Line Is Nothing
            GetConnStr = ConnStr

        Catch ex As Exception
            Throw New Exception(ex.Message.ToString)

        Finally
            StrmRd.Close()
            StrmRd.Dispose()
            StrmRd = Nothing

        End Try
    End Function

End Class&lt;/TEXTAREA&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;撰寫完相關的程式後，接著就是Build專案，然後就會依照Project的Property設定的位置產生dll&lt;/P&gt;
&lt;P&gt;
&lt;HR&gt;
&lt;/P&gt;
&lt;P&gt;補充，感謝網友小魔告知內容有誤，把取得資料庫連線的Function補上&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;說明：&lt;/P&gt;
&lt;P&gt;存取資料會透過ConnString的設定來指定要存取的是哪台Server上的哪個資料庫，使用驗證方式是用什麼方式。如果ConnString寫在元件內，那麼當Server的位址改變、甚至資料庫名稱改變，那麼就必須把元件的程式一個個叫出來修改，然後再編譯註冊，這樣的過程太過繁複&lt;/P&gt;
&lt;P&gt;那麼怎麼把ConnString的設定抽離元件，小喵的做法是建立一個.ini的文字檔，放在C:\DataLink，裡面就放著ConnString的內容，然後在元件中透過System.IO讀取該文字檔的內容。&lt;/P&gt;
&lt;P&gt;如此一來，未來資料庫有異動(位置、名稱)，就可以不需要改寫元件，直接修改設定檔即可。&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/35629.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>N-Tiers開發方式(為何使用COM+元件的撰寫商業邏輯層)</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35628.aspx</link><pubDate>Wed, 09 Aug 2006 16:00:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35628.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/35628.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35628.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/35628.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/35628.aspx</trackback:ping><description>&lt;P&gt;在上一篇&lt;A id=_ef60b7bc5af60fef_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl0_TitleUrl href="/topcat/archive/2006/08/09/35627.aspx"&gt;N-Tier方式開發(系統分析)&lt;/A&gt; 提到了商業邏輯層的開發，為何會選用COM+來處理，主要有兩個原因：&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;確保交易的完整性：可交由COM+支援Transaction的機制處理 
&lt;LI&gt;Web App切換身分執行元件&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;一、確保交易的完整性：&lt;/P&gt;
&lt;P&gt;在確保交易的完整性，可以透過COM+對於Transaction的支援，讓拆解各功能的時候，不必特意的去考量Transation異動的部份，可交由COM+來處理&lt;/P&gt;
&lt;P&gt;當一個商業邏輯中有了資料的維護，在邏輯的過程中可能會維護了超過兩個以上的資料表在不同的功能上。&lt;/P&gt;
&lt;P&gt;舉個例子來說，例如：產生交易資料、扣除在庫資料，如果將這兩個動作處理在兩個元件上，我們分別稱作【COMA(產生交易資料)】與【COMB(扣除在庫資料)】，將此兩個動作分別放在不同的元件上，可以讓其他的功能來呼叫，而兩個動作，又必須完整的完成了，才能夠算是一個成功的交易過程，如果COMA或者COMB的程式運作過程中，有了什麼狀況(例如無在庫資料，無法扣除時)，那麼在這過程中維護的資料必須還原→此時這樣的還原動作可交給COM+自動完成&lt;/P&gt;
&lt;P&gt;假設COMA中需要維護4個資料表，而COMB需要維護3個資料表，程式流程是&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=xml style="WIDTH: 671px; HEIGHT: 100px" name=code rows=6 cols=79&gt;COMA                       COMB
TBLA1--TBLA2--TBLA3-----→TBLB1--TBLB2--TBLB3┐
              TBLB4←------------------------┘  &lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;在COMA執行的過程中，維護了3個資料表(A1、A2、A3)時，呼叫COMB又維護了兩個(B1、B2)&lt;BR&gt;此時要維護B3時出了問題，那嚜剛剛維護的(A1、A2、A3、B1、B2)資料通通要還原&lt;/P&gt;
&lt;P&gt;只需將COMA與COMB包在一個交易中，那麼當過程中有其中一個失敗了，就會還原回去&lt;/P&gt;
&lt;P&gt;如果又有另外一個元件COMC也會呼叫COMB的相同Function，那麼也只需將COMC與COMB包成一個交易，那麼就能夠當有問題的時候也自動還原回去&lt;/P&gt;
&lt;P&gt;二、Web App切換身分執行元件&lt;/P&gt;
&lt;P&gt;在Web App運作的過程中，透過IIS來使用應用程式，主要是透過【IUSER】這樣的使用者來運作，而IUSER這樣的使用者基本上在權限上是限制很多的，因此如果要存取非IIS的資料夾、存取資料庫，都不適合將權限開放給IUSER來使用，以免網路上的駭客透過IUSER竄進來做一些壞事。&lt;/P&gt;
&lt;P&gt;然而系統又有時候必須讓Web的使用者在Server上執行一些特別的功能(例如資料庫的存取)，此時就可以透過COM+的Package來設定特別的識別帳號，然後開放這樣的帳號相關資料表的權限。這樣就能夠更靈活的設計我們的程式&lt;/P&gt;
&lt;P&gt;三、介面與商業邏輯分離→資料庫轉換介面層可沿用&lt;/P&gt;
&lt;P&gt;當介面與商業邏輯分離時，在ASP.NET中所設計的與資料庫之間的溝通是透過商業邏輯的元件，只需要元件的名稱不變、呼叫的函數不變、傳遞的參數不變，那麼假使要轉換不同的資料庫(例如Access轉成SQL)，介面層的相關程式都不需要修改，只需要修改商業邏輯的元件即可。&lt;/P&gt;
&lt;P&gt;更進一步的，如果商業邏輯層中，把商業邏輯運算與資料庫存取也分開了，那麼要轉換資料庫的時候，也只需要把資料庫存取的相關元件修改後，就能夠快速的切換過去，不需要修改商業邏輯的運算部分。這讓整體系統在未來的擴充、轉換上有更大的彈性。&lt;/P&gt;
&lt;P&gt;因為有這樣的特性，所以小喵才會以COM+元件來當作商業邏輯的開發。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/35628.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>N-Tier開發方式(系統分析)</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35627.aspx</link><pubDate>Wed, 09 Aug 2006 15:25:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35627.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/35627.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/08/09/35627.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/35627.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/35627.aspx</trackback:ping><description>&lt;P&gt;當小喵在開發一個較為大型的系統時，會做以下的分析過程&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;系統需求分析： 
&lt;OL&gt;
&lt;LI&gt;與使用者詳談，訪問使用者須要的是什麼 
&lt;LI&gt;條列需求：將訪談後的需求加以整理，並加以條列 
&lt;LI&gt;需求確認：將整理條列出的需求，給使用者逐條加以確認，如有不足，追加並確認之&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;功能分析： 
&lt;OL&gt;
&lt;LI&gt;條列功能：將使用者以確認之條列需求，轉換為系統功能並條列之 
&lt;LI&gt;功能、需求確認：將條列之功能與條列之需求逐一比對，確認使用者需求都有滿足 
&lt;LI&gt;功能整併：將條列之功能，有類似、相關之功能，加以整併→合併撰寫 
&lt;LI&gt;功能歸類：將條列之功能，加以分類整理 
&lt;LI&gt;需求、功能再確認：將整併、歸類之功能，與需求再次確認，務必滿足每一個需求。&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;資料分析： 
&lt;OL&gt;
&lt;LI&gt;依據各需求所需的資料欄位、型態、加以條列 
&lt;LI&gt;正規化資料：依據正規劃原則，將條列的欄位、型態、加以分類並正規劃 
&lt;LI&gt;資料庫設計：依據結論，設計資料庫、資料表、欄位、型態、關聯等&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;畫面功能分析： 
&lt;OL&gt;
&lt;LI&gt;畫面規劃：依據需求分析與功能分析結果，規劃使用介面，畫面欄位、按鈕 
&lt;LI&gt;功能樹狀圖、網頁地圖：依據各功能分類與畫面，歸類相關功能，做出畫面分類樹狀圖、網頁地圖 
&lt;LI&gt;使用者再確認：依照功能樹狀圖、網頁地圖，在此與使用者討論，並依照需求條列逐一比對各需求與畫面關係→依使用者需求修改→再確認。直到確認無誤。&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;程式與撰寫規劃： 
&lt;OL&gt;
&lt;LI&gt;依照【畫面分析】、【資料分析】、【功能分析】規劃出各相關程式於N-Tiers中 
&lt;OL&gt;
&lt;LI&gt;畫面分析：介面層，處理各功能的介面、資料存取的介面 
&lt;LI&gt;資料分析：資料層，處理資料庫的存取 
&lt;LI&gt;功能分析：商業邏輯層，處理各功能所需運算、資料交換，並與介面曾、資料曾溝通&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;程式命名、Function命名、參數命名： 
&lt;OL&gt;
&lt;LI&gt;依據介面層、資料層、商業邏輯層條列出各程式名稱、Function名稱、以及所需傳遞的參數、型態名稱 
&lt;LI&gt;各程式間的相互關係，並做出各程式間的相互關係圖&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;程式分配：依現有人力狀況，分組並分派相關人員各程式，並條列出各程式的時程規劃於各組Leader，由各組Leader安排程式完成時程 
&lt;LI&gt;依據程式分配與時程，安排交叉測試時程&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;在這樣的分析過程中，分析完後的各程式可交由多人共同完成，只需將定義好的資料庫狀況、欄位、以及所需撰寫的程式名稱、參數說明給各分配到的程式設計師，就可開始分工的撰寫程式&lt;/P&gt;
&lt;P&gt;其中介面層，小喵多數以Web作為介面，應用ASP/ASP.NET來開發；商業邏輯層、資料庫層則是透過COM+的元件來處理。&lt;/P&gt;
&lt;P&gt;而介面層與商業邏輯層如何將之串聯起來呢，主要是透過以下的這樣方式來做&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=xml style="WIDTH: 685px; HEIGHT: 100px" name=code rows=6 cols=81&gt;ASP.NET--------------------------------COM+-----------------------------MS-SQL
Controls--ObjectDataSource------COM+元件------COM+元件-----------COM+元件--資料庫
(       介面層              )     (     商業邏輯層       )           (    資料層     )&lt;/TEXTAREA&gt;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/35627.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>COM+安裝過Crystal Report8後無法註冊元件處理方式</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/04/13/21447.aspx</link><pubDate>Thu, 13 Apr 2006 08:25:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/04/13/21447.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/21447.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/04/13/21447.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/21447.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/21447.aspx</trackback:ping><description>&lt;P&gt;小喵最近遇到的狀況：&lt;BR&gt;安裝新主機時，在安裝元件(COM+)的時候，卻發生無法註冊的窘況，尋找一下KM發現&lt;/P&gt;
&lt;P&gt;原來是因為安裝過Crystal Report8以後，就會發生這樣的問題&lt;/P&gt;
&lt;P&gt;處理方式：安裝修正程式即可(&lt;A href="http://support.crystaldecisions.net/communitycs/filesandupdates/scr8_webregfix.exe"&gt;http://support.crystaldecisions.net/communitycs/filesandupdates/scr8_webregfix.exe&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;相關訊息網址如下：&lt;/P&gt;
&lt;P&gt;&lt;A href="http://support.microsoft.com/default.aspx/kb/266621/"&gt;http://support.microsoft.com/default.aspx/kb/266621/&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/21447.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>N-Tiers使用ObjectDataSouce如何自己處理中間層傳回的錯誤訊息</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/04/11/21114.aspx</link><pubDate>Tue, 11 Apr 2006 11:18:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/04/11/21114.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/21114.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/04/11/21114.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/21114.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/21114.aspx</trackback:ping><description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;使用ObjectDataSouce可以讓ASP.NET透過Object中的Function與中間層(商業邏輯)的程式做溝通&lt;BR&gt;但是在中間層中可能有些自訂的錯誤會產生&lt;BR&gt;我們希望自己處理這些的錯誤訊息，並且把這個訊息安排在畫面中的Label顯示&lt;BR&gt;這應該怎麼做呢&lt;/P&gt;
&lt;P&gt;假設要處理的是ObjectDataSource的Update時，啟動商業邏輯的元件，該元件傳回一個錯誤訊息&lt;BR&gt;此時在Object中的Try...Catch中，傳回的訊息就使用Throw&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb name=code rows=6 cols=50&gt;        Catch ex As Exception
            Throw &lt;/TEXTAREA&gt;&lt;BR&gt;接著就是在ObjectDataSouce1物件中的事件Updated來處理&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb name=code rows=6 cols=50&gt;    Protected Sub ObjectDataSource1_Updated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs) Handles ObjectDataSource1.Updated
        If Not (e.Exception Is Nothing) Then
            Me.lblMessage.Text = e.Exception.InnerException.Message.ToString
            e.ExceptionHandled = True
        End If
    End Sub
&lt;/TEXTAREA&gt;&lt;BR&gt;這樣就可以自己處理相關的錯誤訊息了&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/21114.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>解決Windows2003使用Transaction無法使用MSDTC設定</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/03/07/18865.aspx</link><pubDate>Tue, 07 Mar 2006 15:57:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/03/07/18865.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/18865.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/03/07/18865.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/18865.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/18865.aspx</trackback:ping><description>&lt;P&gt;小喵第一次使用Windows2003當作Web與COM+，卻發生了在維護資料的時候，出現了【&lt;EM&gt;&lt;FONT color=#0000ff&gt;交易已被隱含或明確地認可或中止&lt;/FONT&gt;&lt;/EM&gt;】的訊息。由於與資料庫(Windows2000)不同台，經過網路上搜尋相關的問題，找到大約與&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;MSDTC&lt;/FONT&gt;&lt;/STRONG&gt;的設定有關&lt;/P&gt;
&lt;P&gt;由於Windows2003或者WindowsXp中的COM+版本為1.5&lt;BR&gt;在使用跨機器的Transaction時，會出現【&lt;EM&gt;&lt;STRONG&gt;交易已被隱含或明確地認可或中止&lt;/STRONG&gt;&lt;/EM&gt;】&lt;/P&gt;
&lt;P&gt;解決方式，如下&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;開啟元件服務 
&lt;LI&gt;本機電腦右鍵→內容→MSDTC 
&lt;LI&gt;安全性設定(此項目為COM+1.5版才有的設定) 
&lt;LI&gt;交易管理通訊中設定如下 
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;允許輸入&lt;/FONT&gt;&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;允許輸出&lt;/FONT&gt;&lt;/STRONG&gt; 
&lt;LI&gt;要求相互驗證→改為【&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;要求對連入呼叫者驗證&lt;/FONT&gt;&lt;/STRONG&gt;】&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;確認後MSDTS服務會停止後重新啟動，就可以維護遠端的資料庫了&lt;/P&gt;
&lt;P&gt;^_^a&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/18865.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>ASP.NET2.0 多層架構的資料溝通介面Object DataSouce</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/02/20/17943.aspx</link><pubDate>Mon, 20 Feb 2006 13:00:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/02/20/17943.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/17943.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/02/20/17943.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/17943.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/17943.aspx</trackback:ping><description>&lt;P&gt;當我們設計多層式的Web應用系統時，資料的存取不在是直接透過sqlDataSouce來處理，而是透過中間層(商業邏輯層)的Web Service或者是Com+元件來處理&lt;/P&gt;
&lt;P&gt;以往要寫這樣的方式，必須撰寫許多的程式，才能夠實現這樣的架構，而新的ASP.NET 2增加了一個新的Web Control→Object DataSource，可以讓我們寫粉簡短的程式，就能夠做到類似sqlDataSouce的功能，將新增、修改、刪除、查詢包成物件中的方法&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;建立物件Object&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;首先，必須將透過中間層的元件的新增修改刪除查詢的動作，包裝成為ASP.NET的物件，這樣Object DataSource才能夠使用物件的方式來達到目的方式步驟如下&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;新增一個Class.vb的項目：新增一個與您資料庫溝通的物件，假設名稱為MenuIfno.vb 
&lt;LI&gt;為這個物件建立查詢、新增、修改、刪除的Function，Function的內容就是呼叫您所撰寫的中間層元件(COM+,WebService)，其中查詢的Function必須傳回DataSet或者DataReader，不過由於DataReader必須在讀取的過程中將Connection持續的連接，再此建議大家回傳DataSet 
&lt;LI&gt;假設我已經撰寫好的查詢、修改Function如下 
&lt;OL&gt;
&lt;LI&gt;GetMenuAll()：傳回所有資料表 
&lt;LI&gt;GetMenu(NodeId)：傳回某一筆資料，NodeId為Key值 
&lt;LI&gt;UpdateMenu(NodeId,ParentId,sText,sValue,.....)更新資料&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;Object DataSource設定&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;接著就是Object DataSouce的設定方式與步驟如下：&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;從控制項中拉除一個sqlDataSource1，透過Smart Tag中的Configure Data Source設定sqlDataSource 
&lt;LI&gt;在Choose your business object中，就可以下拉看到您剛剛所建立的物件【MenuInfo】→Next 
&lt;LI&gt;接著，可以看到有四個頁箋(SELECT,UPDATE,INSERT,DELETE)，可以根據需求，進入各頁箋，選擇所要的Function 
&lt;LI&gt;例如目前要的是一個顯示全部資料的動作，所以就選擇了SELECT對應到GetAllMenu 
&lt;LI&gt;按下Finish就完成了設定&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;資料瀏覽GridView&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;接著就建立一個GridView,並且把DataSource設定為剛剛所建立的object DataSource1,接著直接執行就可以將資料表中的資料顯示出來。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;Detail View單筆資料修改刪除&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;接著我們希望能夠設計一個Detail View將剛剛的Grid View點選的資料顯示在Detail View中作單筆的修改、刪除動作。所以我們將剛剛建立的GridView透過Smart Tag設定Enabled Select Mode。 
&lt;LI&gt;接著建立第二個ObjectDataSource2給Detail View，設定頁箋如下： 
&lt;OL&gt;
&lt;LI&gt;SELECT：GetMenu(NodeId) 
&lt;LI&gt;UPDATE：UpdateMenu(NodeId,ParentId,sText,....) 
&lt;LI&gt;DELETE：DelMenu(NodeId)&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;接著由於SELECT的時候有個參數NodeId，需要設定該參數的來源： 
&lt;OL&gt;
&lt;LI&gt;在Paramenter Source設定為Conrtrol 
&lt;LI&gt;ControlID下拉可以選擇剛剛建立的GridView 
&lt;LI&gt;接著按下Finish建立好該ObjectDataSouce2&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;點選Object DataSource2設定他的屬性【UpdateParameters】： 
&lt;OL&gt;
&lt;LI&gt;點選...進入設定的畫面中 
&lt;LI&gt;選擇NodeId 
&lt;LI&gt;設定Parameter Source為Control 
&lt;LI&gt;設定ControlID為GridView1&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;再來拉出Detail View控制項，將該控制項的DataSource設定為Object DataSource2 
&lt;LI&gt;點選DataView並且設定屬性視窗中找到【DataKeyNames】設定主索引為【NodeId】&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;接著來看看這樣設定的結果，點選某筆資料，就可以在DetailView中顯示該筆資料的內容，並且可以點選編輯，來修改該筆的資料，可以讓我們在撰寫最少的程式下，輕鬆的完成多筆查詢、單筆維護的畫面設計。&lt;/P&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/17943.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>