ADO Connection to Access将.ldb文件留在后面

时间:2009-11-30 13:18:15

标签: ms-access vba locking ado

我正在编写一个MS Outlook(2003)宏,它使用ADO连接到Access DB(2003)。我只是打开一个连接,将一些记录放入Recordset,我用它来填充网格(但不绑定到)。然后关闭Recordset和Connection并将两者都设置为Nothing。

不是火箭科学吗?但我得到一个令人愤怒的问题,其中上面的过程实际上创建了一个MSACCESS.EXE的实例,以及一个用于Access DB的.ldb文件,在我关闭Connection,Recordset,Macro和Outlook本身后,这两个文件都保留了下来。这些残余中的一个或两个都阻止打开Access DB,直到手动终止MSACCESS.EXE进程并删除.ldb文件。在任何地方我都可以找到类似的帖子说“关闭连接”,但这并没有解决问题。

这是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

如果有人可以提供帮助,那会很棒。 (P.S.它在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代码。

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

答案是

的引用
Screen.MousePointer

我省略了无关,实际上是Access的成员。因此,当我打电话给它时,MSACCESS启动。

我应该用

Me.MousePointer = fmMousePointerHourGlass

因此,将一些代码从Access VBA复制到Outlook VBA并期望它的工作原理是我的错。向所有花时间看这个的人致歉!

答案 1 :(得分:0)

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

尝试删除此行,而只是循环遍历代码而不做任何事情,看看它是否仍然离开LDB。如果它仍然离开LDB,则问题不在于PopulateFlexGrid函数

答案 2 :(得分:0)

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

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

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

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