Ошибка 3251 в OpenSchema для отображения текущих пользователей БД - PullRequest
0 голосов
/ 02 октября 2018

У меня есть две базы данных одного и того же 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

1 Ответ

0 голосов
/ 17 октября 2018

Что ж, случается, что БД, скорее всего, повреждена и, вероятно, испортила что-то в ОЗУ для использования Access, потому что я пытался создать совершенно новую БД и скопировать каждый элемент проблемного в более новый, когда столкнулся сошибка и несколько дней спустя, это не сработало в то время.

То, о чем я не думал, это то, что мы никогда не выключали наши компьютеры на работе, чтобы ИТ-специалисты могли проводить обслуживание ночью, поэтому ОЗУ никогда не полностью сбрасывается из одного дня в другой.

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

Так что да.Спасибо Access за эти последние недели за буквальную пустоту и спасибо за то, что я не думал о том, чтобы сделать правильную перезагрузку, чтобы начать заново (фактически, что-то подобное получилось несколько лет назад, процесс просто отказывался запускать файл, в котором он находился, иликак это называлось, перезагрузил компьютер через два дня и это заработало как прелесть).

...