Python使用win32com创建Access数据库

Posted

技术标签:

【中文标题】Python使用win32com创建Access数据库【英文标题】:Python Create Access database using win32com 【发布时间】:2013-03-27 10:19:11 【问题描述】:

我想从 Python 脚本中创建一个 Access 数据库 (*.accdb)。 使用 win32com 和 Dispatch 我可以调用该应用程序。但是,我找不到有关如何创建新数据库的任何信息。

access = win32com.client.Dispatch('Access.Application')

那时我不需要将数据放入数据库中,我会使用 pyodbc 来完成 - 我只需要创建一个空数据库。

有人有如何做到这一点的例子吗?

托马斯干杯

【问题讨论】:

【参考方案1】:

您有一个 Access 应用程序对象。使用它的DBEngine.CreateDatabase 方法来创建你的数据库文件。

此示例使用 Python 2.7 创建 MDB 格式的数据库文件。要创建 ACCDB,请为 dbVersion 使用 128 (dbVersion120)。

import win32com.client
oAccess = win32com.client.Dispatch('Access.Application')
DbFile = r'C:\Users\hans\Documents\NewDb.mdb'
dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0'
# dbVersion40 64
dbVersion = 64
oAccess.DBEngine.CreateDatabase(DbFile, dbLangGeneral, dbVersion)
oAccess.Quit()
del oAccess

【讨论】:

太棒了,这就像一个魅力!还有一个问题:我从哪里获得您为 dbLangGeneral 设置的所有信息?干杯托马斯 在 Access 会话中,我使用了 Debug.Print dbLangGeneral 并复制了它返回的字符串。有关其他选项的详细信息,请参阅 CreateDatabase 帮助主题。【参考方案2】:

要创建一个新的空 .accdb 文件,下面的 Python 代码应该可以解决问题:

import win32com.client
f = 'C:\\Users\\Gord\\Desktop\\pyTest.accdb'
c = win32com.client.Dispatch('ADOX.Catalog')
c.Create('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + f + ';')
c = None
print '"' + f + '" created.'

[编辑 1]

对博客帖子here 的评论表明,如果.Create 调用产生“类未注册”错误,您可能需要使用regsvr32.exe 重新注册msadox.dll。尝试执行此操作时请注意“位”:这些文件有 32 位和 64 位版本both

64 位 C:\Windows\System32\regsvr32.exe C:\Program Files\Common Files\System\ado\msadox.dll

32 位 C:\Windows\SysWOW64\regsvr32.exe C:\Program Files (x86)\Common Files\System\ado\msadox.dll

另外,请注意,您可以在 64 位机器上运行 32 位 Python。

[编辑 2]

我进行了一些测试并得出结论,这种方法在这种特殊情况下不起作用,因为 Python 脚本以 64 位运行,但未安装 64 位 Access 数据库引擎。 (32 位 Office 仅安装 32 位版本的 ACE。)

错误信息可能有点误导。丢失(未注册)的不是 ADOX 组件,而是找不到 ACE 引擎本身的 64 位版本。

此外,在安装了 32 位 Access 的 64 位计算机上,ACE 的 64 位版本将永远不可用,因为它无法安装

当您尝试从 64 位 Python 脚本操作 .accdb 文件中的数据时,这很可能会产生影响。我的“64 位 Windows 上的 32 位 Office”测试机上没有可用的 Python,但是当我尝试以下 VBScript 时...

Option Explicit
Dim con, rst
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\Users\Gord\Desktop\adoTest.accdb;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT Field1 FROM Table1", con
Wscript.Echo rst(0).Value
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing

...结果如下:

C:\__tmp>C:\Windows\System32\cscript.exe /nologo dataAccessTest.vbs
C:\__tmp\dataAccessTest.vbs(4, 1) ADODB.Connection: Provider cannot be found. 
It may not be properly installed.

C:\__tmp>C:\Windows\SysWOW64\cscript.exe /nologo dataAccessTest.vbs
This is Table1 data in Access.

脚本在 64 位运行时失败,但在 32 位运行时运行。

建议:如果您的计算机安装了 32 位 Access,您最好将 Python 脚本也运行为 32 位。

【讨论】:

嗨,戈德,感谢您的快速回复!不幸的是,它还没有奏效。我收到以下错误: Traceback(最近一次调用最后一次):文件“C:\THOB\workspace\Toolbox\src\whales.py”,第 102 行,在 access.Create('Provider=Microsoft. ACE.OLEDB.12.0;Data Source=' + fpDB + ';') 文件“”,第 2 行,在创建文件“C:\Python27\ArcGISx6410.1\lib\site-packages\win32com \client\dynamic.py",第 282 行,在 ApplyTypes 结果 = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) pywintypes.com_error: (-2147352567, '发生异常。', (0, None, u'Class not registered', None, 0, -2147221164), None) 非常感谢!我绝对确定我运行的是 64 位版本。我想我会尝试使用 32 位版本的 msadox.dll,因为 MS Office 是 32 位的。希望能解决问题。 非常感谢!我绝对确定我运行的是 64 位版本。我尝试了这两种可能性,不幸的是它并没有改变错误消息。 @HansUp 嘿,是的。并且只改变“bit-ness”中的一个字符,你就会得到“bit-mess”,这似乎也有点合适。 :)【参考方案3】:
import win32com.client
ConFileName = r'c:\mydb\myaccess.mdb'
try:
    Catalog = win32com.client.Dispatch('ADOX.Catalog')
    Catalog.Create('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + ConFileName + ';')
    Catalog = None
except:
    Exception as e:
        print("Database generation failed, Error="+str(e))
print("NewAccessDB.mdb created successfully")

然后你就可以连接访问数据库了:

ConFileName=(r'c:\mydb\myaccess.mdb')
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=' + ConFileName + ';')
cursor = conn.cursor()

要插入访问表:

ConFileName=(r'c:\mydb\myaccess.mdb')
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=' +ConFileName+ ';')
cursor = conn.cursor()
for ta in TableArray:
    Sql_insert_query = "INSERT INTO Table1(ID, Value1,Value2,Value3,Value4,Value5,Value6) " \
                         "VALUES ('a','b','c','d','e','f','g')".format(a=str(ta[0]),b=str(ta[1]),c=str(ta[2]),d=str(ta[3]),e=str(ta[4]),f=str(ta[5]),g=str(ta[6]))
    cursor.execute(Sql_insert_query)
    conn.commit()
cursor.close()

请点击此链接了解更多信息:

https://elvand.com/python-and-ms-access/

【讨论】:

以上是关于Python使用win32com创建Access数据库的主要内容,如果未能解决你的问题,请参考以下文章

Python 导出报告 Microsoft Access 使用 win32com.client

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

python连接access数据库问题

使用Python对Access读写操作

使用Python对Access读写操作

python 操作ACCESS数据库中 如何删除记录