我应该使用 pyodbc 还是 win32com 使用 python 填写 Microsoft Access 数据库 (.accdb) 中的预先存在的表格?

Posted

技术标签:

【中文标题】我应该使用 pyodbc 还是 win32com 使用 python 填写 Microsoft Access 数据库 (.accdb) 中的预先存在的表格?【英文标题】:Should I use pyodbc or win32com to fill out pre-existing forms in a Microsoft Access Database (.accdb) using python? 【发布时间】:2020-04-15 15:29:40 【问题描述】:

我编写了一个从 word 文档中提取字符串的 python 脚本。目标是然后将这些字符串插入到 Access 数据库中预先存在的表单中,保存它,创建表单的副本,从下一个 word 文档中插入不同的字符串,保存,重复。该表单已经包含了我需要的所有字段,并且有“保存”和“创建副本”按钮。

我无法弄清楚如何将字符串插入 Access 表单。

到目前为止,我已经了解到至少有两种方法可以做到这一点,使用 pyodbc 或 win32com。

我使用了以下链接中的代码:

pyodbc - https://datatofish.com/how-to-connect-python-to-ms-access-database-using-pyodbc/

win32com - Write to MS Access table, python win32com

我解决了将 64 位 python 连接到 32 位访问的问题,并且我能够使用 win32com 和 pyodbc 连接到我的 accdb 文件,但就我所知。

pyodbc:

import pyodbc

conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\path\folder\my_database_file.accdb;')
cursor = conn.cursor()

win32com:

import win32com.client

# ADODB constants
adVarWChar = 202
adInteger = 3
adParamInput = 1

connection = win32com.client.Dispatch(r'ADODB.Connection')

DSN = (
    r'PROVIDER=Microsoft.ACE.OLEDB.12.0;'
    r'DATA SOURCE=C:\path\folder\my_database_file.accdb;'
    )

connection.Open(DSN)

cmd = win32com.client.Dispatch(r'ADODB.Command')
cmd.ActiveConnection = connection

pyodbc 还是 win32com,哪种方法更好/更容易使用?

另外,一旦我选择了一种方法,我该如何继续?我无法找到有关如何使用这些方法在 Access 中填写表单的文档。我发现的大部分内容都是关于如何在 Access 中填写表格,我不确定如何转录该代码以使用表单,或者该代码最初来自何处。

我没有包含从 word 文档中提取字符串的代码,这部分工作正常,并不是问题的一部分,只是背景信息。

任何正确方向的建议或指示将不胜感激。

【问题讨论】:

【参考方案1】:

首先,MS Access 表单和报告不存储任何数据,而是在运行时应用与表或查询数据的可视交互。

其次,您的问题显示了 MS Access 是如何既是 GUI 应用程序又是数据库的multifaceted thing。因此,您的两种方法(win32compyodbc)有些明显不同并且部分重叠。通常,有两种方式与此软件进行交互:

前端

    只需使用已安装的 Microsoft Office 软件 MSAccess.exe 以及所有启用的用户界面功能来设计和使用其对象:表格、查询、表单、报告、宏和模块。

    通过编程代码,通过外部客户端(如 Excel VBA、Python 或任何其他与 COM 连接的语言或 API)与Microsoft Access object library 建立接口。

    在 Python 中,使用 win32com 允许您访问 MS Access 的 GUI 对象,其中包括表单和报告以及任何其他访问方法,例如 DoCmd.TransferSpreadsheetApplication.ImportXML。要运行查询,您需要访问 Access 应用程序对象的底层数据库。总的来说,这种方法需要在客户端计算机上安装成熟的 Office 应用程序 MSAccess.exe。

后端

使用几乎任何现代通用语言(如 Python)和相应的库,通过 ODBC 或 OLEDB 连接到 .accdb(或 .mdb)文件的基础数据库。

在 Python 中,使用 pyodbc(或 adodbapi)仅允许您与 Jet/ACE 数据库(Window .dll 文件)进行交互。您不能与任何 GUI 对象(包括表单和报告)进行交互,而只能与表和存储的查询进行交互,并且只能使用由应用层调用的 SQL,这里是 Python。总的来说,这种方法不需要在客户端计算机上安装成熟的 Office 应用程序 MSAccess.exe。


话虽如此,对于您的特定需求,您可能不需要更长、更广泛的win32com 前端方法,因为 Access 表单旨在输入/更新/删除基础表中的数据。换句话说,它们是用户友好的数据处理方式。因此,只需绕过用户界面需求,将提取的 Word 数据直接导入表单后面的数据库表中,pyodbc 是一种更简单的后端方法。

具体来说,回答您的问题:

我编写了一个从 Word 文档中提取字符串的 Python 脚本。目标是然后将这些字符串插入到 Access 数据库中预先存在的表单中,保存它,创建表单的副本,从下一个 word 文档中插入不同的字符串,保存,重复。

首先,除了数据之外,没有人应该复制实际的表单对象。相反,使用cursor 对象和参数化将数据插入到表单后面的数据源中:

# APPEND QUERY WITH PARAMETERS
sql = """INSERT INTO myTableBehindmyForm (Field1, Field2, Field3, ...)
         VALUES (?, ?, ?, ...)
      """

# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))

表单已经包含了我需要的所有字段,并且有“保存”和“创建副本”按钮。我无法弄清楚如何将字符串插入 Access 表单。

要保存,只需提交上述查询并复制,重复cursor.execute 调用:

# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
conn.commit()


# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
conn.commit()

我发现的大部分内容都是关于如何在 Access 中填写表格,但我不确定如何转录该代码以使用表单,或者该代码最初来自何处。

同样,无需使用表单(无数据 GUI 对象),只需使用表单后面的表格即可。因此,请使用 pyodbc 或任何兼容的 MS Access 和 Python DB-API 来处理您的数据需求。

【讨论】:

啊,我明白了,我错误地认为表单是我应该处理的。您对表格背后的表格的解释是实际保存数据的内容是巨大的,我不会想到走那条路。感谢您的澄清和措辞非常好的回答,非常感谢。

以上是关于我应该使用 pyodbc 还是 win32com 使用 python 填写 Microsoft Access 数据库 (.accdb) 中的预先存在的表格?的主要内容,如果未能解决你的问题,请参考以下文章

pyodbc - ImportError:DLL 加载失败:

我应该使用 Direct3D 还是只使用 Windows GDI 来获得花哨/高性能的 Win32 应用程序 UI? [关闭]

Pyodbc 变量查询

C++在建工程时,应该选择Win32 Application还是Win32 Console Application?它两之

在 colab 上与 Cloudera Impala 的 pyodbc 连接失败

在 Win32 中显示带 alpha 通道的 32 位图像