Автогенерация запросов на удаление

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Закрыто
Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Автогенерация запросов на удаление

Сообщение Akella » Вт 19 июн 2012 12:58

Скажите, а что, TUniQuery автоматически генерирует без участия программиста запросы на удаление?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Автогенерация запросов на удаление

Сообщение AndreyZ » Ср 20 июн 2012 07:55

Все DAC продукты автоматически генерируют запросы на добавление, изменение, удаление, блокировку и обновления записей. Если Вы хотите использовать свои запросы, то Вам необходимо использовать соответствующие свойства SQLInsert, SQLUpdate, SQLDelete, SQLLock, и SQLRefresh. Если Вы задали свои запрос, UniDAC будет использовать его, в противном случае, UniDAC будет автоматически генерировать запросы.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Автогенерация запросов на удаление

Сообщение Akella » Ср 20 июн 2012 08:28

Это очень плохо и причин тому несколько.


1. Почему я должен быть уверен, что компонента на 100% правильно и корректно автоматически сгенерирует тот или иной запрос?
2. Получается, что компонента "в тайне" от программиста чего-то там генерит с ПОСЛЕДСТВИЯМИ!! :shock:
3. В конце концов, может получиться непредвиденное, как получилось у меня. Select-запрос был на составление некой статистики относительно списка пользователей. Пользователь, работающий с программой, думает, что это обычная статистика, хотя построена она относительно таблицы пользователей. При этом, пользователь захотел "почистить" статистику, грохнув благополучно навсегда часть пользователей, т.к. грид дал команду "удалить", а датасет и не сопротивлялся.

4. В свойствах датасета НЕТ чего-то, чем можно ограничить то или иное действие (удаление, добавление, изменение)в независимости от того, есть ли для этого действия SQL-запрос или нет. К датасету может быть подключено несколько гридов на разных формах, к примеру, и легде ограничить это централизованно в датасете, чем в каждом гриде.

Поэтому нужен какой-то механизм, функционал, который бы разрешал/запрещал датасету автоматически генерировать запросы.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Автогенерация запросов на удаление

Сообщение AndreyZ » Ср 20 июн 2012 11:49

1,2. Автоматическая генерация запросов - это одна из наиболее полезных и удобных возможностей UniDAC. Информация об автоматической генерации запросов UniDAC'ом описана по следующей ссылке (в разделе "Data access and data management automation"): http://www.devart.com/unidac/features.html . Если Вы не уверены что UniDAC генерирует корректный запрос или Вы хотите управлять всеми отправляемыми запросами на сервер, Вам необходимо использовать свои запросы в свойствах SQLInsert, SQLUpdate, SQLDelete, SQLLock, и SQLRefresh. Таким образом Вы будете контролировать все отправляемые на сервер запросы.
3. Для предотвращения удаления данных из датасета Вам необходимо установить свойство датасета ReadOnly в True. Если ReadOnly установлен в True, Ваши пользователи не смогут изменить, удалить или добавить записи датасета.
4. Для того чтобы запретить конкретное действие в датасете, Вам необходимо использовать события датасета. Например:

Код: Выделить всё

procedure TForm1.UniQuery1BeforeEdit(DataSet: TDataSet);
begin
  Abort; // запрещаем изменение записей
end;

procedure TForm1.UniQuery1BeforeDelete(DataSet: TDataSet);
begin
  Abort; // запрещаем удаление записей
end;

procedure TForm1.UniQuery1BeforeInsert(DataSet: TDataSet);
begin
  Abort; // запрещаем добавление записей
end;

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Автогенерация запросов на удаление

Сообщение Akella » Ср 20 июн 2012 12:10

Не вижу, а где здесь написано, что датасет автоматически, без участия программиста генерирует или создает SQL запросы на уделение, добавление и т.д.?
Data access and data management automation

Automatic data updating with TUniQuery, TUniTable, and TUniStoredProc components
Automatic record refreshing and locking
Automatic query preparing
Support for ftWideMemo field type in Delphi 2006 and higher
Ещё вопрос. Как мне заставить TUniQuery программно сгенерировать запрос?
Например, сгенерировать запрос только для refresh, а для остальных не генерировать.

Как запретить автоматически генерировать те или иные запросы?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Автогенерация запросов на удаление

Сообщение AndreyZ » Чт 21 июн 2012 09:11

Для любых действий над данными на сервере используются SQL запросы, поэтому автоматическое изменение, добавление, удаление или обновление данных подразумевает автоматическую генерацию SQL запросов которые и выполняют соответствующие операции.
Для того чтобы заставить TUniQuery не генерировать запрос для конкретной операции над данными, Вам необходимо задать свой запрос для этой операции. Например, чтобы заставить TUniQuery генерировать запрос только для операции обновления данных (refresh), Вам необходимо установить свои запросы в свойства SQLInsert, SQLUpdate, SQLDelete, и SQLLock, а свойство SQLRefresh оставить пустым.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Автогенерация запросов на удаление

Сообщение Akella » Чт 21 июн 2012 09:54

Так в том-то и дело, что программисту не нужны вообще запросы кроме Select и Refresh. Зачем ещё думать и помнить, что нужно не забыть про остальные свойства: SQLInsert, SQLUpdate, SQLDelete и чем-нибудь из заполнить?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Автогенерация запросов на удаление

Сообщение Alexp » Пт 22 июн 2012 11:16

Добрый день.

В общем случае для разработки приложений необходимы все запросы, так как работа с БД подрозумевает под собой не только получение данных, но и изменение, вставку и удаление. Поэтому мы предоставляем механизмы для автоматического выполнения всех этих операций. Если в конкретном сучае какая либо функциональность не требуеться, ее необходимо "отключать" на уровне приложения, заданием собственных запросов, обработкой событий, блокировкой действий пользователя на уровне DataAccess компонент и т.д.

Закрыто