![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в трех уровневом приложении получить идентификатор? [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]Не ужели никто не знает??