У меня есть две базы данных одного и того же BE, одна старая, и ее замена сделана из более нового проекта.Таблицы и их структура одинаковы, отличаются только данные.
Я создаю некоторые автоматизированные параметры обслуживания, доступные в FE, чтобы другие люди, не обладающие знаниями ACCESS, могли выполнять такие задачи, как получение определенных записей из основной БД ив сторону архива, посвященного.Для этого мне нужно проверить, подключен ли кто-либо еще, кроме одного пользователя, выполняющего техническое обслуживание, к БД.Если да, просто прервите, если нет, продолжайте (пока, по крайней мере, я исправлю вещи позже).
Я пытаюсь выполнить эту проверку, перечислив всех активных пользователей БД с этим запросом OpenSchema:
cn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
(cn является объектом ADODB.Connection)
Но я не могу понять, почему, он возвращает ошибку 3251 «Объект или поставщик не способен выполнить запрошенную операцию» на более новой версииБД, в то время как ее старая сущность работает как шарм (с той же ConnectionString).Я мог бы просто скопировать таблицы в рабочей БД вручную, но я ожидаю, что это вызовет скрытые проблемы по сравнению с чистым извлечением BE из ACCDB, даже не упоминая о возможной человеческой ошибке.
Я попытался сравнить дваБД и найдите любую разницу, которая может объяснить поведение (проверка свойств БД и проекта по одному, автоматические и ручные соединения, с таблицами, модулями, паролями и т. Д. И без них), но у меня заканчиваются идеи.
У кого-нибудь есть идея или намек на то, что может быть причиной этого?При необходимости я могу предоставить сокращенные версии двух БД (наличие в них чего-либо или нет).
Конечно, если у вас есть другое решение, чтобы проверить, является ли пользователь единственным, использующим базу данных, ипросто полностью обойди метод OpenSchema, у меня все уши.
ОБНОВЛЕНИЕ 03-10-2018
Вот функция, используемая для проверки.
Public Function checkMultipleUsers()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim nbUsers As Integer
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"User ID=Admin;" & _
"Data Source=\\SERVERPATH\Project_BE.accdb;" & _
"Mode=Share Deny None;" & _
"Extended Properties="""";" & _
"Locale Identifier=1036;" & _
"Jet OLEDB:System database=C:\Users\MyUser\AppData\Roaming\Microsoft\Access\System.mdw;" & _
"Jet OLEDB:Registry Path=Software\Microsoft\Office\15.0\Access\Access Connectivity Engine;" & _
"Jet OLEDB:Database Password=""PASSWORD"";" & _
"Jet OLEDB:Engine Type=6;" & _
"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=True;" & _
"Jet OLEDB:Bypass UserInfo Validation=False;" & _
"Jet OLEDB:Limited DB Caching=False;" & _
"Jet OLEDB:Bypass ChoiceField Validation=False"
cn.Open
nbUsers = 0
' The user roster is exposed as a provider-specific schema rowset
' in the Jet 4.0 OLE DB provider. You have to use a GUID to
' reference the schema, as provider-specific schemas are not
' listed in ADO's type library for schema rowsets
Set rs = cn.OpenSchema(adSchemaProviderSpecific, _
, "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
While Not rs.EOF
If rs.Fields(2) = True Then
nbUsers = nbUsers + 1
End If
rs.MoveNext
Wend
If nbUsers = 1 Then
checkMultipleUsers = False
ElseIf nbUsers > 1 Then
checkMultipleUsers = True
Else
MsgBox ("ACCESS can't determine the number of users. Operation aborted.")
checkMultipleUsers = 0
End If
rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing
End Function
Я получил параметры ConnectionString в основном из запроса CurrentProject.ConnectionString, но сокращение их до приведенных ниже не будет работать, поэтому я не ожидаю, что они будут проблемой.
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=\\SERVER\Project_BE.accdb;" & _
"Jet OLEDB:System database=C:\Users\MyUser\AppData\Roaming\Microsoft\Access\System.mdw;" & _
"Jet OLEDB:Registry Path=Software\Microsoft\Office\15.0\Access\Access Connectivity Engine;" & _
"Jet OLEDB:Database Password=""PASSWORD"";"
cn.Open