2013-03-27 200 views
5

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

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

在這一點上我有沒有必要把數據存入數據庫,我會做到這一點使用pyodbc - 我只需要創建一個空數據庫。

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

乾杯托馬斯

回答

4

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

優秀,那就像一個魅力! 還有一個問題:我在哪裏可以獲得您爲dbLangGeneral設置的所有信息? 乾杯托馬斯 – 2013-03-27 15:08:33

+0

在Access會話中,我使用了'Debug.Print dbLangGeneral'並複製了它返回的字符串。有關其他選項的詳細信息,請參閱CreateDatabase幫助主題。 – HansUp 2013-03-27 15:12:08

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]

的註釋博客文章here建議如果.Create調用會生成「類未註冊」錯誤,則可能需要使用regsvr32.exe重新註冊msadox.dll。要注意的「位數」當您嘗試這樣的:有這些文件的兩個的32位和64位版本:

64位
C:\ WINDOWS \ SYSTEM32 \ REGSVR32.EXE
C:\ Program Files文件\ Common Files文件\系統\ 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 Access數據庫引擎未安裝。 (32位Office僅安裝ACE的32位版本。)

錯誤消息可能有點誤導。這不是ADOX組件缺失(未註冊),它是無法找到的ACE引擎本身的64位版本。

此外,在安裝了32位訪問64位機,ACE的64位版本將永遠可用,因爲它不能被安裝

no 64-bit ACE with 32-bit Office

這很可能當您嘗試從64位Python腳本處理.accdb文件中的數據時會產生影響。我沒有對的Python我的測試機「的64位Windows上的32位Office」可用的,但是當我試圖下面的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位。

+0

嗨,戈,感謝您的快速回復!不幸的是,它還沒有做到這一點。我收到以下錯誤: 回溯(最近通話最後一個): 文件 「C:\ THOB \工作區\工具箱的\ src \ whales.py」,線路102,在 access.Create('提供商= Microsoft.ACE.OLEDB.12.0; Data Source ='+ fpDB +';') 文件「」,第2行,創建 文件「C:\ Python27 \ ArcGISx6410.1 \ lib \ site (*(dispid,LCID,wFlags,retType,argTypes)+ args) – 2013-03-27 12:37:41

+0

pywintypes.com_error:( - 21437352567, '發生異常',(0,None,u'Class not registered',None,0,-2147221164),None) – 2013-03-27 12:40:42

+0

@ThomasBecker我更新了我的答案。 – 2013-03-27 13:07:20