【问题标题】:Can't open MS ACESS Database with ADOBDAPI无法使用 ADODB API 打开 MS ACCESS 数据库
【发布时间】:2019-07-17 13:00:41
【问题描述】:

当我尝试使用 Python ADODBAPI 库连接到 MS-Access 数据库时,我收到一条错误消息。

我曾尝试使用 Microsoft.ACE.OLEDB.12.0 提供程序,但它是同一回事。 我可以在同一台计算机上使用 C# 中的 Microsoft.Jet.OLEDB.4.0 提供程序打开数据库。

# -*- coding:Utf-8 -*-

import sys
import adodbapi
import argparse

__version__ = 1.0
debugmode = False

# Constantes de connection sur la base de donnees.

MDB = 'D:\lp_2012_3.mdb'
DRV = 'Microsoft.Jet.OLEDB.4.0'
PWD = ''
conn_string = r'Provider=%s; Data Source=%s' % (DRV,MDB)

def main():

    #Connection a la base de donnees.
    print('%s'%conn_string)
    conn = adodbapi.connect(conn_string)
    conn.autocommit = False
    cur = conn.cursor()

    #Definition de la requete
    SQLselect = 'SELECT TOP 10 * FROM PERSONNE;'
    # Lancement de la requete 
    record = cur.execute(SQLselect).fetchall()
    #print('%s'%(type(cur.description)))
    #Get columns name
    entete = []
    for fld in cur.columns('PERSONNE'):
        entete.append(fld.column_name)
        #print(fld.table_name, fld.column_name)
    #print('%s'%(entete))

    cur.close()
    conn.close()

if (__name__ == '__main__'):
    #Recupere les arguments transmis
    parser = argparse.ArgumentParser()
    parser.add_argument('-v', '--verbose', action = 'store_true', help = 'augmente la verbosité')
    parser.add_argument('-l', '--log', action = 'store_true', help = 'active le mode log')
    parser.add_argument('-d', '--debug', action='store_true', help='debug mode')
    args = parser.parse_args()
    #applique la configuration
    if args.debug:
        debugmode = True
    sys.exit(main())

我有以下错误代码:

adodbapi.apibase.OperationalError: (InterfaceError("Windows COM Error: >Dispatch('ADODB.Connection') failed."), '打开连接时出错 >"Provider=Microsoft.Jet.OLEDB.4.0; 数据源=D:\lp_2012_3.mdb"')

感谢您的帮助。

PS : 有些人还在使用 MS-ACCESS。

【问题讨论】:

  • 首先,避免使用% 运算符进行字符串插值,因为unofficially deprecatedstr.format()。尝试将文件路径中的反斜杠加倍,切换到正斜杠,或使用原始字符串:r"D:\lp_2012_3.mdb"。也可以试试 ACE 版本:Microsoft.ACE.OLEDB.12.0
  • 感谢您的 cmets。所以我尝试了 ACE 提供程序,它是相同的错误 adodbapi.apibase.OperationalError: (InterfaceError("Windows COM Error: Dispatch('ADODB.Connection') failed."), 'Error opening connection to "Provider=Microsoft.ACE. OLEDB.12.0;数据源=D:\\lp_2012.mdb"')
  • 通过运行 Powershell script 检查您是否安装了这些提供程序。怎么跑?搜索并打开“Windows PowerShell ISE”(x86 用于 32 位,非 x86 用于 64 位)并在新脚本中复制/粘贴代码,然后单击运行。见docs
  • 感谢您的回答。这个 PS 脚本向我展示了 Microsoft.ACE.OLEDB.16.0 和 Microsoft.ACE.OLEDB.12.0 提供程序。所以我不明白为什么 Microsoft.ACE.OLEDB.12.0 提供程序会返回错误。
  • 检查您的 Python 版本是运行 32 位还是 64 位。如果是前者,您必须使用 32 位 OLEDB 提供程序,同样适用于 64 位。此外,您的连接假定数据库不受密码保护并且其目录是可写的。

标签: python ms-access-2010 adodbapi


【解决方案1】:

如果可以使用不同的模块...

在最近的项目中使用了 pyodbc 模块后,我发现与 adodbapi 模块相比问题要少得多。 pyodbc 目前仍在维护中(与 adodbapi 不同,我被告知)并且有更好的文档。

如果您需要执行参数化查询请确保使用 4.0.27 或更高版本,如https://github.com/mkleehammer/pyodbc/issues/509 所述。

我已使用 64 位 ACE 驱动程序(正确安装后)成功连接到 MS Access 2016,如下所示:

connectionString = (
    f'Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={database_path};'
)
connection = odbc.connect(connectionString, autocommit = True)

双括号用于转义驱动程序名称周围所需的括号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多