摘要:N-Tiers開發方式(如何使用VB.NET撰寫COM+元件)
小喵撰寫COM+元件開始於VB6的年代,撰寫與註冊的方式還算不是很複雜,不過隨著進入了.NET的世界,撰寫的過程也變得比較複雜了許多。
以下是撰寫的步驟
假設要撰寫的是一個資料庫DDMO中的資料表(TDMOMenu)的資料存取元件,要產生一個元件服務中的Package名稱為【KDMO1000】,裡面有個元件PDMOMenu.dll內有兩個COM+元件分別是
Project.Class
- PDMOMenu.CDMOMenu1(無Transaction):用以讀取資料
- 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.請在適當的目錄下,建立您元件專案的目錄【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】
→步驟二 - 專案內容:
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)】打勾 →步驟三
- AssemblyInfo.vb:
1.請在最上方Imports加入: Imports System.EnterpriseServices 2.請在最下方加入以下指令: <Assembly: ApplicationName("KDMO1000")> '*設定元件服務的專案名稱 <Assembly: ApplicationAccessControl(False)> <Assembly: ApplicationActivation(ActivationOption.Server)>
- Class 內容:
無Transaction Class(CDMOMenu1.vb):
有Transaction Class(CDMOMenu2.vb):
撰寫完相關的程式後,接著就是Build專案,然後就會依照Project的Property設定的位置產生dll
補充,感謝網友小魔告知內容有誤,把取得資料庫連線的Function補上
說明:
存取資料會透過ConnString的設定來指定要存取的是哪台Server上的哪個資料庫,使用驗證方式是用什麼方式。如果ConnString寫在元件內,那麼當Server的位址改變、甚至資料庫名稱改變,那麼就必須把元件的程式一個個叫出來修改,然後再編譯註冊,這樣的過程太過繁複
那麼怎麼把ConnString的設定抽離元件,小喵的做法是建立一個.ini的文字檔,放在C:\DataLink,裡面就放著ConnString的內容,然後在元件中透過System.IO讀取該文字檔的內容。
如此一來,未來資料庫有異動(位置、名稱),就可以不需要改寫元件,直接修改設定檔即可。
以下是簽名:
- 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
- 小喵大部分的文章會以小喵熟悉的語言VB.NET撰寫,如果您需要C#的Code,也許您可以試著用線上的工具進行轉換,這裡提供幾個參考
Microsoft MVP Visual Studio and Development Technologies (2005~2019/6) | topcat Blog:http://www.dotblogs.com.tw/topcat |