Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.11.17;
Скачать: CL | DM;

Вниз

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

 
jjda   (2013-02-09 18:12) [0]

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


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

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

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

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

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


 
sniknik ©   (2013-02-09 20:01) [2]

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


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

sniknik

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


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

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


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


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

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


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

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


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


> БД Access

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


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

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


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

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


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

Вопрос:

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


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


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


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

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


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


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


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

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

// коды ошибок 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;


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

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



Страницы: 1 вся ветка

Текущий архив: 2013.11.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1360568573
Очень Злой
2013-02-11 11:42
2013.11.17
TXMLDocument проблема с кодировкой


15-1366819476
Космополит
2013-04-24 20:04
2013.11.17
Skype работает, а интернет нет.


1-1318238199
Istrafiloff
2011-10-10 13:16
2013.11.17
TMainMenu. Проблемы.


11-1207571875
Artlav
2008-04-07 16:37
2013.11.17
TKOLWebBrowser и OnBeforeNavigate2


2-1360753929
ddadda
2013-02-13 15:12
2013.11.17
LoadJPGFile из TFastDIB