OpenSchema 上的错误 3251 列出当前数据库用户



我有两个相同BE的数据库,一个是旧的,它的替代品是由一个较新的项目制成的。表及其结构相同,只是数据不同。

我正在 FE 上创建一些可用的自动维护选项,以便其他没有任何 ACCESS 知识的人可以执行任务,例如将特定记录从主数据库中取出并转到存档专用数据库。为此,我需要检查除了进行维护的用户之外是否有其他人连接到数据库。如果是,则明显中止,如果不是,请继续(至少现在,我稍后会改进(。

我正在尝试通过使用此 OpenSchema 查询列出所有活动数据库用户来进行此验证:

cn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")

(cn 是 ADODB。连接对象(

但是我不知道为什么,它在较新的数据库上返回错误3251"对象或提供程序无法执行请求的操作",而其旧自我就像一个魅力(使用相同的ConnectionString(。我可以手动复制工作数据库中的表,但与从 ACCDB 进行干净的 BE 提取相比,我希望它会导致隐藏的麻烦,甚至没有提到任何可能的人为错误。

我试图比较两个数据库并发现任何可以解释行为的差异(逐个检查数据库和项目属性,自动和手动连接,有和没有表、模块、密码等......(,但我没有想法了。

任何人都对可能导致这种情况的原因有任何想法或暗示吗?如果需要,我可以提供两个数据库的剥离版本(其中包含任何内容或不给出相同的结果(。

当然,如果您有另一种解决方案来检查用户是否是唯一使用数据库的用户,并且完全绕过 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=\SERVERPATHProject_BE.accdb;" & _
"Mode=Share Deny None;" & _
"Extended Properties="""";" & _
"Locale Identifier=1036;" & _
"Jet OLEDB:System database=C:UsersMyUserAppDataRoamingMicrosoftAccessSystem.mdw;" & _
"Jet OLEDB:Registry Path=SoftwareMicrosoftOffice15.0AccessAccess 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

我主要从 CurrentProject.ConnectionString 的查询中获取了 ConnectionString 参数,但将它们减少到下面的参数也不起作用,所以我不希望它们成为问题所在。

cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=\SERVERProject_BE.accdb;" & _
"Jet OLEDB:System database=C:UsersMyUserAppDataRoamingMicrosoftAccessSystem.mdw;" & _
"Jet OLEDB:Registry Path=SoftwareMicrosoftOffice15.0AccessAccess Connectivity Engine;" & _
"Jet OLEDB:Database Password=""PASSWORD"";"
cn.Open

好吧,碰巧数据库很可能已损坏,并且可能在 RAM 中搞砸了一些东西以供访问使用,因为我试图创建一个全新的数据库并将有问题的数据库的每个元素复制到较新的元素中当我遇到错误时,几天后,它当时不起作用。

我没有想到的是,我们从来没有在工作中关闭我们的电脑,所以IT可以在晚上进行维护,因此RAM永远不会从一天到另一天完全刷新。

本周尝试了完全相同的事情,它就像一个魅力。我想IT需要重新启动所有PC,或者自从我上次尝试以来我们遇到了电气故障。

所以是的。感谢 Access 在过去的几周里几乎一无所获,并感谢我没有考虑进行适当的重新启动以重新开始(实际上几年前有类似的东西,一个 proc 会拒绝启动它所在的文件或它被称为的方式,两天后重新启动计算机,它就像一个魅力(。

最新更新