首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该使用pyodbc或win32com来使用python在Microsoft数据库(.accdb)中填写预先存在的表单吗?

我应该使用pyodbc或win32com来使用python在Microsoft数据库(.accdb)中填写预先存在的表单吗?
EN

Stack Overflow用户
提问于 2020-04-15 15:29:40
回答 1查看 589关注 0票数 1

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

我在弄清楚如何将字符串插入访问表单时遇到了困难。

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

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

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

win32com - 写到MS访问表,python win32com

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

pyodbc:

代码语言:javascript
运行
复制
import pyodbc

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

win32com:

代码语言:javascript
运行
复制
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中填写表,我不知道如何转录代码来使用表单,或者这些代码最初是从哪里来的。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-15 17:58:50

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

其次,您的问题显示了MS Access是如何既是GUI应用程序又是数据库的https://meta.stackexchange.com/questions/33216/ms-access-or-mdb-or-access-database-engine-or-ms-jet-ace。正因为如此,您的两种方法(win32compyodbc)有一些明显的不同和部分重叠。通常,与该软件交互的方式有两种:

前端

  1. 只需使用已安装的Microsoft软件MSAccess.exe,就可以设计和使用其对象:表、查询、表单、报表、宏和模块。
  2. 通过编程代码,通过外部客户机(如Excel、Python或任何其他与COM连接的语言或API )与Microsoft Access对象库的接口。 在Python中,使用win32com可以访问methods的GUI对象,其中包括表单和报表以及任何其他访问方法,如DoCmd.TransferSpreadsheetApplication.ImportXML。要运行查询,需要访问access应用程序对象的基础数据库。总的来说,这种方法需要安装在客户端机器上的成熟的Office应用程序MSAccess.exe。

后端

  • 连接到.accdb (或.mdb)文件的底层数据库,例如使用ODBC或OLEDB,使用任何现代的通用语言(如Python ),并使用相应的库。 在Python中,使用pyodbc (或adodbapi)只允许您与Jet/ACE数据库(窗口.dll文件)进行交互。您不能与任何GUI对象(包括表单和报表)交互,只能与表和存储的查询交互,并且只能使用由应用程序层调用的SQL (这里是Python )。总的来说,这种方法不需要在客户端机器上安装完整的Office应用程序MSAccess.exe。

尽管如此,为了满足您的特定需求,您可能不需要更长、更广泛的win32com前端方法,因为访问表单的设计目的是在底层表中输入/更新/删除数据。换句话说,它们是对用户友好的数据处理手段.因此,只需绕过用户界面的需要,并使用pyodbc直接将提取的Word数据导入表单后面的数据库表中,这是一种简单得多的后端方法。

具体来说,要回答你的问题:

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

首先,除了数据之外,任何人都不应该重复实际的表单对象。相反,使用cursor对象和参数化将数据插入表单后面的数据源:

代码语言:javascript
运行
复制
# 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, ...))

表单已经有了我需要的所有字段,它有“保存”和“创建副本”的按钮。我很难在访问表单中插入字符串。

为了保存,只需提交上面的查询和复制,重复cursor.execute调用:

代码语言:javascript
运行
复制
# 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和Python来处理您的数据需求。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61232578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档