IDE зависает при запуске VBA в Access 2016 [дубликат]

Вы можете использовать метод setArray, упомянутый в , этот javadoc :

PreparedStatement statement = connection.prepareStatement("Select * from emp where field in (?)");
Array array = statement.getConnection().createArrayOf("VARCHAR", new Object[]{"E1", "E2","E3"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();

1
задан Dave B 2 November 2015 в 10:21
поделиться

3 ответа

Вы должны вызвать функцию DoEvents-Function в цикле, чтобы передать управление операционной системе для перерисовки вашего GUI-интерфейса и для обработки любых других оконных сообщений, которые могут потребовать обработки. При этом приложение не будет помечено как «Не отвечает» в диспетчере задач и в строке заголовка.

Do Until rs.EOF = True
  [...]
  rs.MoveNext
  DoEvents
Loop  

Существует небольшая компромиссная производительность. Если не вызывать DoEvents, общее время выполнения для цикла будет немного короче, но Access ничего не сделает, а затем обработает ваш цикл. Поэтому кажется, что он не отвечает.

3
ответ дан PhilS 17 August 2018 в 10:19
поделиться

Как указывали другие, вы можете использовать DoEvents для освобождения процессора для выполнения других действий перед продолжением. Когда я использую DoEvents в цикле, я использую счетчик.

Dim iCounter as Integer

Do Until
' some code here
   iCounter=iCounter+1
   If iCounter = 100 then
      DoEvents
      iCounter=0
   End if
Loop

Это позволяет DoEvents запускать слишком часто, а ваш общий код замедляется. Отрегулируйте счетчик на любую итерацию, которая вам подходит.

3
ответ дан acr_scout 17 August 2018 в 10:19
поделиться

Это не лучший подход для таких изменений с циклом набора записей.

, например

UPDATE tblGuardians
SET FirstName = Trim(StrConv(FirstName, 3))
WHERE StrComp(FirstName, Trim(StrConv(FirstName, 3)), 0) <> 0

, и то же самое для LastName.

Используется вместо StrComp вместо простого <>, потому что последнее нечувствительно к регистру. Третий параметр 0 = vbBinaryCompare.

3
ответ дан Andre 17 August 2018 в 10:19
поделиться
  • 1
    Я согласен, что один оператор SQL обычно намного лучше, чем цикл записи набора записей для редактирования нескольких записей. - Но этот ответ не затрагивает общую проблему замораживания доступа при обработке цикла. – PhilS 2 November 2015 в 13:54
  • 2
    Благодаря! Поэтому я должен делать что-то вроде DoCmd.RunSQL и UPDATE tblGuardians SET Firstname = FirstName = Trim (StrConv (FirstName, 3)) WHERE ID = & quot; & Амп; rs! [ID] & amp; & Quot ;; & Quot; – Dave B 2 November 2015 в 14:30
  • 3
    @DaveB: Нет, этот запрос не запускается в цикле записей, вот в чем смысл. Он обновляет все записи сразу. Этот запрос (плюс один для LastName) является заменой для вашего кода цикла. – Andre 2 November 2015 в 14:45