Этот компонент довольно-таки небольшой. Поэтому мы с ним быстро разделаемся.
Предназначен он для отложенного внесения изменений в таблицы. Потому и подключается он к компонентам TTable, TQuery и TStoredProc через свойство UpdateObject. При этом свойство CachedUpdates необходимо установить равным true.
Его можно примениять к любому из поддерживающих его компонентов. Но чаще всего он встречается в двух случаях:
- когда необходимо "оживить" TQuery со сложным SQL-запросом
- при создании клиент-серверных приложений
При создании клиент-серверных приложений не следует надолго занимать данные. Например, пока пользователь редактирует даные, которые подключены у вас в программе черех обычный TTable без кеширования изменений, данные заняты и никто не может получить их. Ничего не мешает пользователю уйти на обед оставив таблицу в режиме редактирования, заблокировав таким образом работу остальных пользователей в этой таблицей. А иногда и со связанными с ней. Использование TUpdateSQL позволяет изменить стратегию работы с данными - данные все время доступны, а блокируются только на момент внесения изменений - то есть на доли секунды. Есть еще один важный момент связанный с понятием транзакций, но об этом в другой раз.
С "оживлением" TQuery ситуация такая - когда вы создаете запрос, в зависимости от того, что вы там напишете, TQuery может позволить или не позволить установить свойство RequestLive в true (см. урок о TQuery). Если позволит - мы получаем компонент, который позволяет вносить изменения в данные, но блокирует их на время внесения изменений, аналогично TTable. А если не позволит, то мы получаем компонент, который не позволяет вносить изменения. А если нам надо, чтобы позволял - воспользуемся TUpdateSQL.
Для изучения его свойств воспользуемся нашим проектом, созданным еще несколько уроков назад. В последнем уроке мы применили TQuery. В этом уроке мы присоединим его к TUpdateSQL. Присоединение к TTable будет аналогичным.
Во-первых установим сам компонент на форму. Его можно найти на странице компонентов DataAccess для Delphi 5 и ниже или на странице BDE для Delphi 6. Во-вторых свойству UpdateObject компонента TQuery необходимо присвоить имя нашего компонента TUpdateSQL. В третьих свойство CachedUpdates компонента TQuery должно быть равным true.
После этого, если ваш компонент TQuery полностью настроен (а у нас он давно настроен), достаточно двойного щелчка мыши на TUpdateSQL, чтобы открылось диалоговое окно его настройки, в котором почти все уже настроено. Почти, но не все. Нас интересуют колонки Key Fields, Update Fields переключатель Quote Field Names и кнопка Generate SQL. Если нажать кнопку Select Primary Keys. То в колонке Key Fields выделенным останется только ключевое поле. Вообще в этой колонке указываются поля, по значениям которых TUpdateSQL отличает одну строку от другой. К том случае, если у вас есть первичный индекс, достаточно только полей, входящих в него. Но только в том случае, если он есть.
Если первичный индекс есть, то нажатием кнопки Select Primary Keys в колонке Key Fields мы оставляем только нужные ключевые поля. При этом в колонке Update Fields следует оставить выделенными только те поля, которые не выделены в первой колонке. Особое внимание следует обратить на то, чтобы не были выделены поля, которые заполняются автоматически. Например, если оставить выделенным поле, тип которого AutoIncrement, Delphi вообще выдаст ошибку при попытке обновить данные. В нашем случае следует убрать выделение с поля Species No.
Если же первичного индекса нет, или ваш запрос выбирает данные с нескольких таблиц, то можно в качестве ключевых указать все поля, как и было по умолчанию.
Далее, если у нас есть поля, в именах которых встречаются пробелы, знаки подчеркивания, и другие "запрещенные" символы, следует установить галочку для Quote Field Names. Если таких полей нет - не обязательно. Впрочем, если эту галочку устанавливать всегда, тоже не ошибетесь. Ну все, теперь можно нажимать на Generate SQL и смотреть что получилось. На закладке SQL теперь сформированы запросы, которые будут выполняться при изменениии (modify), вставке (insert) и удалении (delete) данных. Если вы знакомы с SQL, вам будет понятно, что здесь происходит, а если нет - не огорчайтесь, со следующего урока мы начинаем его изучение. Впрочем, компонент TUpdateSQL все делает сам, так что у вас все будет работать даже если вы и не знакомы с SQL.
Если вам понадобится внести изменения в запрос в TQuery, следует повторить для связанного TUpdateSQL описанные выше действия начиная с указания ключевых полей.
Важный ньюанс - если запрос выбирает данные из нескольких таблиц то TUpdateSQL сформирует по запросу для каждой таблицы для обновления. Выполняться они будут все в одной транзакции. То есть, если не удастся выполнить один из них, то откатятся все. И никаких изменений в данные внесено не будет. А сообщение об ошидке будет одно на всех. И придется искать ошибку не зная в каком она запросе. В этом случае следует скопировать текст запроса в SQL Explorer и попытаться их выполнить по одному.
Вот и все, если вы все делали правильно, можете компилировать программу, все будет работать.:)
Комментариев нет:
Отправить комментарий