【发布时间】:2020-10-01 11:56:14
【问题描述】:
关于如何使用 pyodbc 在 MS Access 中运行查询,以及如何调用已保存在 MS Access 中的查询,网上有很多提示,但是有没有办法将查询/宏存储在MS Access,使用pyodbc、win32com或其他?
然后必须可以从 MS Access 执行保存的请求。
(我的目标是让用户能够自己执行请求)
【问题讨论】:
关于如何使用 pyodbc 在 MS Access 中运行查询,以及如何调用已保存在 MS Access 中的查询,网上有很多提示,但是有没有办法将查询/宏存储在MS Access,使用pyodbc、win32com或其他?
然后必须可以从 MS Access 执行保存的请求。
(我的目标是让用户能够自己执行请求)
【问题讨论】:
您可以通过 Access ODBC 创建保存的 SELECT 查询,如下所示:
crsr = cnxn.cursor()
query_name = "query1"
# emulate DROP VIEW IF EXISTS
view_names = [x.table_name for x in crsr.tables(tableType="VIEW").fetchall()]
if query_name in view_names:
crsr.execute(f"DROP TABLE {query_name}") # yes, DROP TABLE
crsr.execute(f"""
CREATE VIEW {query_name} AS
SELECT * FROM Donor WHERE DonorID = 1
"""
)
cnxn.commit()
您可以通过win32com 和DAO.DBEngine.120 对 Access 数据库执行更多低级操作,但用户宏(与数据宏相反)在 Access 和 AFAIK 中有点奇怪,您无法做到很多通过 DAO 的人。
【讨论】:
要添加,请记住 ms-access 是 multifaceted thing。多年来,底层数据库(JET/ACE 引擎)和 GUI 应用程序已被合并为“Access 数据库”。但这是两个不同的组成部分。
任何涉及 GUI 应用程序 (MSACCESS.exe) 的内容,例如 data macros、通用宏、模块、表单和报告,都不能在 ODBC 连接中处理,而 ODBC 连接在编程语言的非可视背景中运行。此外,必须安装 Office 应用程序 MS Access 才能调整 GUI 对象。
您仍然可以使用 Access 的 TableDefs 和 QueryDefs 创建/删除表和查询,它们都是使用代码的对象库的一部分。请注意:与 Access'object library 的交互不仅限于 VBA,而是适用于任何与 COM 连接的语言,包括带有win32com 模块的 Python; C# 和 VB.Net 与InteropServices;带有COM 库的PHP;带有Win32::OLE 模块的 Perl; R 与 RDCOMClient 包,还有其他。此类 COM 编程需要安装 MSACCESS.exe,该软件。
任何涉及数据库(JET/ACE 引擎)的内容,即 Windows .dll 文件,例如表和查询,都可以在 ODBC 或 OLEDB 连接中处理。此外,不需要安装 Office 应用程序 MS Access 即可在 .mdb 或 .accdb 文件上运行 ODBC 连接。唯一的要求是拥有 Windows 环境和 ODBC 驱动程序。
因此,如@GordonThompson shows、DDL(CREATE TABLE、CREATE VIEW、CREATE PROCEDURE、CREATE INDEX、DROP TABLE)和 DML(SELECT、INSERT、@9876543 987654344@) 调用可以在 ODBC 连接中操作以操作数据库,但不能操作 GUI 对象。
【讨论】:
CREATE PROCEDURE 也适用于 ACE/.accdb。示例here.
CREATE PROCEDURE 在 MS Access 2016 中对我不起作用 .accdb / 64 位在 Python pyodbc 中使用带有任何操作 SQL 查询的 ODBC 驱动程序。但是CREATE VIEW 可以。有趣的是,PROCEDURE 确实可以与使用 OLEDB 提供程序的adodbapi 一起使用,而VIEW 在adodbapi 中不起作用。您在示例中使用的连接字符串是什么?
;ExtendedAnsiSQL=1 添加到连接字符串末尾的习惯,所以这可能与它有关。