簡體   English   中英

Python 使用 win32com 創建 Access 數據庫

[英]Python Create Access database using win32com

我想從 Python 腳本中創建一個 Access 數據庫 (*.accdb)。 使用 win32com 和 Dispatch 我可以調用該應用程序。 但是,我找不到有關如何創建新數據庫的任何信息。

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

那時我不需要將數據放入數據庫,我會使用 pyodbc 來做到這一點 - 我只需要創建一個空數據庫。

有人有如何做到這一點的例子嗎?

干杯托馬斯

您有一個 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

要創建一個新的空 .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 位運行。

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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM