【发布时间】:2009-11-30 13:18:15
【问题描述】:
我正在编写一个 MS Outlook (2003) 宏,它使用 ADO 连接到 Access DB (2003)。我正在打开一个连接,将一些记录放入一个记录集,我用它来填充一个网格(但不绑定到)。然后我关闭 Recordset 和 Connection 并将两者都设置为 Nothing。
该过程会创建一个 MSACCESS.EXE 实例和一个用于 Access DB 的 .ldb 文件,在我关闭连接、记录集、宏和 Outlook 本身后,这两个文件仍然存在。在手动终止 MSACCESS.EXE 进程并删除 .ldb 文件之前,这些残余中的一个或两个会阻止打开 Access DB。
类似的帖子说“关闭连接”,但这并不能解决问题。
这是 VBA 代码:
Screen.MousePointer = vbHourglass
Set db = New ADODB.Connection 'Declared at module level
Set rs = New ADODB.Recordset 'Declared at module level
Dim sSQL As String
sSQL = "SELECT Customers.ContactFirstName As Name, Customers.ContactLastName As Surname, Customers.EmailName AS Email, Customers.Address, Customers.Area, Customers.Town FROM qryCustomersWithEmail ORDER BY Customers.ContactLastName ASC"
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\My Documents\Tables.mdb;Persist Security Info=False"
rs.Open sSQL, db, adOpenStatic, adLockReadOnly
If rs.RecordCount > 0 Then
'actions performed on recordset removed
End If
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
Screen.MousePointer = vbDefault
它在 Vista 上。
我这样做是为了让我的客户能够轻松地向其 Access 数据库中的每个人发送批量电子邮件。我尝试从 Access 访问 Outlook,但 Outlook 的安全“功能”会为每封创建的电子邮件弹出一条警告消息,破坏了这种方法。
更新。
-
我删除了 PopulateFlexGrid,但仅在打开和关闭记录集时问题仍然存在。我之前从这个示例中省略了,因为我认为这无关紧要,我在开头用
Screen.MousePointer = vbHourglass包装了代码,最后用Screen.MousePointer = vbDefault包装了代码。我删除了这个,问题不再发生。当我调用Screen.MousePointer = vbHourglass时,我看到 MSACCESS.EXE 在 TM 中启动。 -
我还尝试了一个使用 DAO 而不是 ADO 的版本,没有其他区别,它无需创建 .ldb 或启动 MSACCESS.exe 即可工作。这适用于其中的 Screen.Mousepointer 代码。
谁能解释一下?
【问题讨论】:
-
哪些版本的 Outlook 和 Access?
-
您是否在网络上运行它?如果是,请检查是否有任何网络集中器或其他设备可以缓存您的 ldb?
-
不,它在一台不涉及网络的机器上
-
我认为您没有包含所有相关代码,因为您包含的内容不会打开 Access,因为 OLEDB 完全独立于 MS Access 可执行文件。
-
试试这个:在您的硬盘上找到 MSACCESS.EXE,然后右键单击它,然后在“属性”表上,选择“安全”。然后对于 EVERYONE 组,为 READ 选择 DENY。这将阻止任何东西加载它。然后运行你的代码。