Access не покажет вам записи о транзакциях, которые еще не были совершены. На момент приостановки вашей программы неявная транзакция, созданная соединением, еще не была зафиксирована. Не экспериментировал, но я предполагаю, что неявная транзакция будет зафиксирована после того, как вы освободите запрос. Поэтому, если вы сделаете паузу сразу после этого, вы должны увидеть свою запись в MS Access.
После получения дополнительной информации от Райана (см. Его ответ самому себе) я немного больше расследовал.
Наличие первичного ключа (автономного номера или другого), по-видимому, не влияет на поведение.
Таблица со столбцом автономного номера в качестве первичного ключа
connection.Execute('insert into aaa (TestField1) values (''Test'')');
connection.Execute('select * from aaa');
connection.Execute('delete * from aaa');
beep;
finally
connection.Free;
end;
Остановка на «select» не показывает новую запись.
Остановка на «Удалить» показывает новую запись.
Остановка на "звуковой сигнал" по-прежнему показывает все записи в таблице, даже после повторных обновлений.
Остановка на "connection.Free" не показывает больше записей в таблице. А?
Остановка на «select», вставленном между «delete» и «beep», не показывает больше записей в таблице.
Та же таблица
connection.Execute('insert into aaa (TestField1) values (''Test'')');
beep;
connection.Execute('delete * from aaa');
beep;
beep;
Остановка каждого оператора показывает, что Access не получает «команду», пока не будет выполнен хотя бы один другой оператор. Другими словами: сигнал после оператора «Execute» должен быть обработан до того, как оператор будет обработан Access (может потребоваться несколько обновлений для отображения, первое обновление не всегда достаточно). Если вы остановитесь на первом звуковом сигнале после оператора «Выполнить», в Access ничего не произойдет и не произойдет, если вы перезагрузите программу, не выполнив никаких других операторов.
Вступление в соединение. Execute (Использовать debug dcu's on): эффект от выполнения оператора sql теперь виден в Access при возврате в звуковой сигнал. На самом деле, это видно гораздо раньше. Например, входя в оператор «delete», запись становится помеченной #deleted где-то еще в коде ADODB.
Фактически, при пошаговом выполнении кода adodb запись становится видимой в Access при остановке в обработчике OnExecuteComplete. Не тогда, когда остановлено на «начало», а когда остановлено на «если назначено» сразу после этого. То же самое относится и к оператору удаления. Эффект становится видимым в Access при остановке в операторе if в обработчике OnExecuteComplete в AdoDb.
Ado имеет ExecuteOption для асинхронного выполнения операторов. Во время всего этого он не действовал (по умолчанию он не включен). И хотя мы имеем дело с внепроцессным COM-сервером и с обратными вызовами, такими как обработчик OnExecuteComplete, этот обработчик был выполнен перед возвратом к оператору сразу после оператора ConnectionObject.Execute в методе TAdoConnection.Execute в AdoDb.
В целом, я думаю, что это не столько вопрос синхронного или асинхронного выполнения, сколько вопрос о выпуске ссылок (мы имеем дело с COM и подсчетом ссылок на интерфейсы) или с проблемами синхронизации потоков и процессов (в приложении, Доступ и между ними) или с их комбинацией.
И отладчик может просто запутывать вещи, а не разъяснять их. Было бы интересно посмотреть, что происходит в D2010 с его возможностями отладки в одном потоке, но я не получил его там, где я нахожусь (сейчас и в течение следующих двух недель).