2013-03-27 42 views
5

Tôi muốn tạo cơ sở dữ liệu Access (* .accdb) từ bên trong một tập lệnh Python. Sử dụng win32com và Công văn Tôi có thể gọi cho ứng dụng. Tuy nhiên, tôi không thể tìm thấy bất cứ điều gì về cách tạo một cơ sở dữ liệu mới.Tạo cơ sở dữ liệu Access bằng cách sử dụng win32com

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

Lúc đó tôi không cần phải đưa dữ liệu vào cơ sở dữ liệu và tôi sẽ làm điều này bằng pyodbc - tôi chỉ cần tạo cơ sở dữ liệu trống.

Có ai có ví dụ về cách thực hiện việc này không?

Cheers Thomas

Trả lời

4

Bạn có đối tượng ứng dụng Access. Sử dụng phương thức DBEngine.CreateDatabase để tạo tệp db của bạn.

Mẫu này hoạt động từ Python 2.7 để tạo tệp cơ sở dữ liệu định dạng MDB. Để tạo một ACCDB, sử dụng 128 (dbVersion120) cho 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 
+0

Tuyệt vời, hoạt động như một sự quyến rũ! Chỉ còn một câu hỏi nữa: Tôi sẽ lấy tất cả thông tin từ nơi bạn đặt cho dbLangGeneral ở đâu? Chúc mừng Thomas –

+0

Từ trong phiên truy cập, tôi đã sử dụng 'Debug.Print dbLangGeneral' và sao chép chuỗi nó trả về. Xem chủ đề trợ giúp CreateDatabase để biết chi tiết về các tùy chọn khác. – HansUp

1

Để tạo ra một tập tin accdb trống mới, mã Python sau nên làm như lừa:

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

[Chỉnh sửa 1]

Một bình luận cho một bài đăng trên blog here cho thấy rằng nếu cuộc gọi .Create phát sinh lỗi "Chưa đăng ký lớp", bạn có thể cần phải sử dụng regsvr32.exe để đăng ký lại msadox.dll. Hãy nhận biết của "bitness" khi bạn cố gắng này: Có 32-bit và 64-bit phiên bản của cả của các tập tin:

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

32-bit
C: \ Windows \ SysWOW64 \ regsvr32.exe
C: \ Program Files (x86) \ Tệp phổ biến \ System \ ado \ msadox.dll

Ngoài ra, hãy lưu ý rằng bạn có thể đang chạy Python 32 bit trên máy 64 bit.

[Chỉnh sửa 2]

tôi đã thực hiện một vài kiểm tra và đã đi đến kết luận rằng phương pháp này không làm việc trong trường hợp đặc biệt này vì kịch bản Python được chạy như 64-bit, nhưng 64 -bit Access Database Engine chưa được cài đặt. (Văn phòng 32 bit chỉ cài đặt phiên bản ACE 32 bit.)

Thông báo lỗi có thể gây nhầm lẫn một chút. Nó không phải là thành phần ADOX bị thiếu (không được đăng ký), nó là phiên bản 64 bit của động cơ ACE mà không thể tìm thấy.

Bên cạnh đó, trên một máy 64-bit với 32-bit truy cập cài đặt, phiên bản 64-bit của ACE sẽ bao giờ có sẵn vì nó không thể được cài đặt

no 64-bit ACE with 32-bit Office

này có thể rất tốt có ý nghĩa khi bạn cố gắng thao tác dữ liệu trong tệp .accdb từ tập lệnh Python 64 bit. Tôi không có sẵn Python trên máy thử nghiệm "Office 32-bit trên Windows 64-bit" của tôi, nhưng khi tôi thử các VBScript sau đây ...

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 

...kết quả như sau:

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. 

Tập lệnh không thành công khi chạy 64 bit nhưng hoạt động khi chạy dưới dạng 32 bit.

Khuyến nghị: Nếu máy của bạn có cài đặt Truy cập 32 bit, bạn có thể nên chạy các tập lệnh Python của mình dưới dạng 32 bit.

+0

Hi Gord, cảm ơn bạn đã trả lời nhanh! Thật không may nó không làm các trick được nêu ra. Tôi nhận được lỗi sau: Traceback (cuộc gọi gần đây nhất): Tệp "C: \ THOB \ workspace \ Toolbox \ src \ whales.py", dòng 102, trong số access.Create ('Provider = Microsoft.ACE.OLEDB.12.0; Nguồn dữ liệu = '+ fpDB +'; ') Tệp "", dòng 2, trong Tạo Tệp "C: \ Python27 \ ArcGISx6410.1 \ lib \ site -packages \ win32com \ client \ dynamic.py ", dòng 282, trong _ApplyTypes_ kết quả = self._oleobj_.InvokeTypes (* (dispid, LCID, wFlags, retType, argTypes) + args) –

+0

pywintypes.com_error: (-2147352567, 'Ngoại lệ xảy ra.', (0, Không, u'Class chưa được đăng ký ', Không có, 0, -2147221164), Không có) –

+0

@ThomasBecker Tôi đã cập nhật câu trả lời của mình. –

Các vấn đề liên quan