Подключение ADO для доступа оставляет файл .ldb позади - PullRequest
1 голос
/ 30 ноября 2009

Я пишу макрос 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 там.

Кто-нибудь может объяснить это?

Ответы [ 3 ]

3 голосов
/ 02 декабря 2009

Ответ на этот вопрос заключается в том, что ссылка на

Screen.MousePointer

, который я пропустил как нерелевантный, на самом деле является членом Access. Следовательно, когда я называю это, MSACCESS запускается.

Я должен был использовать

Me.MousePointer = fmMousePointerHourGlass

Так что я виноват в том, что скопировал код из Access VBA в Outlook VBA и ожидал, что он будет работать так же. Приношу извинения всем, кто провел время, глядя на это!

0 голосов
/ 01 декабря 2009

Я согласен с тем, что Дэвид сказал, что здесь что-то неясно. Такой код не может создать экземпляр Access или файл .ldb. Этот код может работать даже без установленного Access на компьютере.

Не могли бы вы открыть свой набор записей с помощью курсора clientSide? Использование курсора serverSide может привести к изменению файла доступа (не уверен ...) тем или иным способом. Чтобы убедиться, что ваша следующая команда никоим образом не мешает доступу, вы можете даже скопировать свою запись локально (в файл XML), закрыть записи и соединение, заново открыть набор записей с файлом XML в качестве источника данных, а затем заполнить вашу flexgrid.

Кстати, и хотя это не имеет никакого отношения к вашей проблеме, обычно предпочтительнее разделить объявление объекта на:

dim myObect as ADODB....
set myObject = New ADODB....
0 голосов
/ 30 ноября 2009

Каков код функции PopulateFlexGrid? Возможно ли, что это не закрывает переданный ему набор записей?

Попробуйте удалить эту строку и вместо этого просто пройтись по коду, ничего не делая, и посмотреть, не покинет ли он LDB. Если он все еще покидает LDB, то проблема не в функции PopulateFlexGrid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...