MTS(Microsoft Transactin Server)是构筑安全、稳定的INTERNET/INTRANET应用的基础,在引进事务的概念后,你不用担心你的应用在崩溃时造成数据的不完整性。
在ASP中可以方便地应用MTS,你可以编写支持MTS的组件,然后注册到MTS中。前提是你必须启动DTC(分布式事务管理器)服务。注册MTS组件是个比较麻烦的过程,特别是当你必须在多台机器上进行的时候,但幸亏MTS提供了管理对象,你可以通过编写简单的程序来自动地注册。下面这段拷自MTS文档:
MTS 管理自动化的 Visual Basic 示例应用程序
Visual Basic 5.0 版的示例应用程序演示了如何使用 Catalog、CatalogObject 以及 CatalogCollections 对象的方法来自动完成对一个名为““脚本化的管理示例”的软件包的基本管理功能。
注意 必须将您的 Visual Basic 工程配置为可以引用 MTS 管理类型库(MTSAdmin 类型库)。要引用 MTSAdmin 类型库,请从 Visual Basic 工程工具栏中选择“引用”选项。然后查找“MTS 2.0 管理类型库”可引用文件。对于后期绑定的变量(在运行程序时才绑定),如果 MTXADMIN.DLL 文件已在本地机器上注册,则 Visual Basic 只记录类型库的位置,而不进行进一步的配置。
删除已有的名为“Scriptable Admin Demo”的软件包
调用 CreateObject 方法实例化目录对象。
Dim catalog As Object
Set catalog = CreateObject("MTSAdmin.Catalog.1")
调用 GetCollection 方法获取一个 Packages 集合对象。返回的 Packages 集合不从目录取得任何数据,因此从 GetCollection 方法返回的集合是空的。
Dim packages As Object
Set packages = catalog.GetCollection("Packages")
填充这个 Packages 集合,读入所有软件包并查找“Scriptable Admin Demo”软件包,从而获得该软件包的已有版本。枚举该集合,在最高索引开始,就可以在循环内部调用 Remove 方法。Remove 方法负责释放该对象,从集合中删除该对象,以及移动集合中的对象,使第 (n+1) 个对象变为第 (n) 个对象,这里的 n 大于或等于正在被删除的索引。集合对象的 Remove 方法是立即生效的。在 Remove 方法之后的任何时刻调用 Item 和 Count 方法都将反映出索引的变化。不过,对软件包的删除要直到调用 SaveChanges 方法后才会反映到目录上(请参阅第 4步)。
packages.Populate
Dim pack As Object
n = packages.Count
For i = n - 1 To 0 Step -1
If packages.Item(i).Value("Name") = "Scriptable Admin Demo" Then
packages.Remove (i)
End If
Next
调用 SaveChanges 方法来保存对数据的更改。
packages.SaveChanges
》创建一个新的名为“Scriptable Admin Demo”的软件包
使用 Add 方法添加一个软件包,注意要指定软件包标识符。Add 方法将该对象添加到集合,但要到调用 SaveChanges 方法后才会将该变化应用到目录(请参阅第 3 步)。注意 Add 方法将把所有属性设为默认值。默认的标识符是一个新的具唯一性的标识符。
Dim newPack As Object
Dim newPackID As Variant
Set newPack = packages.Add
newPackID = newPack.Value("ID")
》更新 Name 和 SecurityEnabled 属性。
newPack.Value("Name") = "Scriptable Admin Demo"
newPack.Value("SecurityEnabled") = "N"
调用 SaveChanges 方法将这个新的软件包保存到目录。该调用的返回值是更改、添加或删除的对象数目。如果没有发生改变,该方法返回 0。
n = packages.SaveChanges
更新“Scriptable Admin Demo”软件包的属性以及获取 ComponentsInPackage 集合。
调用 PopulateByKey 方法,从目录读入该软件包。这需要传递一个包含用来读入的关键字的数组。在示例代码中,使用了一个包含单个元素(刚创建的软件包的标识符)的数组。
Dim keys(0) as Variant
keys(0) = newPackId
packages.PopulateByKey keys
从集合中获取该软件包对象
Dim package As Object
Set package = packages.Item(0)
更新软件包的 SecurityEnabled 属性。
package.Value("SecurityEnabled") = "Y"
调用 GetCollection 方法来取得 ComponentsInPackage 集合。将“Scriptable Admin Demo”软件包的关键字作为其中一个参数。
Set components = packages.GetCollection("ComponentsInPackage",_ package.Key)
调用 SaveChanges 方法将更改保存到目录。
packages.SaveChanges
》安装一个组件到“Scriptable Admin Demo”软件包:
调用 GetUtilInterface 方法来获取组件实用程序对象。一般使用该对象来安装组件。
Dim util As Object
Set util = components.GetUtilInterface
On Error GoTo installFailed
调用 InstallComponent 方法,用一个字符串传递包含要安装组件的动态链接库 (DLL) 的名字。如果该组件没有一个外部类型库或 proxy-stub DLL,则传递一个空字符串作为第二个和第三个参数。注意,在安装一个新组件之后,不必调用 SaveChanges 方法。InstallComponent 方法将安装 DLL 中包含的所有组件,且这些组件被立即写入到目录。可以调用 GetCLSIDs 方法来获取所安装的组件的类标识符。
Form2.Show 1
Dim thePath As String
thePath = Form2.MTSPath + "\samples\packages\vbacct.dll"
util.InstallComponent thePath, "", ""
Dim installedCLSIDs() as Variant
util.GetCLSIDs thePath, "", installedCLSIDs
On Error GoTo 0
调用 PopulateByKey 方法读回刚安装的组件。注意通过 InstallComponent 方法安装到软件包的组件在调用 Populate 或 PopulateByKey 方法从该目录中读回数据之前,在集合中是不可见的。
components.PopulateByKey installedCLSIDs
》从“Scriptable Admin Demo”软件包中查找并删除 Bank.CreateTable 组件:
逐个列枚组件,并使用 Item 和 Count 方法更改事务属性。
Dim component As Object
n = components.Count
For i = n - 1 To 0 Step -1
Set component = components.Item(i)
component.Value("Transaction") = "Required"
按索引查找并删除 Bank.CreateTable 组件。注意,为了在循环中能调用 Remove 方法,必须向后逐个枚举集合中的对象。
If component.Value("ProgID") = "Bank.CreateTable" Then
components.Remove (i)
End If
Next
取得一个新的计数,并再次枚举集合。注意要到调用 SaveChanges 方法后,才会从数据存储中删除 Bank.CreateTable 组件。如果安装成功,则显示一个消息框通知用户。
n = components.Count
For i = 0 To n - 1
Set component = components.Item(i)
Debug.Print component.Value("ProgID")
Debug.Print component.Value("DLL")
Next
n = components.SaveChanges
MsgBox "Scriptable Admin Demo package installed and configured."
Exit Sub
installFailed:
MsgBox "Error code " + Str$(Err.Number) + "installing " + thePath + " Make sure the MTS path you entered is correct and that vbacct.dll is not already installed."
End Sub