N-Tiers开发方式(如何使用VB.NET撰写COM+组件)
小喵撰写COM+组件开始于VB6的年代,撰写与注册的方式还算不是很复杂,不过随着进入了.NET的世界,撰写的过程也变得比较复杂了许多。
以下是撰写的步骤
假设要撰写的是一个数据库DDMO中的数据表(TDMOMenu)的数据存取组件,要产生一个组件服务中的Package名称为【KDMO1000】,里面有个组件PDMOMenu.dll内有两个COM+组件分别是
Project.Class
- PDMOMenu.CDMOMenu1(无Transaction):用以读取数据
- PDMOMenu.CDMOMenu2(有Transaction):用以维护数据
撰写步骤:
- 建专案:
- 请在适当的目录下,建立您组件项目的目录【PDMOMenu】
- 建立项目(Create Project),选择【类别库(Class Library)】,目录请设定为您项目的目录,Name设定为【PDMOMenu】
- 方案总管(Solution Explorer)中点选Class1.vb,变更属性(Properties)中的檔名(File Name)为【CDMOMenu1.vb】(无TranSaction),【CDMOMenu2.vb】(有Transaction)
- 参考(Reference)右键→加入参考,增加【System.EnterpriseServices】
- 项目内容:
- 点选项目(Project)右键→属性(Properties)
- 点选【签署(Signing)】,勾选【签署组件】
- 在选择强势名称密钥档(Choose a strong name key file):
- 选择新增(New)→输入【PDMOMenu】
- 点选【应用程序(Application)】
检查【组件名称(Assembly Name)】、【根命名空间(Root NameSpace)】是否是【PDMOMenu】 - 按【组件信息】,将【让组件成为COM-Visiable(Make assembly COM-Visiable)】打勾
- AssemblyInfo.vb:
- 请在最上方Imports加入:
Imports System.EnterpriseServices - 请在最下方加入以下指令:
<Assembly: ApplicationName("KDMO1000")> '*设定组件服务的项目名称
<Assembly: ApplicationAccessControl(False)>
<Assembly: ApplicationActivation(ActivationOption.Server)>
- 请在最上方Imports加入:
- Class 内容:
- 无Transaction Class(CDMOMenu1.vb):
Imports System.EnterpriseServices Imports System.Runtime.InteropServices Imports System.Data.SqlClient Imports System.Data Imports System.IO 'Guid请在组件第一次建立时,产生新的,之后修改时不必变更 "838A5FE4-2DCC-43DF-8658-0697E8FB7C0F"), _ EventTrackingEnabled(True)> _ 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) Using Conn As New SqlConnection(ConnStr) Try Test1 = "Success" Catch ex As Exception Test1 = "False" Throw New Exception(ex.Message) End Try End Using 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 <> "" 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 "28549732-9A0F-4731-9688-10CEE644500E") _ , Transaction(TransactionOption.Required) _ , Synchronization(SynchronizationOption.Required) _ , JustInTimeActivation(True) _ , EventTrackingEnabled(True)> _ Public Class CDMOMenu2 Inherits ServicedComponent Const DBName as String = "DDMO" _ 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) Using Conn As New SqlConnection(ConnStr) Try Test2 = "Success" Catch ex As Exception Test2 = "False" Throw New Exception(ex.Message) End Try End Using 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 <> "" 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(CDMOMenu1.vb):
撰写完相关的程序后,接着就是Build项目,然后就会依照Project的Property设定的位置产生dll