Быстрый вопрос для вас экспертов по базам данных. Смотрите следующий код (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) все еще создается/удаляется в каталоге, пока соединение активно. Разумеется, это противоречит команде только для чтения, что должно означать, что никакие данные не могут быть записаны, и поэтому не требуется блокировка файлов.
Может ли кто-нибудь объяснить, что здесь происходит? Благодарю.
Редактировать: И последующие действия - если бы я хотел открыть соединение как чистое только для чтения, не создавая файл блокировки, есть ли какой-либо другой метод?
Спасибо, но мне интересно, почему соединение только для чтения повлияет на способность другого пользователя вносить изменения. Наверное, это то, что доступно только для чтения, верно? Чтобы добавить контекст: я являюсь единственным конструктором документа, а соединение с базой данных является коротким и выполняется только через VBA. Никто не подключается к БД и оставляет его открытым. У меня есть событие Excel Workbook_Open, которое загружает данные, а затем, когда пользователь вносит изменения, выполняются короткие соединения для записи данных. Я просто не хочу, чтобы кто-то был лишен возможности писать, потому что другой пользователь находится в процессе загрузки исходных данных (что занимает несколько секунд). –
Извините, я полностью не понял вопрос. Я думал, что это просто вопрос о том, почему файл блокировки создается для подключения только для чтения. Пожалуйста, подумайте над тем, чтобы пересмотреть вопрос, чтобы уточнить, что вы на самом деле после. Тогда я могу удалить этот ответ. – HansUp
О, ваш ответ очень интересный - и оценили! Он действительно решает вопрос, который я задал. Это был просто подразумеваемый вторичный вопрос о том, есть ли что-нибудь еще, что я могу сделать, чтобы предотвратить блокировку. Я не спрашивал об этом изначально, потому что я не был уверен, было ли это поведение ошибкой или нет. Я добавил дополнительный вопрос в качестве комментария. –