ADODBAPI数据库打开连接数

1 投票
1 回答
753 浏览
提问于 2025-04-18 13:39

我想知道当前与一个ms-access数据库连接的数量。

比如说,有两个应用程序正在使用同一个数据库。那么我该如何获取这个连接数量呢?ms-access有没有相关的函数,或者在pypyodbc中有没有这样的功能?

使用adodbapi,我该如何获取与数据库的打开连接数量呢?

我尝试了以下代码。

#importing adodbapi 
import adodbapi # success 
#connection to database using the DSN 'test'
myConn = adodbapi.connect('test') # success
#get no. of open connection using openschema 
myConn.connector.OpenSchema(-1, None,"{947bb102-5d43-11d1-bdbf-00c04fb92675}") #fail

但是出现了以下错误。

pywintypes.com_error: (-2147352567, '发生了异常。', (0, u'ADODB.Connection', u'对象或提供者无法
执行请求的操作。', u'C:\WINDOWS\HELP\ADO270.CHM',
1240648, -2146825037), None)

有没有人能提供解决方案呢?

1 个回答

1

我个人觉得在这种情况下,不用太纠结于adodbapi,直接让我的Python脚本写一个小的VBScript,来创建一个用制表符分隔的机器列表,这些机器上有打开的连接,然后通过subprocess.Popen来运行这个VBScript,并解析结果就可以了。

import os
import subprocess

## test data
databaseFileSpec = r"Z:\pyTest.mdb"

vbsFileSpec =  os.environ['TEMP'] + r"\mypytemp.vbs"

scriptCode = """Option Explicit
Dim con, rst, strOut, strSeparator
Const adSchemaProviderSpecific = -1
Set con = CreateObject("ADODB.Connection")
con.Open( _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source="""
scriptCode += databaseFileSpec
scriptCode += """")
Set rst = con.OpenSchema( _
        adSchemaProviderSpecific, _
        , _
        "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
strOut = ""
strSeparator = ""
Do While Not rst.EOF
    If rst(2).Value = "True" Then
        strOut = strOut & strSeparator & Left(rst(0).Value, Len(Trim(rst(0).Value)) - 1)
        strSeparator = vbTab
    End If
    rst.MoveNext
Loop
WScript.Echo strOut
rst.Close
con.Close"""

f = open(vbsFileSpec, 'w')
f.write(scriptCode)
f.close()

tabString = subprocess.Popen(
    "cscript /nologo \"" + vbsFileSpec + "\"",
    shell=True,
    stdout=subprocess.PIPE).stdout.read()
os.remove(vbsFileSpec)

print 'The following machines are connected to "' + databaseFileSpec + '":'
for x in tabString.split("\t"):
    print x

当我在两台不同的机器上打开数据库并运行上面的脚本时,我得到了

The following machines are connected to "Z:\pyTest.mdb":
TESTPC
GORD01
GORD01

我的笔记本(GORD01)出现了两次,因为我在Access中打开了数据库,而VBScript在运行时也保持了一个连接。

撰写回答