2014-12-05 4 views
2

У нас в нашей сети имеется база данных MS Access (accdb), которую несколько пользователей будут редактировать &, прочитав с помощью приложения .NET. Я знаю, что такой сервер db, как SQL Server, был бы лучшим выбором для этой ситуации, но в настоящее время это из моих рук.многопользовательская база данных MS Access - как полностью заблокировать

Приложение .Net будет использовать как ADO.Net (т.е. OleDBConnections), так и инструменты внутри пространства имен Microsoft.Office.Interop.Access.Dao для подключения к базе данных.

Я прочитал несколько статей и сообщений о нескольких пользователях, подключающихся к Access, и, похоже, есть некоторые путаницы и разные мнения о возможностях Access в этом отношении. Как/можно добиться следующего в моем приложении:

  1. Установления соединения для записи в базу данных, которая будет блокировать всей базы данных (все записи и таблицы) до тех пор, пока соединение не будет закончено. Если другие пользователи, пытающиеся писать одновременно, останавливаются за исключением, это нормально.
  2. Установить соединения, обозначенные как доступные только для чтения, которые не конфликтуют с действиями других пользователей.

Спасибо.

+5

Ну, как я уже сказал в первом абзаце, я знаю, что SQL Server лучше, но это не мой выбор. Я также дал понять, что сделал поиск, и есть разные мнения о доступе и многопользовательской аренде. Не лучший комментарий. – Tekito

ответ

6

Чтобы открыть ACCDB в монопольном режиме вам нужно добавить этот ключ/значение в вашей строке соединения

Mode=Share Exclusive; 

Это будет блокировать другого пользователя, чтобы подключиться к одной и той же базе данных, пока вы близко и расположить соединение, что таким образом открывает базу данных.

Если я хорошо помню, возможные значения (довольно Пояснения) для режима ключевого слова в строке соединения JET являются

Mode='Read'; 
Mode='Write'; 
Mode='ReadWrite'; 
Mode='Share Deny None'; 
Mode='Share Deny Read'; 
Mode='Share Deny Write'; 
Mode='Share Exclusive'; 

Я попробовал различные комбинации вышеуказанных флагов, но я не могу найти простое решение, позволяющее открыть одно единственное соединение в ReadWrite, в то время как следующие подключения автоматически возвращаются к Read Only. Вероятно, в вашем сценарии лучший путь - иметь локальное соединение (не глобальное), попробуйте открыть его в Share Exclusive, если вам нужно записать в базу данных и поймать исключение, если вы не можете открыть базу данных, предоставив пользователю параметр «Повторить» , Нелегкий путь, который я знаю. Посмотрим, сможет ли пользователь с лучшими знаниями MS-Access дать более сложное решение.

Я согласен с вышеприведенным комментарием (и вашей собственной оценкой), что это не лучший инструмент для работы с базами данных в ситуациях параллелизма, однако сейчас все намного лучше.
Я нахожу this answer хорошо написанным, содержательным и сбалансированным взглядом на силу и слабость доступа к проблемам параллелизма.

+0

Спасибо, я попробую на следующей неделе, 17:00 здесь :). Я сам столкнулся с этой ссылкой, но в разделе «3» Locks и .NET' он кажется очень неуверенным, есть ли способ блокировки с помощью «Oledb' ... – Tekito

+0

' Share Exclusive' блокирует все. Протестировано с помощью примерной программы и пытается открыть тот же ДБ с помощью Access, и я получаю сообщение об ошибке _File в Use_. – Steve

+0

Спасибо, я помету ответ, если это будет следующим шансом, который я получу (понедельник). Есть ли способ разрешить одновременные подключения, которые только считывают данные?Если нет, это решение, вероятно, все еще достаточно хорошо ... очевидно, имея дело с грубой настройкой. – Tekito

Смежные вопросы