【问题标题】:ADO Connection to Access leaves .ldb file behind with Screen.MousePointer = vbHourglassADO 与 Access 的连接使用 Screen.MousePointer = vbHourglass 留下 .ldb 文件
【发布时间】: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。这将阻止任何东西加载它。然后运行你的代码。

标签: ms-access vba locking ado


【解决方案1】:

这个问题的答案是对

的引用
Screen.MousePointer

我忽略的无关紧要,实际上是 Access 的成员。因此,当我调用它时,MSACCESS 就会启动。

我应该用过

Me.MousePointer = fmMousePointerHourGlass

因此,将一些代码从 Access VBA 复制到 Outlook VBA 并期望它能够正常工作是我的错。向所有花时间看这里的人道歉!

【讨论】:

  • 感谢您找出解决方案 为什么。我认为可能是这样,但没想到启动 Outlook 和 Access 来查看对象模型。
  • 顺便说一句,我倾向于自动化所有具有后期绑定的 Office 应用程序,因此如果没有父对象,Outlook 中的 Screen.MousePointer 将无法编译。
【解决方案2】:

PopulateFlexGrid 函数的代码是什么?这可能没有关闭传递给它的记录集吗?

尝试删除这一行,而不做任何事情,只循环代码并查看它是否仍然离开 LDB。如果它仍然离开 LDB,那么问题不在于 PopulateFlexGrid 函数

【讨论】:

  • 谢谢。已经这样做了。不幸的是,这不是问题所在。
【解决方案3】:

我同意大卫所说的这里有一些不清楚的地方。此类代码无法创建 Access 实例或 .ldb 文件。此代码甚至可以在机器上未安装 Access 的情况下运行。

你能用客户端光标打开你的记录集吗?使用服务器端游标可能会导致访问文件以某种方式被修改(不确定......)。为了确保您的下一个命令不会以某种方式干扰访问,您甚至可以在本地复制您的记录(到 xml 文件),关闭记录和连接,以 xml 文件作为数据源重新打开记录集,然后填充你的 flexgrid。

顺便说一句,虽然它与您的问题无关,但通常最好将对象声明拆分为:

dim myObect as ADODB....
set myObject = New ADODB....

【讨论】:

  • 我的代码示例中没有包含 Screen.MousePointer。似乎这是造成问题的原因。我简直不敢相信。
  • 我也有些难以相信这一点!无论如何,让我们记住下次(1)避免使用 VB 中的屏幕对象和(2)在问题中包含所有代码,即使被认为不相关!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 2020-10-29
  • 2021-08-28
相关资源
最近更新 更多