2015-07-13 5 views
1

Я пытаюсь обновить базу данных MS Access в Excel VBA, используя объект ADO Recordset. Когда я запускаю метод rs.Update, я хотел бы, чтобы следующий код дождался обновления базы данных до ее выполнения.Задержка обновления набора записей

Кажется, что для регистрации метода обновления требуется 3-5 секунд. Как я могу отложить выполнение следующего кода до этого?

+0

У меня было определенное впечатление, что 'rs.Update' был * синхронной * операцией, и никакая задержка не должна быть необходимой. Что заставляет вас думать, что это не так? – RBarryYoung

+0

Может быть, потому, что мой 'PivotCache', который извлекает данные из базы данных, использует отдельное подключение к' Recordset'. Я создаю объект «Connection» «на лету» всякий раз, когда требуется «Обновление», но «PivotCache» указывается на БД при открытии рабочего листа. – andy91

ответ

1

Это простая функция I теперь использовать для приостановки обработки в течение нескольких секунд. Сначала убедитесь, что у вас есть вызов API в модуле:

Private Declare Sub sapiSleep Lib "kernel32" _ 
    Alias "Sleep" _ 
    (ByVal dwMilliseconds As Long) 

Затем добавить в эту функцию:

Public Function sSleep(lngMilliSec As Long) 
    If lngMilliSec > 0 Then 
     Call sapiSleep(lngMilliSec) 
    End If 
End Function 

Таким образом, вы можете увидеть, как это работает, используя:

Public Function sTestSleep() 
Const cTIME = 1000 'in MilliSeconds 
    Call sSleep(cTIME) 
    MsgBox "Before this Msgbox, I was asleep for " _ 
     & cTIME & " Milliseconds." 
End Sub 

Так приостановить обработку кода в течение 5 секунд, вы бы сказали:

Call sSleep(5000) 

Весь этот код был взят из here.

+0

С помощью этого подхода, сколько загрузки процессора вы видите в диспетчере задач Window, в то время как 'Pause()' делает свою работу? – HansUp

+0

@ HansUp Он определенно подтягивает некоторые, 40% ish (довольно медленный компьютер). Я обычно использую его только на несколько секунд. Есть ли другой метод, с которым вы знакомы с «паузой» обработки. Я определенно не против лучших вариантов. Я только что украл это из [здесь] (http://stackoverflow.com/questions/6960434/timing-delays-in-vba) – Newd

+1

В Access VBA я предпочитаю [метод Windows API] (http: // access .mvps.org/доступ/API/api0021.htm). Поскольку этот вопрос касается Excel VBA, я бы рассмотрел его [Application.Wait Method] (https://msdn.microsoft.com/en-us/library/office/ff822851.aspx); Тем не менее, мне никогда не приходилось использовать ни в Excel. – HansUp

1

Метод Update фактически блокируется до тех пор, пока обновление не будет завершено, поэтому ваш код уже «ждет» для него. Однако вы должны совершить транзакцию, прежде чем другие (пользователи, транзакции) смогут увидеть изменения. Когда вы вызываете метод CommitTrans на объекте Connection? Это может быть причиной задержки? Если это так, «пауза» в течение нескольких секунд ничего не изменит.

+0

«Пользователь», считывающий новые данные, фактически является объектом «PivotCache», подключенным к сводной таблице. Мой код в конечном итоге запускает метод «PivotCache.Refresh». Это не использует тот же объект Connection, который используется в 'RecordSet.Update'. Я думаю, именно поэтому у меня проблема с тем, что они не синхронизированы. – andy91

+1

Точно так вы должны убедиться, что транзакция совершена до обновления PivotCache. В противном случае вы можете приостановить выполнение навсегда, и данные не будут обновлены.Ожидание долгого выполнения коммита также может привести к блокировкам, поэтому, как только состояние в БД снова будет действовать после вашего обновления, вы должны немедленно совершить транзакцию. – Alex

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