Огорворимся сразу. Под SQL сервером подразумеваются сервера, выполняющие SQL
запросы, к ним относятся Oracle, MS SQL, InterBase и т.д.
В стандартной поставке Delphi TUpdateSQL позволяет выполнить только одну SQL
команду, но возникает ситуация, когда желательно выполнить сразу несколько
команд (например: удаление из двух таблиц одновременно, когда нет возможности
установить каскадное удаление (DBF, DB)) или запустить процедуру на SQL сервере.
В этом случае можно обойти ограничение, навязанное Delphi в виде ошибки Update
Failed, возникающей при сохранении данных.
ТИПОВЫЕ РЕШЕНИЯ
Как это сделать:
В каталоге {DELPHI$}\Source\VCL\ есть файл 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$}\LIB\DEBUG
И можно приступать к работе.
Есть одно НО. При построении проекта, если в параметрах проекта выбрать Build
with runtime packages, то номер не пройдет, поскольку в данном случае приложение
будет использовать уже готовый BPL от Borland.
КОММЕНТАРИЙ:
Если хорошо подумать, то авторы VCL не "от балды" сделали в этом месте
контроль количества затронутых запросом записей. И не зря сравнили его с
единицей (хотя, на первый взгляд, проще с нулем: RowsAffected > 0 -> Ok!).
Компонент TUpdateSQL отрабатывает для операции над одной записью. Если запрос
затронул несколько записей одной таблицы (например - удалил), то это повод для
разборки - запрос неправильный, либо в таблице дубликаты. Если же мы
закомментируем эту проверку, то рискуем остаться без контроля подобного рода
ошибок.
Конечно, уверенный в себе программист (допустим, он реализовал необходимый
контроль ошибок в хранимой процедуре) может исправить свою личную копию VCL и
пользоваться ею.
Но, как говорится, "Не уверен - не обгоняй".
|