Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 262

•  TDictionary Custom Sort  6 306

•  Fast Watermark Sources  6 104

•  3D Designer  9 018

•  Sik Screen Capture  6 423

•  Patch Maker  6 839

•  Айболит (remote control)  6 822

•  ListBox Drag & Drop  5 700

•  Доска для игры Реверси  96 500

•  Графические эффекты  7 037

•  Рисование по маске  6 334

•  Перетаскивание изображений  5 212

•  Canvas Drawing  5 581

•  Рисование Луны  5 286

•  Поворот изображения  4 837

•  Рисование стержней  3 425

•  Paint on Shape  2 680

•  Генератор кроссвордов  3 563

•  Головоломка Paletto  2 858

•  Теорема Монжа об окружностях  3 665

•  Пазл Numbrix  2 398

•  Заборы и коммивояжеры  3 078

•  Игра HIP  2 038

•  Игра Go (Го)  1 964

•  Симулятор лифта  2 326

•  Программа укладки плитки  2 026

•  Генератор лабиринта  2 483

•  Проверка числового ввода  2 168

•  HEX View  2 498

•  Физический маятник  2 116

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

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



Delphi Sources

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



Автор: Андрей Камбалов

Огорворимся сразу. Под 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 и пользоваться ею.

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





Похожие по теме исходники

Конструктор тестов SQL

SQL Zapros




Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте