COM+ Components Microsoft Transaction Server (MTS) components and COM+ services are used in the majority of Visual Basic 6.0 business applications. Normally COM+ applications can be classified as server or library applications. The Microsoft .NET Framework exposes all the existing COM+ services to Visual Basic .NET applications. Thus Visual Basic .NET supports COM+ services. However, the way that the COM+ services are used by Visual Basic .NET applications is different from the way they are used in Visual Basic 6.0 applications. The Microsoft .NET Framework provides the namespace System.EnterpriseServices . This namespace provides all the classes that provide COM+ services to .NET applications. Code Examples Let us create a COM+ component in Visual Basic 6.0 and use it in a client Visual Basic 6.0 application. The class DatabaseClass has one method called PerformOperations . In this method two string parameters are passed. These strings basically contain SQL update queries. If one of them fails, the entire transaction is rolled back. The following code is in the MyComPlus folder for this chapter: Public Sub PerformOperations(strCommand1 As String,_ strCommand2 As String) Dim objContext As ObjectContext Set objContext = GetObjectContext() On Error GoTo AbortTransaction Dim objConnection As ADODB.Connection Set objConnection = New ADODB.Connection objConnection.Open "DSN=ADOTest" & ";UID=sa;PWD=" MsgBox ("Connection opened") objConnection.Execute (strCommand1) MsgBox ("First Command") objConnection.Execute (strCommand2) MsgBox ("Second Command") objConnection.Close objContext.SetComplete Exit Sub AbortTransaction: MsgBox ("Failure") objContext.SetAbort End Sub The client project to use this COM+ component follows . This project contains two command buttons . The button with the caption Transaction invokes the method PerformOperations in the COM+ component. This application connects to the pubs database on the SQL Server 7.0 database. It updates the authors table through two update queries. The following code is in the COMClient folder for this chapter: Private Sub cmdExit_Click() End End Sub Private Sub cmdTransaction_Click() Dim X As Object Set X = GetObject("", _ "DatabaseUsingCOMPlus.DatabaseClass") If X Is Nothing Then MsgBox "Failed to get the object" Else X.PerformOperations _ "Update authors set zip='66666' where au_lname='White'", _ "Update authors set au_lname='Curved'where au_fname='Dean'" End If End Sub First we will migrate the client application and check whether the migrated Visual Basic .NET application can use the original COM+ component. The upgraded application follows. It is kept in the COMClient-VB.NET folder for this chapter. Private Sub cmdExit_Click(ByVal eventSender As _ System.Object, ByVal eventArgs As System.EventArgs) _ Handles cmdExit.Click End End Sub Private Sub cmdTransaction_Click(ByVal eventSender As _ System.Object, ByVal eventArgs As System.EventArgs) _ Handles cmdTransaction.Click Dim X As Object X = GetObject("", _ "DatabaseUsingCOMPlus.DatabaseClass") If X Is Nothing Then MsgBox("Failed to get the object") Else X.PerformOperations(_ "Update authors set zip='66666' where au_lname='White'",_ "Update authors set au_lname='Curved' where au_fname='Dean'") End If End Sub This upgraded code works in the same manner as the original Visual Basic 6.0 application. Thus, it is seen that the Visual Basic .NET applications that use COM+ components can be upgraded. When the COM+ project is upgraded to Visual Basic .NET, there are compilation errors. The preceding code can be rewritten as follows. The code is kept in the MyComPlus-VB.NET folder for this chapter. Option Strict Off Option Explicit On Imports System.EnterpriseServices Imports System.Reflection <Assembly: AssemblyKeyFile("Text.snk")> <System.Runtime.InteropSer- vices.ProgId("DatabaseClass_NET.DatabaseClass"), Transac- tion(TransactionOption.Required)> Public Class DatabaseClass Inherits ServicedComponent <AutoComplete()> Public Sub PerformOperations(ByRef strCommand1 As String, ByRef strCommand2 As String) Try Dim objConnection As ADODB.Connection objConnection = New ADODB.Connection() objConnection.Open("DSN=ADOTest" & ";UID=sa;PWD=") MsgBox("Connection opened") objConnection.Execute(strCommand1) MsgBox("First Command") objConnection.Close() objConnection = New ADODB.Connection() objConnection.Open("DSN=ADOTest" & ";UID=sa;PWD=") objConnection.Execute(strCommand2) MsgBox("Second Command") objConnection.Close() Catch MsgBox("Failure") ContextUtil.SetAbort() End Try End Sub End Class First of all a key-pair file called test.snk is generated using the sn.exe utility provided with the Microsoft .NET Framework. This file is used for strong naming the assembly. Note that the System.EnterpriseServices and System. Reflection namespaces are imported into the assembly. The System.EnterpriseServices namespace provide for COM+ services, and the System.Reflection namespace provides attributes for specifying the key file for the assembly. The COM+ services are provided by the attribute Transaction at the class level and the attribute AutoComplete at the method level. Once the code is compiled into a DLL file, it has to be registered on the machine with the command regsvcs utility provided with the Microsoft .NET Framework. Then it is put into the global assembly cache with the gacutil.exe utility. The COM+ component gets the name DatabaseClass_NET.DatabaseClass by default. The Visual Basic .NET client application can be changed to access the Microsoft .NET COM+ component as follows. This code is kept in the COMClient-VB. NET-Modified folder for this chapter. Private Sub cmdExit_Click(ByVal eventSender As _ System.Object, ByVal eventArgs As System.EventArgs)_ Handles cmdExit.Click End End Sub Private Sub cmdTransaction_Click(ByVal eventSender As _ System.Object, ByVal eventArgs As System.EventArgs) _ Handles cmdTransaction.Click Dim X As Object X = GetObject("", "DatabaseClass_NET.DatabaseClass") If X Is Nothing Then MsgBox("Failed to get the object") Else X.PerformOperations(_ "Update authors set zip='22222' where au_lname='White'", _ "Update authors set au_lname='Curved' where au_fname='Dean'") End If End Sub Even though the example is very simple, most of the COM+ components are upgraded in the same manner. That is, appropriate classes from the System.EnterpriseServices must be used as attributes in the assembly to make it a COM+ component. Also, these assemblies must have strong names and must be registered using the regsvcs utility provided by the .NET Framework. |