小喵撰寫COM+元件開始於VB6的年代,撰寫與註冊的方式還算不是很複雜,不過隨著進入了.NET的世界,撰寫的過程也變得比較複雜了許多。
以下是撰寫的步驟
假設要撰寫的是一個資料庫DDMO中的資料表(TDMOMenu)的資料存取元件,要產生一個元件服務中的Package名稱為【KDMO1000】,裡面有個元件PDMOMenu.dll內有兩個COM+元件分別是
Project.Class
- PDMOMenu.CDMOMenu1(無Transaction):用以讀取資料
- PDMOMenu.CDMOMenu2(有Transaction):用以維護資料
撰寫步驟:
- 建專案:
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】
→步驟二
- 專案內容:
- AssemblyInfo.vb:
| 1.請在最上方Imports加入: Imports System.EnterpriseServices 2.請在最下方加入以下指令: <Assembly: ApplicationName("KDMO1000")> '*設定元件服務的專案名稱 <Assembly: ApplicationAccessControl(False)> <Assembly: ApplicationActivation(ActivationOption.Server)> |
- Class 內容:
無Transaction Class(CDMOMenu1.vb):
Imports System.EnterpriseServices
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
-
有Transaction Class(CDMOMenu2.vb):
Imports System.EnterpriseServices
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
撰寫完相關的程式後,接著就是Build專案,然後就會依照Project的Property設定的位置產生dll
補充,感謝網友小魔告知內容有誤,把取得資料庫連線的Function補上
說明:
存取資料會透過ConnString的設定來指定要存取的是哪台Server上的哪個資料庫,使用驗證方式是用什麼方式。如果ConnString寫在元件內,那麼當Server的位址改變、甚至資料庫名稱改變,那麼就必須把元件的程式一個個叫出來修改,然後再編譯註冊,這樣的過程太過繁複
那麼怎麼把ConnString的設定抽離元件,小喵的做法是建立一個.ini的文字檔,放在C:\DataLink,裡面就放著ConnString的內容,然後在元件中透過System.IO讀取該文字檔的內容。
如此一來,未來資料庫有異動(位置、名稱),就可以不需要改寫元件,直接修改設定檔即可。
