Как подключить данные только для чтения к заблокированному MS Access Access для чтения и записи, используя MS Excel?

385
Pherdindy

Меня беспокоит то, что в файле, к которому я хочу подключиться, есть блокировка чтения-записи, потому что он используется приложением, как показано: Заблокированный файл MS Access

Когда я пытаюсь обновить подключение к данным в MS Excel, появляются следующие ошибки / уведомления, потому что он не может установить соединение с используемым файлом MS Access:

1st

2nd

3rd

4th

Мне интересно, есть ли опция в MS Access, которая deny writeтолько, но allow readили что-то, что позволит мне установить read-only data connectionв мой файл MS Excel, даже если он заблокирован.

Я нашел record-level lockingварианты в файле MS Access, но я обеспокоен тем, что это может вызвать проблемы у пользователей основного приложения, которое записывает данные в файл MS Access. Я пытался отключить его, но он все еще заблокирован. Отображаются параметры: параметры блокировки на уровне записи

Строка подключения моего подключения данных Excel к файлу Access показана ниже:

Provider=Microsoft.ACE.OLEDB.12.0; User ID=Admin; Data Source=C:\Users\ACER\Desktop\Test.MDB; Mode=Share Deny Write; Extended Properties=""; Jet OLEDB:System database=""; Jet OLEDB:Registry Path=""; Jet OLEDB:Engine Type=5; Jet OLEDB:Database Locking Mode=0; Jet OLEDB:Global Partial Bulk Ops=2; Jet OLEDB:Global Bulk Transactions=1; Jet OLEDB:New Database Password=""; Jet OLEDB:Create System Database=False; Jet OLEDB:Encrypt Database=False; Jet OLEDB:Don't Copy Locale on Compact=False; Jet OLEDB:Compact Without Replica Repair=False; Jet OLEDB:SFP=False; Jet OLEDB:Support Complex Data=False 
0
Комфортно ли вам с VBA устанавливать соединение только для чтения из Access в Excel? Rajesh S 5 лет назад 0
Да, я вполне доволен VBA. Если у вас есть решение, оно будет оценено Pherdindy 5 лет назад 0
Хорошо, подожди, давай сначала дадим мне кодекс! Rajesh S 5 лет назад 0
Чтобы установить режим, либо установите свойство режима подключения, либо строку подключения. `db.Open" Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = c: \ test.mdb; Persist Security Info = False; Mode = Read; "` Установите этот флажок, если щелкнуть по вам, тогда я опубликую его как ответ. Rajesh S 5 лет назад 0
** Продолжение ** Другое, если вы можете хранить Databasee в общей папке, где другие пользователи имеют разрешение только на чтение. Тогда они по-прежнему смогут просматривать, но не изменять данные в связанной таблице. Rajesh S 5 лет назад 0
@RajeshS Я разместил свою строку подключения в главном сообщении, я не уверен, где разместить, где я должен заменить `Provider = Microsoft.ACE.OLEDB.12.0;` в первой строке моей строки подключения на "db.Open" Provider = Microsoft.Jet.OLEDB.4.0; `? Pherdindy 5 лет назад 0

1 ответ на вопрос

0
Rajesh S

Вы можете использовать этот VBA для подключения базы данных Access в режиме только для чтения:

Sub ReadFromAccess() Dim cn As Object, rs As Object Dim intColIndex As Integer Dim DBFullName As String Dim TargetRange As Range  DBFullName = "C:\Users\Username\Desktop\Sample.mdb"  Application.ScreenUpdating = False  Set TargetRange = Sheets("Sheet1").Range("A1") Set cn = CreateObject("ADODB.Connection") cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBFullName & ";" & "Persist Security Info=False;Mode=Read;"  Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM Table Name", cn,, , adCmdText  For intColIndex = 0 To rs.Fields.Count - 1 TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name Next  TargetRange.Offset(1, 0).CopyFromRecordset rs  Application.ScreenUpdating = True On Error Resume Next rs.Close Set rs = Nothing cn.Close Set cn = Nothing On Error GoTo 0 Exit Sub  End Sub 

NB

  • Путь к файлу C: \ Users \ Имя пользователя \ Desktop \ Sample.mdb и Sheets ("Sheet1"). Диапазон ("A1") можно редактировать.
  • Вместо переменной DBFullName вы можете использовать путь к файлу C: \ Users \ Username \ Desktop \ Sample.mdb, как я показал в комментариях.

,

Потрясающие. Я попробую это завтра :). Pherdindy 5 лет назад 0
У меня есть синтаксическая ошибка в этой строке: `cn.Open" Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = "& DBFullName &"; " Сохранить информацию о безопасности = False; Mode = Read; "` Pherdindy 5 лет назад 0
Хорошо, я думаю, что нашел ошибку. Строка должна быть: `cn.Open" Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = "& DBFullName &"; " & "Persist Security Info = False; Mode = Read;" `просто не хватает амперсанда и точки с запятой в конкатенации строк Pherdindy 5 лет назад 0
Хороший код это спасатель Pherdindy 5 лет назад 0
@Pherdindy, рад помочь тебе, продолжай спрашивать ☺ Rajesh S 5 лет назад 0
@Pherdindy, да знак & пропал, теперь я редактировал пост, спасибо. ☺ Rajesh S 5 лет назад 0
Привет, мне нравится ваш код, так как это единственное решение, которое у меня есть на данный момент. Меня беспокоит то, что я получаю эту ошибку: «Метод« CopyFromRecordset »объекта« Range »не работает» на других компьютерах, в то время как на некоторых он работает отлично. Знаете ли вы, что вызывает эту ошибку? Pherdindy 5 лет назад 0
@Pherdindy,, may possible the Recordset (data)You retrieve includes Null values. Just Check & confirm it? Rajesh S 5 лет назад 0
@Pherdindy, perhaps Database has very long string in column, the RecordSet retrieves from any MEMO data type may alos generates this error. Rajesh S 5 лет назад 0
Спасибо, что посмотрим на данные, предоставленные базой данных. Это странно, это работает на других компьютерах, но не на некоторых из них Pherdindy 5 лет назад 0

Похожие вопросы