N-Tiers開發方式(如何使用VB.NET撰寫COM+元件)

摘要:N-Tiers開發方式(如何使用VB.NET撰寫COM+元件)

小喵撰寫COM+元件開始於VB6的年代,撰寫與註冊的方式還算不是很複雜,不過隨著進入了.NET的世界,撰寫的過程也變得比較複雜了許多。

以下是撰寫的步驟

假設要撰寫的是一個資料庫DDMO中的資料表(TDMOMenu)的資料存取元件,要產生一個元件服務中的Package名稱為【KDMO1000】,裡面有個元件PDMOMenu.dll內有兩個COM+元件分別是
Project.Class

  1. PDMOMenu.CDMOMenu1(無Transaction):用以讀取資料
  2. PDMOMenu.CDMOMenu2(有Transaction):用以維護資料

撰寫步驟:


Imports System.Runtime.InteropServices
Imports System.Data.SqlClient
Imports System.Data
Imports System.IO


<Guid("245222C2-751F-4856-BFB0-93841010D720"), _
EventTrackingEnabled(True)> _
Public Class CDMODEMO1

    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 RUser As String) As String
        '*************************************************************************
        '**     撰寫者:topcat(topcat)     撰寫日期:2008/7/23
        '**     用途:  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(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 <> "" 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

Imports System.Runtime.InteropServices
Imports System.Data.SqlClient
Imports System.Data
Imports System.IO


<Guid("24115997-2104-4773-AD5C-6409464CF08F") _
, Transaction(TransactionOption.Required) _
, Synchronization(SynchronizationOption.Required) _
, JustInTimeActivation(True) _
, EventTrackingEnabled(True)> _
Public Class CDMODEMO2
    Inherits ServicedComponent

    Const DBName as String = "DDMO"   


    <AutoComplete()> _
    Public Function Test2(ByVal In1() As String, ByVal Out1() As String, ByRef P As String, ByRef R As String, ByVal RUser As String) As String
        '*************************************************************************
        '**     撰寫者:topcat(topcat)     撰寫日期:2008/7/23
        '**     用途:  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(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 <> "" 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
  1. 建專案:
     
    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】  

      

    →步驟二
  2. 專案內容:
    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)】打勾
    →步驟三

     

  3. AssemblyInfo.vb:
    1.請在最上方Imports加入:
    Imports System.EnterpriseServices
    
    2.請在最下方加入以下指令:
    <Assembly: ApplicationName("KDMO1000")> '*設定元件服務的專案名稱
    <Assembly: ApplicationAccessControl(False)>
    <Assembly: ApplicationActivation(ActivationOption.Server)>

     

  4. Class 內容:
    無Transaction Class(CDMOMenu1.vb):

  5. 有Transaction Class(CDMOMenu2.vb):

撰寫完相關的程式後,接著就是Build專案,然後就會依照Project的Property設定的位置產生dll

 


 

補充,感謝網友小魔告知內容有誤,把取得資料庫連線的Function補上
 

說明:

存取資料會透過ConnString的設定來指定要存取的是哪台Server上的哪個資料庫,使用驗證方式是用什麼方式。如果ConnString寫在元件內,那麼當Server的位址改變、甚至資料庫名稱改變,那麼就必須把元件的程式一個個叫出來修改,然後再編譯註冊,這樣的過程太過繁複

那麼怎麼把ConnString的設定抽離元件,小喵的做法是建立一個.ini的文字檔,放在C:\DataLink,裡面就放著ConnString的內容,然後在元件中透過System.IO讀取該文字檔的內容。

如此一來,未來資料庫有異動(位置、名稱),就可以不需要改寫元件,直接修改設定檔即可。

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat