Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как в трех уровневом приложении получить идентификатор? [D5, Access]


big_bugzy ©   (2004-04-08 04:16:00) 

Есть идентификатор типа счетчик. Как получить его значение при добавлении новой записи без ApplyUpdates??
К серверу приложения подключаюсь через SocketServer (MIDAS) ,база  - Access 2000


Павел   (2004-04-08 14:35:00) [1]

а зачем CriticalSection? в большинстве случаев вполне достаточно Interlocked... функций


Romkin   (2004-04-08 11:22:00) [2]

А не надо... Я же говорил, сделай на сервере класс с tmSingle - все за тебя уже синхронизируют


big_bugzy   (2004-04-08 11:15:00) [3]

>Тебе религия не позволяет вызвать у сервера метод  AppServer.GetNewID любом месте программы?

:)

Позволяет конечно
Просто я все же думал обойтись без него, но похоже лучше почитать описание "TCriticalSection"...

Спасибо всем кто откликнулся.


Nikolay M.   (2004-04-08 10:44:00) [4]


> Геморой в том что из синхронизаций потоков я только Synchronize
> знаю...
> трёх уровневое приложение в первые пишу ,поэтому вопросов
> много возникает...

Читай в Win32 SDK про "InitializeCriticalSection" и все, что рядом или в Using Delphi описание "TCriticalSection". Ничего трудного там нет.


> OnNewRecord немного рано возникает... На клиенте в этот
> момент еще нет нового идентификатора...

Что значит рано? Для кого рано? И что значит "нет идентификатора"? А ты сделай так, чтобы был. Тебе религия не позволяет вызвать у сервера метод AppServer.GetNewID в любом месте программы?


big_bugzy   (2004-04-08 10:32:00) [5]

>А в чем геморрой-то?
Геморой в том что из синхронизаций потоков я только Synchronize знаю...
трёх уровневое приложение в первые пишу ,поэтому вопросов много возникает...

OnNewRecord немного рано возникает... На клиенте в этот момент еще нет нового идентификатора...


Nikolay M.   (2004-04-08 10:29:00) [6]


> Romkin ©   (08.04.04 10:23) [5]

Можно и так. Можно еще десяток способов придумать. Это уже на усмотрение автору.


Romkin   (2004-04-08 10:23:00) [7]

Nikolay M. ©  (08.04.04 09:39) [2] Проще можно, СОМ-объект на сервере, с моделью потоков tmSingle (все в одном). Каждый кокласс обращается к одному классу-нумератору (модулю данных), который берет значение из таблицы/переменной. Все вызовы уже сериализованы, толкьо отдавай :))


Nikolay M.   (2004-04-08 10:19:00) [8]


> С этим могут возникнуть траблы при одновременном добавлении
> новых записей несколькими пользователями

И они обязательно возникнут.


> Генерить ключи и следить чтобы у каждого пользователя сгенереный
> ключ не повторялся с уже сгенерированным для другого пользователя
> ключем - геморойное дело...

А в чем геморрой-то?
В самом примитивном случае метод GetNewID на сервере занимает всего 5-10 строчек: инициализация и вход в критическую секцию, приращение глобальной переменной на 1, выход из критической секции. Ну, еще при запуске сервера эту глобальную переменную нужно проинициализировать. Все. Где здесь геморрой?


> А нельзя при ApplyUpdates получить именно только что добавленый
> идентификатор?

Это лучше делать не на AllpyUpdates, а на OnNewRecord.


big_bugzy   (2004-04-08 10:09:00) [9]

2 Nikolay M. ©  
у меня сейчас используется примерно то что тут -> http://hiprog.com/access/article.asp?id=191...
С этим могут возникнуть траблы при одновременном добавлении новых записей несколькими пользователями
Генерить ключи и следить чтобы у каждого пользователя сгенереный ключ не повторялся с уже сгенерированным для другого пользователя ключем - геморойное дело...
А нельзя при ApplyUpdates получить именно только что добавленый идентификатор?
Ато чегото не хочется мне самому контроь уникальности ключа придумывать...


Nikolay M.   (2004-04-08 09:39:00) [10]

http://hiprog.com/access/article.asp?id=191
но это криво.
Можно генерить очередной ID руками, используя блокировки (в акссессе они, вроде, есть?).
Еще, поскольку у тебя трехзвенка, можно поручить это апп-серверу. Создаешь у него новый метод GetNewID, заводишь глобальную переменную ID (или массив ID-шек - для каждой таблицы), работаешь с ней из разных RDM-ов через критические секции (ну, или любой другой способ синхронизации потоков). Метод GetNewID возвращает на клиента очередную ID-шку. Не забыть поменять в таблице тип поля с "Счетчик" на "Целое".


big_bugzy   (2004-04-08 09:26:00) [11]

Не ужели никто не знает??


Наверх

Титульная страница Поиск, карта сайта Написать письмо