2009-11-30 3 views
1

Я пишу макрос MS Outlook (2003), который использует подключение ADO к базе данных доступа (2003). Я просто открываю соединение, получая некоторые записи в наборе записей, который я использую для заполнения сетки (но не привязки). Затем я закрываю Recordset и Connection и устанавливаю оба значения Nothing.ADO Connection to Access оставляет файл .ldb за

Не ракетостроение не так ли? Но у меня возникает проблема беспризорности, когда вышеупомянутый процесс фактически создает экземпляр MSACCESS.EXE и файл .ldb для Access DB, оба из которых остаются после того, как я закрыл сам 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, которая выводит предупреждающее сообщение для каждого созданного письма, подталкивает этот подход.

ОБНОВЛЕНИЕ Я обновляю это своими выводами о причине этого, что действительно странно.

  • Я удалил PopulateFlexGrid, и проблема все еще возникала только для открытия и закрытия набора записей. Код, который я пропустил из этого примера, поскольку я считал несущественным, что я завернул код с помощью Screen.MousePointer = vbHourglass, в начале и Screen.MousePointer = vbDefault, в конце. Я удалил это, и проблема больше не возникает. Поступая, я вижу, что MSACCESS.EXE запускается в TM, когда я вызываю Screen.MousePointer = vbHourglass. Я не могу поверить своим глазам, когда вижу это.

  • Я также пробовал версию, где я использовал DAO вместо ADO, никакой другой разницы, и он работает без создания .ldb или запуска MSACCESS.exe. Это работает с кодом Screen.Mousepointer.

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

+0

Какие версии Outlook и Access? –

+0

Вы используете это через сеть? Если да, проверьте, есть ли какие-либо сетевые концентраторы или другие устройства, которые могут кэшировать ваш ldb? – heferav

+0

Нет, он на одной машине не задействован в сети – Sheed

ответ

0

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

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

+0

Спасибо. Это уже сделано. К сожалению, это не проблема. – Sheed

0

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

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

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

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

Я не включил Screen.MousePointer в свой пример кода. Кажется, это вызвало проблему. Я не могу в это поверить. – Sheed

+0

У меня также есть некоторые трудности, чтобы поверить в это! Хорошо, в любом случае, давайте вспомним следующий раз: (1) избегать использования объекта «Объект» из VB и (2) включать весь код, даже если он считается неактуальным, в вопросе! –

3

Ответ на это, что ссылка на

Screen.MousePointer 

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

я должен использовать

Me.MousePointer = fmMousePointerHourGlass 

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

+0

Престижность для выяснения * почему * это было решением. Я подумал, что это может быть, но не думал запускать Outlook и Access, чтобы посмотреть на объектные модели. –

+1

BTW, я склонен автоматизировать все приложения Office с поздним связыванием, поэтому без родительского объекта Screen.MousePointer в Outlook не был бы скомпилирован. –

Смежные вопросы