Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.11.17;
Скачать: [xml.tar.bz2];

Вниз

Блокировка записей 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
15-1366819476
Космополит
2013-04-24 20:04
2013.11.17
Skype работает, а интернет нет.


2-1360819310
Exception
2013-02-14 09:21
2013.11.17
Templates and Inheritance


15-1369907951
Дмитрий СС
2013-05-30 13:59
2013.11.17
CreateDesktop + Панель задач.


6-1269966380
ZeTToG350
2010-03-30 20:26
2013.11.17
Определение MAC


2-1360495510
Максим
2013-02-10 15:25
2013.11.17
Базы данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский