Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование AutoInc полей в приложениях Midas

Delphi , Базы данных , Поля



Автор: Бушин Сергей
WEB-сайт: http://delphibase.endimus.com

{ **** 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.

Важные точки:

  1. В обоих решениях необходимо синхронизировать сгенерированные значения с фактическими значениями, хранящимися на серверной стороне.
  2. При обновлении существующих записей сгенерированное значение должно быть отрицательным, чтобы избежать конфликтов с уже существующими значениями.
  3. Использование агрегатов может упростить процесс генерации значений для полей AutoInc.

Продемонстрирован код, который демонстрирует, как реализовать эти решения в Delphi с помощью компонентов Midas.

Альтернативное решение: Еще один подход - использовать хранимую процедуру на серверной стороне, которая генерирует следующее значение для поля AutoInc и возвращает его клиенту. Это можно сделать с помощью компонента TSQLQuery или создавая пользовательскую хранимую процедуру в системе управления базами данных.

Преимущества и недостатки:

  • Генерация значений на клиентской стороне:
    • Преимущества: может быть быстрее и более эффективно, особенно для локальных приложений.
    • Недостатки: может привести к конфликтам с уже существующими значениями, если не будет реализовано правильно.
  • Использование агрегатов:
    • Преимущества: упрощает процесс генерации значений для полей AutoInc.
    • Недостатки: может требовать дополнительного кодирования и тестирования, чтобы обеспечить правильную функциональность.

В заключение, оба решения имеют свои преимущества и недостатки. Выбор того или иного решения зависит от конкретных требований приложения и сложности обработанных данных.

Использование AutoInc полей в приложениях Midas: для устранения ошибки EkeyViolation необходимо либо генерировать значения для полей с типом AutoInc в клиентском приложении, либо использовать агрегаты.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Поля ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-02 14:18:09/0.0056819915771484/1