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

问题描述

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

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

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

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

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

win32com -写入 MS Access 表,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 文档中提取字符串的代码,这部分工作正常,并不是问题的一部分,只是背景信息。

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

标签: pythonms-accesspyodbcwin32com

解决方案


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

其次,您的问题表明 MS Access 是一个多方面的东西,既是 GUI 应用程序又是数据库。因此,您的两种方法 (win32compyodbc) 有些明显不同并且部分重叠。通常,有两种方法可以与此软件进行交互:

前端

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

  2. 通过编程代码,通过外部客户端(如 Excel VBA、Python 或任何其他与 COM 连接的语言或 API)连接到Microsoft Access 对象库。

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

后端

  • 使用几乎任何现代通用语言(如 Python)和相应的库连接到.accdb(或)文件的底层数据库,例如使用 ODBC 或 OLEDB。.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 来处理您的数据需求。


推荐阅读