服务器 频道

将 Access 用作 Automation 服务器


通常,当引用实例的对象变量被设置为 Nothing 或在控制器应用程序中没有指定范围时,Microsoft Access 的实例会自动关闭。但是,如果在以下视图中打开任何 Microsoft Access 对象,则实例不会象期望的那样自动关闭: 对象 视图
----------------------
Table Datasheet
Design
Query Datasheet
Form Form
Report Print Preview
当 Microsoft Access 对象打开时,直到对象关闭且 Application 对象的 UserControl 属性为 False 时,此实例才关闭。但是,通过使用 Application 对象的“退出”方法可以强行关闭实例。例如,下面的示例代码使用“退出”方法关闭 Microsoft Access 的所有实例。 ----------------------------------------------------------------------
DECLARATIONS
----------------------------------------------------------------------

Option Explicit

----------------------------------------------------------------------
This procedure closes all open instances of Microsoft Access. Once all
instances are closed, the error handler is run and the procedure ends.
----------------------------------------------------------------------

Sub CloseAllAccess()
Dim objAccess As Object
On Error GoTo CloseAllAccess_ErrHandler
Do
Set objAccess = GetObject(,"Access.Application")
objAccess.Quit
Loop
CloseAllAccess_ErrHandler:
Set objAccess = Nothing
End Sub

警告:如果代码调用其它 Microsoft Access 函数,则不得使用“退出”方法关闭通过直接调用 Microsoft Access 函数创建的实例。有关在 Automation 代码中使用 Microsoft Access 函数的详细信息,请参阅本文稍后的“调用 Microsoft Access 函数”部分。

备注:通过将对象变量设置为模块级或 public 变量而不是过程级变量,可以防止在其对象变量 (objAccess) 没有指定范围时关闭 Microsoft Access 实例。

例如,如果 objAccess 是在过程中声明的,那么它只在过程运行时可用。过程结束后,objAccess 没有指定范围且 Microsoft Access 可以自动关闭。

但是,如果 objAccess 是在标准模块的 Declaration 部分中声明的,那么它是模块级变量,可以用于该模块的所有过程。如果 objAccess 在标准模块中是作为 Public 变量声明的,那么它可以在数据库的所有过程中使用。在这两种情况下,Automation 代码空闲时 objAccess 有指定的范围。因此,在使用“退出”方法或关闭 Automation 控制器之前,一直保持与 Microsoft Access 的连接。
打开数据库时绕过启动设置


当作为 Automation Server 使用 Microsoft Access 时,可以通过不同的方式打开特定的数据库。例如,可以使用 GetObject() 函数并指定数据库。或者,可以使用 Application 对象的 OpenCurrentDatabase 方法打开现有数据库将其作为当前数据库。

如果数据库有自定义“启动”设置或 AutoExec 宏,使用 OpenCurrentDatabase 方法时这些功能是运行的。但是,打开数据库时可以使用 SendKeys 语句模拟按下 SHIFT 键的操作,这将绕过 Startup 设置和 AutoExec 宏。例如,可以使用下面的示例代码: Dim objAccess as object
Set objAccess = CreateObject("Access.Application")

ShowAccess instance:=objAccess, size:=SW_MAXIMIZE
SendKeys "+"
Simulates holding down the SHIFT key as the database is being opened
objAccess.OpenCurrentDatabase filepath:= _
"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"
为了使 SendKeys 语句正确运行,代码应满足以下条件:


代码应使用后期绑定,这意味着引用 Microsoft Access 实例的变量被声明为对象,例如: Dim objAccess as Object
Set objAccess = CreateObject("Access.Application")
不得使用早期绑定,早期绑定使用应用程序定义的对象类型声明变量,例如: Dim objAccess as Access.Application
Set objAccess = CreateObject("Access.Application")

代码确保 Microsoft Access 处于显示状态,并且鼠标指针位于 Microsoft Access 窗口中。如果 Microsoft Access 不是活动窗口,则运行某个过程,如 ShowAccess() 函数(已经在前面的“查看 Microsoft Access 实例”部分给予说明)。
正在用 Automation 控制的数据库将其 AllowBypassKey 属性设置为 True(默认设置)。
OpenCurrentDatabase 方法直接跟在 SendKeys 语句之后,且不包含计算。例如,不使用以下代码: objAccess.OpenCurrentDatabase filepath:= _
objAccess.SysCmd(Access.acSysCmdAccessDir) &"Samples\Northwind.mdb"
SendKeys "+"

而使用下列示例代码: path = objAccess.SysCmd(Access.acSysCmdAccessDir) & _
"Samples\Northwind.mdb"
SendKeys "+"
objAccess.OpenCurrentDatabase filepath:=path

0
相关文章