![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Использование AutoInc полей в приложениях MidasDelphi , Базы данных , Поля
Автор: Бушин Сергей { **** UBPFD *********** by delphibase.endimus.com **** >> При использовании полей AutoInc в клиентских приложениях наблюдается следующая ситуация: при вставке новых записей в таблицу происходит исключение EkeyViolation. Данное исключение указывает на тот факт, что поле с типом данных AutoInc автоматически в ClientDataSet не инкрементируется. По этой причине необходимо постоянно применять и обновлять данные, после каждой вставки. Т.е. использовать пару CDS.ApplyUpdates()/CDS.Refresh. Этот прием вполне приемлем при локальном использовании и клиента и сервера, но в сети сводит на нет все преимущества использования DataSnap. И в таком случае клиент не сможет вставлять данные, если у него нет соединения с сервером или ему (клиенту) необходимо иметь постоянный доступ к серверу. Единственный выход из данной ситуации это самому генерировать значения для полей с типом AutoInc в клиентском приложении. А когда сервер будет обновлять данные, полеченные от клиента, то он не будет учитывать значения поля AutoInc при вставке. Да еще один важный момент касается уже существующих записей. Когда CDS обновит данные, чтобы нам не конфликтовать с уже существующими значениями, нужно генерировать отрицательные значения. Теперь при вставке нам нужно сгенерировать нужное значение. Второй код - еще одна возможность: это использование агрегатов Зависимости: DB, DBClient, MConnect, SysUtils, Classes Автор: Бушин Сергей, sanbotech@yandex.ru, Братск Copyright: 1)Бушин Сергей, 2)Borland Corparation Дата: 14 января 2003 г. ***************************************************** } MyAutoIncValue: longint; … procedure TmyModaule.ClientDSAfterInsert(DataSet: TDataSet); begin ClientDS.MyAutoIncField.AsInteger := MyAutoIncValue; //генерируем новое значение Dec(MyAutoIncValue); end; procedure TMyModule.ClientDSAfterRefresh(DataSet: TDataSet); begin //Сбрасываем значение счетчика MyAutoIncValue := -1; end; ... //вторая возможность - использование агрегатов var NewID: Integer; begin with ClientDataSet do begin //вначале отключаем и очищаем агрегаты AggregatesActive := False; Aggregates.Clear; //Теперь добавляем with Aggregates.Add do begin //здаем ему выражение Expression := 'Max(AField)'; //имя AggregateName := 'Runtime'; //активизируем его Active := True; end; //подключаем агрегаты AggregatesActive := True; try //Теперь генерируем наше новое значение NewID := Aggregates[0].Value; // ...или еще одна альтернатива // NewID := Aggregates.Find('Runtime').Value; Inc(NewID); except on E: Exception do SomeHandle; end; //вставляем и присваиваем Insert; FieldByName('AField').AsInteger := NewID; end; end; Статья обсуждает проблему использования полей AutoInc в приложениях Midas и как это может привести к исключениям, таким как EkeyViolation. Автор предлагает два решения этой проблемы: генерация значений для полей AutoInc на клиентской стороне и использование агрегатов. Первое решение: В этом подходе на клиентской стороне генерируется счетчик, который инкрементируется после каждого вставления. Для этого требуются два ClientDataSets (CDS) и частые обновления и обновления. Однако это решение может не быть подходит для сетевых приложений, где клиент должен постоянно доступаться к серверу. Второе решение: Использование агрегатов В этом подходе на клиентской стороне создается агрегат, который генерирует новое значение для поля AutoInc после каждого вставления. Код, предоставленный ниже, демонстрирует, как создавать и использовать агрегат для генерации значений для поля AutoInc. Важные точки:
Продемонстрирован код, который демонстрирует, как реализовать эти решения в Delphi с помощью компонентов Midas. Альтернативное решение: Еще один подход - использовать хранимую процедуру на серверной стороне, которая генерирует следующее значение для поля AutoInc и возвращает его клиенту. Это можно сделать с помощью компонента TSQLQuery или создавая пользовательскую хранимую процедуру в системе управления базами данных. Преимущества и недостатки:
В заключение, оба решения имеют свои преимущества и недостатки. Выбор того или иного решения зависит от конкретных требований приложения и сложности обработанных данных. Использование AutoInc полей в приложениях Midas: для устранения ошибки EkeyViolation необходимо либо генерировать значения для полей с типом AutoInc в клиентском приложении, либо использовать агрегаты. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |
Время компиляции файла: 2024-12-22 20:14:06
2025-04-02 14:18:09/0.0056819915771484/1