5

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

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

那时我不需要将数据放入数据库,我会使用 pyodbc 来做这件事——我只需要创建一个空数据库。

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

干杯托马斯

4

3 回答 3

4

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

此示例从 Python 2.7 开始创建 MDB 格式的数据库文件。要创建 ACCDB,请将 128 (dbVersion120) 用于dbVersion.

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
于 2013-03-27T14:41:15.493 回答
1

要创建一个新的空 .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]

对此处发布的博客的评论表明,如果.Create调用生成“类未注册”错误,您可能需要使用regsvr32.exe重新注册msadox.dll。尝试此操作时请注意“位”:这两个文件都有 32 位和 64 位版本:

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 位机器上,64 位版本的 ACE 将永远不可用,因为它无法安装

没有 64 位 ACE 和 32 位 Office

当您尝试从 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 位。

于 2013-03-27T12:02:48.187 回答
0
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/

于 2021-03-17T17:31:55.970 回答