ms-access-2013 - OpenSchema 上的错误 3251 以列出当前数据库用户
问题描述
我有两个相同 BE 的数据库,一个是旧的,它的替换是由一个较新的项目制成的。表和它们的结构是相同的,只是数据不同。
我正在 FE 上创建一些可用的自动维护选项,以便其他没有任何 ACCESS 知识的人可以执行诸如从主数据库中获取特定记录和存档专用记录之类的任务。为此,我需要检查除了进行维护的用户之外的其他任何人是否连接到数据库。如果是,则直接中止,如果不是,则继续(至少现在,我稍后会改进)。
我正在尝试通过使用此 OpenSchema 查询列出所有活动数据库用户来进行此验证:
cn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
(cn 是一个 ADODB.Connection 对象)
但我不知道为什么,它在较新的数据库上返回错误 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=\\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
我主要从 CurrentProject.ConnectionString 的查询中获得 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
解决方案
好吧,数据库很可能已损坏,并且可能搞砸了 RAM 中的某些内容以供 Access 使用,因为我尝试创建一个全新的数据库并将有问题的数据库的每个元素复制到新的数据库中,当我遇到错误和一些几天后,它当时不起作用。
我没有想到的是,我们从来没有在工作时关闭我们的计算机,以便 IT 可以在晚上进行维护,因此 RAM 永远不会从一天到另一天完全刷新。
本周尝试了完全相同的事情,它就像一个魅力。我想 IT 需要重新启动所有 PC,否则自从我上次尝试以来我们遇到了电力故障。
是的。感谢 Access 在过去几周几乎没有任何问题,感谢我没有考虑进行适当的重新启动以重新开始(实际上几年前就有类似的事情,proc 只会拒绝启动它所在的文件或它被称为的方式,两天后重新启动计算机,它就像一个魅力一样工作)。
推荐阅读
- sccm - Set-CMTaskSequenceDeployment 的问题
- python - colab中如何导入AdversarialModel、simple_gan、gan_targets
- python - 具有重复项的类的多标签编码
- c# - 刷新选项卡 WPF 中的信息
- wpf - 如何使用 Scroll 事件刷新 Slider 的位置?
- ios - 如何在 swift 中使用自定义 url 加载 webview
- android - java.io.EOFException: \n not found: size=0 content=...
- android - Android Jetpack 导航深层链接在 AndroidManifest 上生成效果不佳
- django - DRF:如何根据字段权限限制嵌套序列化程序中的字段?
- javascript - 如何在 Facebook 应用内浏览器中接收邮件?