2013-03-27 12 views
5

Ich möchte eine Access-Datenbank (* .accdb) aus einem Python-Skript erstellen. Mit win32com und Dispatch kann ich die Anwendung aufrufen. Ich kann jedoch nichts darüber finden, wie man eine neue Datenbank erstellt.Python Access-Datenbank mit win32com erstellen

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

An diesem Punkt habe ich keine Notwendigkeit, Daten in die Datenbank zu setzen, und ich würde dies mit Pyodbc tun - ich muß einfach eine leere Datenbank erstellen.

Hat jemand ein Beispiel, wie man das macht?

Prost Thomas

Antwort

4

Sie haben ein Access-Anwendungsobjekt. Verwenden Sie die Methode DBEngine.CreateDatabase, um Ihre db-Datei zu erstellen.

Dieses Beispiel arbeitete mit Python 2.7, um eine MDB-Format-Datenbankdatei zu erstellen. Verwenden Sie 128 (dbVersion120) für dbVersion, um ein ACCDB zu erstellen.

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

Ausgezeichnet, das hat wie ein Charme funktioniert! Nur noch eine Frage: Woher bekomme ich alle Informationen, die Sie für dbLangGeneral festgelegt haben? Cheers Thomas –

+0

In einer Access-Sitzung habe ich 'Debug.Print dbLangGeneral' verwendet und die zurückgegebene Zeichenfolge kopiert. Weitere Informationen zu anderen Optionen finden Sie im Hilfethema CreateDatabase. – HansUp

1

Um eine neue, leere .accdb-Datei zu erstellen, wird der folgende Python-Code sollte es tun:

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.' 

[Edit 1]

ein Kommentar zu einem Blog-Beitrag here schlägt vor, dass, wenn der .Create Aufruf generiert eine "Klasse nicht registriert" Fehler müssen Sie möglicherweise regsvr32.exemsadox.dll erneut registrieren. Seien Sie sich bewusst von "Bitness", wenn Sie dies versuchen: Es gibt 32-Bit- und 64-Bit-Versionen von beide dieser Dateien:

64-Bit
C: \ Windows \ System32 \ regsvr32.exe
C: \ Programme \ Gemeinsame Dateien \ System \ ado \ msadox.dll

32-Bit
C: \ Windows \ SysWOW64 \ regsvr32.exe
C: \ Program Files (x86) \ Gemeinsame Dateien \ System \ ado \ msadox.dll

Beachten Sie auch, dass Sie 32-Bit-Python auf einem 64-Bit-Computer ausführen können.

[Edit 2]

Ich habe ein paar Tests durchgeführt und haben zu dem Schluss gekommen, dass dieser Ansatz nicht in diesem speziellen Fall nicht funktioniert, weil das Python-Skript wurde als 64-Bit ausgeführt wird, aber die 64 -bit Access Datenbankmodul wurde nicht installiert. (32-Bit-Office installiert nur die 32-Bit-Version von ACE.)

Die Fehlermeldung war vielleicht ein bisschen irreführend. Es war nicht die ADOX-Komponente, die fehlte (nicht registriert), es war die 64-Bit-Version der ACE-Engine selbst, die nicht gefunden werden konnte.

Weiterhin auf einem 64-Bit-Rechner mit 32-Bit-Access installiert, die 64-Bit-Version von ACE wird nie verfügbar sein, weil es nicht

installiert werden kann

no 64-bit ACE with 32-bit Office

Dies könnte sehr gut Auswirkungen haben, wenn Sie versuchen, Daten in der ACCDB-Datei aus einem 64-Bit-Python-Skript zu bearbeiten. Ich hatte nicht Python auf meinem "32-Bit-Office auf 64-Bit-Windows" Test-Maschine, aber wenn ich versuche, das folgende 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 

...die Ergebnisse waren wie folgt:

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. 

Das Skript, wenn sie als 64-Bit ausgeführt werden kann, aber es funktionierte, wenn sie als 32-Bit laufen.

Empfehlung: Wenn auf Ihrem Computer 32-Bit Access installiert ist, sollten Sie Ihre Python-Skripte wahrscheinlich auch als 32-Bit ausführen.

+0

Hallo Gord, danke für die schnelle Antwort! Leider macht es den Trick noch nicht. Ich erhalte folgende Fehlermeldung: Traceback (letzter Anruf zuletzt): Datei "C: \ THOB \ Arbeitsbereich \ Toolbox \ src \ whales.py", Zeile 102, in access.Create ('Provider = Microsoft.ACE.OLEDB.12.0; Data Source = '+ fpDB +'; ') Datei "", Zeile 2, in Create Datei "C: \ Python27 \ ArcGISx6410.1 \ lib \ site -packages \ win32com \ client \ dynamic.py ", Zeile 282, in _ApplyTypes_ result = self._oleobj_.InvokeTypes (* (dispid, LCID, wFlags, retType, argTypes) + Argumente) –

+0

pywintypes.com_error: (-2147352567, 'Ausnahme aufgetreten.', (0, Keine, u'Class nicht registriert ', Keine, 0, -2147221164), Keine) –

+0

@ThomasBecker Ich habe meine Antwort aktualisiert. –

Verwandte Themen