Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизКак в трех уровневом приложении получить идентификатор? Найти похожие ветки
← →
big_bugzy (2004-04-08 04:16) [0]Есть идентификатор типа счетчик. Как получить его значение при добавлении новой записи без ApplyUpdates??
К серверу приложения подключаюсь через SocketServer (MIDAS) ,база - Access 2000
← →
big_bugzy (2004-04-08 09:26) [1]Не ужели никто не знает??
← →
Nikolay M. © (2004-04-08 09:39) [2]http://hiprog.com/access/article.asp?id=191
но это криво.
Можно генерить очередной ID руками, используя блокировки (в акссессе они, вроде, есть?).
Еще, поскольку у тебя трехзвенка, можно поручить это апп-серверу. Создаешь у него новый метод GetNewID, заводишь глобальную переменную ID (или массив ID-шек - для каждой таблицы), работаешь с ней из разных RDM-ов через критические секции (ну, или любой другой способ синхронизации потоков). Метод GetNewID возвращает на клиента очередную ID-шку. Не забыть поменять в таблице тип поля с "Счетчик" на "Целое".
← →
big_bugzy (2004-04-08 10:09) [3]2 Nikolay M. ©
у меня сейчас используется примерно то что тут -> http://hiprog.com/access/article.asp?id=191...
С этим могут возникнуть траблы при одновременном добавлении новых записей несколькими пользователями
Генерить ключи и следить чтобы у каждого пользователя сгенереный ключ не повторялся с уже сгенерированным для другого пользователя ключем - геморойное дело...
А нельзя при ApplyUpdates получить именно только что добавленый идентификатор?
Ато чегото не хочется мне самому контроь уникальности ключа придумывать...
← →
Nikolay M. © (2004-04-08 10:19) [4]
> С этим могут возникнуть траблы при одновременном добавлении
> новых записей несколькими пользователями
И они обязательно возникнут.
> Генерить ключи и следить чтобы у каждого пользователя сгенереный
> ключ не повторялся с уже сгенерированным для другого пользователя
> ключем - геморойное дело...
А в чем геморрой-то?
В самом примитивном случае метод GetNewID на сервере занимает всего 5-10 строчек: инициализация и вход в критическую секцию, приращение глобальной переменной на 1, выход из критической секции. Ну, еще при запуске сервера эту глобальную переменную нужно проинициализировать. Все. Где здесь геморрой?
> А нельзя при ApplyUpdates получить именно только что добавленый
> идентификатор?
Это лучше делать не на AllpyUpdates, а на OnNewRecord.
← →
Romkin © (2004-04-08 10:23) [5]Nikolay M. © (08.04.04 09:39) [2] Проще можно, СОМ-объект на сервере, с моделью потоков tmSingle (все в одном). Каждый кокласс обращается к одному классу-нумератору (модулю данных), который берет значение из таблицы/переменной. Все вызовы уже сериализованы, толкьо отдавай :))
← →
Nikolay M. © (2004-04-08 10:29) [6]
> Romkin © (08.04.04 10:23) [5]
Можно и так. Можно еще десяток способов придумать. Это уже на усмотрение автору.
← →
big_bugzy (2004-04-08 10:32) [7]>А в чем геморрой-то?
Геморой в том что из синхронизаций потоков я только Synchronize знаю...
трёх уровневое приложение в первые пишу ,поэтому вопросов много возникает...
OnNewRecord немного рано возникает... На клиенте в этот момент еще нет нового идентификатора...
← →
Nikolay M. © (2004-04-08 10:44) [8]
> Геморой в том что из синхронизаций потоков я только Synchronize
> знаю...
> трёх уровневое приложение в первые пишу ,поэтому вопросов
> много возникает...
Читай в Win32 SDK про "InitializeCriticalSection" и все, что рядом или в Using Delphi описание "TCriticalSection". Ничего трудного там нет.
> OnNewRecord немного рано возникает... На клиенте в этот
> момент еще нет нового идентификатора...
Что значит рано? Для кого рано? И что значит "нет идентификатора"? А ты сделай так, чтобы был. Тебе религия не позволяет вызвать у сервера метод AppServer.GetNewID в любом месте программы?
← →
big_bugzy (2004-04-08 11:15) [9]>Тебе религия не позволяет вызвать у сервера метод AppServer.GetNewID любом месте программы?
:)
Позволяет конечно
Просто я все же думал обойтись без него, но похоже лучше почитать описание "TCriticalSection"...
Спасибо всем кто откликнулся.
← →
Romkin © (2004-04-08 11:22) [10]А не надо... Я же говорил, сделай на сервере класс с tmSingle - все за тебя уже синхронизируют
← →
Павел (2004-04-08 14:35) [11]а зачем CriticalSection? в большинстве случаев вполне достаточно Interlocked... функций
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c