2015-12-09 5 views
4

Быстрый вопрос для вас экспертов по базам данных. Смотрите следующий код (VBA/ADO), вызываемый из Excel:Почему соединение ADO все еще создает файл блокировки «ldb» даже в режиме только для чтения?

Dim DBPath As String, ConnStr As String 
DBPath = ThisWorkbook.Path & Application.PathSeparator & "Database.mdb" 
ConnStr = "Data Source=" & DBPath & ";" & "Jet OLEDB:Database Password=" & DBPass() 
Dim cnn as ADODB.Connection 
Set cnn = New ADODB.Connection 
With cnn 
    .Provider = CheckProvider(strPath:=DBPath) ' Separate function call. Ignore 
    .Mode = adModeRead 
    .Open ConnStr 
End With 
Stop ' To inspect the directory... 

Он должен открыть базу данных, как только для чтения, учитывая "adModeRead" спецификацию. Однако я заметил, что файл блокировки (Database.ldb) все еще создается/удаляется в каталоге, пока соединение активно. Разумеется, это противоречит команде только для чтения, что должно означать, что никакие данные не могут быть записаны, и поэтому не требуется блокировка файлов.

Может ли кто-нибудь объяснить, что здесь происходит? Благодарю.

Редактировать: И последующие действия - если бы я хотел открыть соединение как чистое только для чтения, не создавая файл блокировки, есть ли какой-либо другой метод?

ответ

3

Файл блокировки записывает подключения к файлу db. Эта информация важна в многопользовательском контексте. Даже если ваше единственное соединение и намеренно доступно только для чтения, Access все еще записывает это соединение в файл блокировки. Было бы важно в ситуации, когда другой используемый хотел подключиться к одному и тому же файлу db в эксклюзивном режиме, чтобы внести изменения в конструкцию - им не разрешался бы эксклюзивный доступ, пока ваше соединение все еще активно.

+1

Спасибо, но мне интересно, почему соединение только для чтения повлияет на способность другого пользователя вносить изменения. Наверное, это то, что доступно только для чтения, верно? Чтобы добавить контекст: я являюсь единственным конструктором документа, а соединение с базой данных является коротким и выполняется только через VBA. Никто не подключается к БД и оставляет его открытым. У меня есть событие Excel Workbook_Open, которое загружает данные, а затем, когда пользователь вносит изменения, выполняются короткие соединения для записи данных. Я просто не хочу, чтобы кто-то был лишен возможности писать, потому что другой пользователь находится в процессе загрузки исходных данных (что занимает несколько секунд). –

+0

Извините, я полностью не понял вопрос. Я думал, что это просто вопрос о том, почему файл блокировки создается для подключения только для чтения. Пожалуйста, подумайте над тем, чтобы пересмотреть вопрос, чтобы уточнить, что вы на самом деле после. Тогда я могу удалить этот ответ. – HansUp

+0

О, ваш ответ очень интересный - и оценили! Он действительно решает вопрос, который я задал. Это был просто подразумеваемый вторичный вопрос о том, есть ли что-нибудь еще, что я могу сделать, чтобы предотвратить блокировку. Я не спрашивал об этом изначально, потому что я не был уверен, было ли это поведение ошибкой или нет. Я добавил дополнительный вопрос в качестве комментария. –