Я пишу макрос MS Outlook (2003), который использует ADO-соединение с БД Access (2003). Я просто открываю соединение, получаю некоторые записи в Recordset, который я использую для заполнения сетки (но не для привязки). Затем я закрываю Recordset и Connection и устанавливаю для обоих ничего.
Не ракетостроение, не так ли? Но я получаю ужасную проблему, когда описанный выше процесс фактически создает экземпляр MSACCESS.EXE и файл .ldb для БД Access, которые остаются после того, как я закрыл Connection, Recordset, Macro и Outlook. Один или оба из этих остатков препятствуют открытию БД доступа, пока процесс 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. Я попробовал это, получив доступ к Outlook из Access, но столь же раздражающая «функция» безопасности Outlook, которая выскакивает предупреждающее сообщение для каждого созданного электронного письма, помешала этому подходу.
UPDATE
Я обновляю это своими выводами о причинах этого, что действительно странно.
Я удалил PopulateFlexGrid, и проблема все еще возникла только для открытия и закрытия набора записей. Код, который я пропустил в этом примере, поскольку я считал его неуместным, заключался в том, что я обернул код с помощью Screen.MousePointer = vbHourglass в начале и Screen.MousePointer = vbDefault в конце. Я удалил это, и проблема больше не возникает. Проходя через, я вижу MSACCESS.EXE запускается в TM, когда я вызываю Screen.MousePointer = vbHourglass. Я не могу поверить своим глазам, когда вижу, что это происходит.
Я также попробовал версию, в которой я использовал DAO вместо ADO, никакой другой разницы, и она работает без создания .ldb или запуска MSACCESS.exe. Это работает с кодом Screen.Mousepointer там.
Кто-нибудь может объяснить это?