Delphirus - прграммирование на delphi
   Все о delphi Delphirus - прграммирование на delphi
blocks.gif
Навигация
 

Главная
Статьи
Базы данных
Графика
Защита
Интернет
Система
Тексты
Мультимедиа
Файлы
Формы и окна
Другое
Советы
Базы данных
Графика
Интернет
Мультимедиа
Система
Тексты
Файлы
Файлы
Исходники
Компоненты
Инфо
Поиск по сайту
Обратная связь
Самое популярное
Аккаунт
Карта сайта

 
 
 

Советы по delphi \ Базы данных \ SQL \ TUpdateSQL. Выполнение нескольких SQL команд

TUpdateSQL. Выполнение нескольких SQL команд

Огорворимся сразу. Под SQL сервером подразумеваются сервера, выполняющие SQL запросы, к ним относятся Oracle, MS SQL, InterBase и т.д.

В стандартной поставке Delphi TUpdateSQL позволяет выполнить только одну SQL команду, но возникает ситуация, когда желательно выполнить сразу несколько команд (например: удаление из двух таблиц одновременно, когда нет возможности установить каскадное удаление (DBF, DB)) или запустить процедуру на SQL сервере. В этом случае можно обойти ограничение, навязанное Delphi в виде ошибки Update Failed, возникающей при сохранении данных.

ТИПОВЫЕ РЕШЕНИЯ

Как это сделать:

В каталоге {DELPHI$}SourceVCL есть файл DBTABLES.PAS.
Открываем его и находим следующий код:

procedure TUpdateSQL.ExecSQL(UpdateKind: TUpdateKind);
begin
  with Query[UpdateKind] do
  begin
    Prepare;
    ExecSQL;
    if RowsAffected <> 1 then
      DatabaseError(SUpdateFailed);
  end;
end;

комментируем строки

if RowsAffected <> 1 then
  DatabaseError(SUpdateFailed);

затем необходимо откомпилировать этот файл, как один из путей - добавить его в новый проект и запустить компиляцию проекта. Затем файл dbtables.dcu необходимо скопировать в каталоги:
{DELPHI$}LIB и {DELPHI$}LIBDEBUG

И можно приступать к работе.

Есть одно НО. При построении проекта, если в параметрах проекта выбрать Build with runtime packages, то номер не пройдет, поскольку в данном случае приложение будет использовать уже готовый BPL от Borland.

КОММЕНТАРИЙ:

Если хорошо подумать, то авторы VCL не "от балды" сделали в этом месте контроль количества затронутых запросом записей. И не зря сравнили его с единицей (хотя, на первый взгляд, проще с нулем: RowsAffected > 0 -> Ok!). Компонент TUpdateSQL отрабатывает для операции над одной записью. Если запрос затронул несколько записей одной таблицы (например - удалил), то это повод для разборки - запрос неправильный, либо в таблице дубликаты. Если же мы закомментируем эту проверку, то рискуем остаться без контроля подобного рода ошибок.

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

Но, как говорится, "Не уверен - не обгоняй".

Название: TUpdateSQL. Выполнение нескольких SQL команд
Дата публикации: 2004-03-19 (2965 Прочтено)

 
 

 

Page generation 0.034 seconds