ExecSql - это выполнение sql команды. Commit - это та же sql команда которая завершает транзакцию, и измененные данные фиксируются и становятся актуальными для всей бд, но старые транзакции могут не видеть их - все это зависит от реализации их в самом движке БД(Mysql,FB,Oracle,MSSQL)..
Поэтому важно сделать обновления транзакций у других активных запросов.. чтобы обновленные данные там тоже появились.
ApplyUpdates - это кэш данных на уровне компонента TDataSet.. до ApplyUpdates - данные в БД не отправляются, позволяет сэмулировать транзакцию для движков БД которые их не имеют.
Slava1970 писал(а):Спасибо. Просто всем спасибо.
У меня наверное больше проблема в датасет, делаю сначала ExecSql, потом Commit транзакции,
может поэтому сразу отражения нет, датасет не обновился, а ApplyUpdates() виснет,
запись заношу одним датасетом, а обновить другой на нем и виснет.
Если работаете с FirebirdSQL - то там есть уровни транзакции, некоторые режимы могут запрещать что то менять на уровне записи или всей таблицы. Т.е. пока не закроете активную транзакцию - FirebirdSQL вам не даст другой что то сделать, даже прочитать данные.
Добавлено спустя 12 минут 27 секунд:Снег Север писал(а): Извините, я не понимаю, как можно обновить данные на форме без отсылки запроса серверу базы данных. Телепатически, что ли?
А как выполняется запрос - явно, или неявно, по таймеру или по месаджу - дело вкуса.
Когда вам нужно увидеть сразу обновленные данные - таймер не самый лучший вариант(хотя лучший вариант при использование удаленной многопользовательской БД без сигнализации клиентов об изменения данных) .
А вот использовать оконные сообщения - которые вам дадут гибкость и свободу действий.. более правильное решение. Особенно необходимо если вы хотите сделать свои навороченные чуткие контролы.
Как пример: Combobox в котором в выдающем списке данные меняются по мере заполнения..