2009-11-30 123 views
1

.ldb文件我正在写的MS Outlook(2003)宏,它使用ADO连接到Access数据库(2003)。我只是打开一个连接,获取一些记录到Recordset中,我用它来填充网格(但不绑定)。然后关闭Recordset和Connection,并将它们都设置为Nothing。ADO连接访问留下

不是火箭科学吗?但是,上面的过程实际上创建了一个MSACCESS.EXE实例,并为Access数据库创建了一个.ldb文件,在关闭连接,记录集,宏和Outlook本身之后,这两个文件仍然保留。这些残留中的一个或两个都会阻止打开Access数据库,直到手动终止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 

将是巨大的,如果有人可以提供帮助。 (附注:这是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代码。

有人可以解释吗?

+0

哪些版本的Outlook和Access? – 2009-11-30 13:42:10

+0

你在网络上运行这个吗?如果是这样,请检查是否有任何网络集中器或其他设备可能会缓存您的ldb? – heferav 2009-11-30 13:43:43

+0

不,它在一台机器上没有网络涉及 – Sheed 2009-11-30 13:51:50

回答

0

的功能是什么PopulateFlexGrid的代码?这是不是可能关闭传递给它的记录集?

尝试删除这条线,而是仅仅通过代码循环而不做任何事情,看它是否仍然离开LDB。如果仍然让LDB那么问题是不是与PopulateFlexGrid功能

+0

谢谢。已经做到了。不幸的是,这不是问题。 – Sheed 2009-11-30 14:33:44

0

我与大卫说同意有什么不清楚这里。这样的代码不能创建Access或.ldb文件的实例。如果没有在机器上安装Access,该代码甚至可以运行。

你能与客户方光标打开你的记录?使用serverSide游标可能导致访问文件以某种方式被修改(不确定...)。为了确保你的下一个命令不会在某种程度上interfeer或其他访问,你甚至可以在本地复制您的记录(到XML文件),关闭这两个记录和连接,重新使用XML文件作为数据源记录,然后填充你的flexgrid。

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

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

我的代码示例中没有包含Screen.MousePointer。这似乎是造成这个问题。我不能相信它。 – Sheed 2009-12-02 10:58:52

+0

我也有一些困难相信这一点!无论如何,让我们记住下次(1)避免使用来自VB的屏幕对象和(2)在问题中包含所有代码,即使被认为是不相关的! – 2009-12-02 14:28:50

3

这个问题的答案是,参考

Screen.MousePointer 

我忽略了这个不相关的实际上是Access的成员。因此,当我称之为MSACCESS启动。

我应该用

Me.MousePointer = fmMousePointerHourGlass 

所以这是我的复制从Access VBA到Outlook VBA一些代码,并期待它的工作同样的故障。向所有花时间看这个的人道歉!

+0

搞清楚为什么*这是解决方案的荣誉。我认为这可能是,但没想到要启动Outlook和Access来查看对象模型。 – 2009-12-03 05:55:22

+1

顺便说一下,我倾向于使用后期绑定来自动化所有Office应用程序,因此如果没有父对象,Outlook中的Screen.MousePointer将不会编译。 – 2009-12-03 05:56:29