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

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

Блокировка записей Access многопользовательский режим


jjda ©   (2013-02-09 18:12:00) 

Здравствуйте!
Мне необходимо организовать многопользовательский режим работы с данными. Файл БД Access лежит в общей папке на сервере. Доступ через Delphi и ADO. Узнал о свойствах ADOQuerty:
LockType – (ltPessimistic, ltOptimistic) – который должен по идее блокировать запись;
CursorType – (ctStatic, ctDynamic) – который должен следить за обновлением курсора.
Подключился через AdoConnection  к БД MS Access  и данные загнал в  DbGrid. Загрузил две копии программы (многопользовательский режим).Не понимаю как работает хотя бы одно из этих свойств: какой-бы не ставил CursorType  – данные  после изменений  в другой копии программы не обновляются (т.е. в первой копии изменил запись, переключился на вторую копию – чтобы не делал данные в DBGrid старые)
Аналогичные проблемы и с  LockType – ставил и ltPessimistic, ltOptimistic – в первой копии программы  захожу  в запись и начинаю редактирование, не завершая редактирования, перехожу  во вторую копию и пытаюсь выполнить редактирование той же записи.  Дает ошибку, что данные были уже изменены и не дает редактировать (при этом не дает редактировать даже после его завершения в первой копии программы) или редактирует без каких-либо сообщений, при этом в каждой копии  начинают отражаться свои данные, а БД вообще не понятно что.
Не могу разобраться, помогите!
1) Мне необходимо как-то обновлять данные в одной копии, в режиме реального времени, когда они были изменены во второй.
2) Блокировать редактируемую в первой копии запись от изменений во всех других копиях программы. При этом другие записи должны иметь возможность редактирования.


Savek   (2013-02-12 10:51:00) [1]

jjda
Только трёхзвенка спасёт, всё остальное пляски с бубном


Сергей М.   (2013-02-11 16:54:00) [2]


> Хотелось бы как то поцивилизованее эту ситуацию обрабатывать


Фильтруй нативный код ошибки и обрабатывай ошибку как считаешь нужным.

Пример обработки ошибок:

// коды ошибок MS JET

 JET_errKeyDuplicate           = -1605; // попытка дублирования значения в уникальном поле
 JET_errRefIntegrityViolation  = -1612; // попытка нарушения правил ссылочной целостности
 JET_errBadReference           = -1613; // попытка внести неверную ссылку в поле вторичного ключа
 JET_errKeyNull                = -3701; // попытка внести NULL в поле вторичного ключа
 JET_errEmptyString            = -3702; // попытка записи пустой строки в поле
..
procedure TdmDataBase.SomeDataset_PostError(DataSet: TDataSet;
 E: EDatabaseError; var Action: TDataAction);
begin
 case Conn.Errors[0].Number of
   DB_E_ERRORSOCCURRED:
     case Smallint(Conn.Errors[0].NativeError) of
       JET_errKeyDuplicate:
         begin
           Action := daAbort;
           ShowMessage('Такое наименование уже существует !');
         end;
       JET_errKeyNull, JET_errEmptyString:
         begin
           Action := daAbort;
           ShowMessage('Не указано или недопустимое наименование !');
         end;
       JET_errBadReference:
         begin
           Action := daAbort;
           ShowMessage('Не указан или недопустимый элемент справочника !');
         end;
     end;
 end;
end;


sniknik   (2013-02-10 17:26:00) [3]

> Что порекомендуете?
https://www.google.ru/search?q=введение+в+базы+данных


jjda   (2013-02-10 16:20:00) [4]

Вопрос:

Использую Delphi: ADOConnection+ AdoQuerty + Datasource для доступа к БД Access. Данные отображаются в DBGRid. Есть три операции для работы с записями: правка, добавить, удалить.
Реализуется многопользовательский режим. Т.е. несколько пользователей могут подключаться к БД и выполнять эти операции.
При добавлении или правке – проблем нет я все решаю.
Вопрос с удалением данных: что делать, если в момент, когда один из пользователей правит какую-либо запись другой ее удаляет???? У меня после завершения правки прога начинает орать, что запись была удалена и не выпускает с записи пока не нажму “OK”. Хотелось бы как то поцивилизованее эту ситуацию обрабатывать?  


Например:
а) закрывать запись от одновременного редактирования двумя пользователями (т.е. если один встал на эту запись, то другой не может)
б) выводить сообщение о недоступности редактирования записи только один раз
в) ваш вариант???


Что порекомендуете?


sniknik   (2013-02-10 00:26:00) [5]

> Единственное что нашел по клучам так это описание свойств:
>> Dynamic  Динамический курсор (как правило, на стороне сервера).
не клуч, а ключ, и уж точно не курсор, динамический он или нет... ищи еще.


jjda   (2013-02-09 23:30:00) [6]

Спасибо всем кто ответил! Буду разбираться!


Плохиш   (2013-02-09 23:24:00) [7]


> БД Access

Это не серверная бд.


Писатель   (2013-02-09 22:55:00) [8]

Почему Access? MySql, MsSql light как вариант кажись получше для сетки будет?


hghhhJ   (2013-02-09 21:42:00) [9]

Единственное что нашел по клучам так это описание свойств:


> Dynamic  Динамический курсор (как правило, на стороне сервера).
>  Данные, измененные другими пользователями, обновляются
> в курсоре автоматически. Потребляет максимум ресурсов. Поддерживается
> не всеми поставщиками данных. Позволяет прокручивать данные
> как вперед, так и назад.


Так я так и выставлял его на "динамик" - ничего не обновляет....

И не очень понятно, если блокировать записи не получается, то зачем тогда нужен LockType Он то вроде на этот вопрос и отвечает?


jjda   (2013-02-09 21:32:00) [10]

sniknik

Спасибо!
По поводу последнего: может есть другой способ ну пусть даже он не блокурует а перезаписывает. Неважно! USer-у можно обосновать. Но только чтобы не орал что данные изменились


sniknik   (2013-02-09 20:01:00) [11]

> в режиме реального времени
это из области фантастики.


sniknik   (2013-02-09 20:00:00) [12]

> Файл БД Access лежит в общей папке на сервере.
не правильный подход. если есть сервер то почему не поставить и sql сервер?

> Не могу разобраться, помогите!
на "королевстве дельфи" ( http://www.delphikingdom.ru/) есть статьи по ADO, серия.

> 1) Мне необходимо как-то обновлять данные в одной копии, в режиме реального времени, когда они были изменены во второй.
обрати внимание при чтении на "изменение по ключу"

> 2) Блокировать редактируемую в первой копии запись от изменений во всех других копиях программы. При этом другие записи должны иметь возможность редактирования
не получится, если только сам поле "флаг" не введешь и не будешь им "рулить", блокировки до записей вне ядра не доступны. (ну во всяком случае нормальной такую работу не назовешь, даже если получится)


Наверх

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