Python使用win32com创建Access数据库

时间:2013-03-27 10:19:11

标签: python ms-access win32com

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

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

此时我没有必要将数据放入数据库,我会使用pyodbc执行此操作 - 我只需要创建一个空数据库。

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

干杯托马斯

3 个答案:

答案 0 :(得分:4)

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

此示例使用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

答案 1 :(得分: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重新注册{{1} }。尝试此操作时请注意“位数”:这些文件的两个都有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 永远不会可用,因为它无法安装

no 64-bit ACE with 32-bit Office

当您尝试从64位Python脚本操作.accdb文件中的数据时,这可能会产生影响。我的“64位Windows上的32位Office”测试机上没有Python,但是当我尝试下面的VBScript时......

msadox.dll

......结果如下:

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

以64位运行时脚本失败,但在以32位运行时运行。

建议:如果您的计算机安装了32位Access,那么将Python脚本运行为32位可能会更好。

答案 2 :(得分:0)

 def count=context.expand('${#Global#run}')
    log.info count
    
    def project1 = runner.testCase.testSuite.project
     def properties = new com.eviware.soapui.support.types.StringToObjectMap()    
     def testcase = project1.getTestSuiteByName("TestSuite 1").getTestCaseByName("Login");    
     def testcase1 = project1.getTestSuiteByName("TestSuite 1").getTestCaseByName("Logout");    
     
   
    // This will run everything in the selected project   
    for(int i=1;i<=count;i++){
     // testRunner = testcase.run(new com.eviware.soapui.support.types.StringToObjectMap(), false)
        def myContext = (com.eviware.soapui.support.types.StringToObjectMap)context
        testcase.run(myContext, false)
        sleep(70000)
        //testRunner = testcase1.run(new com.eviware.soapui.support.types.StringToObjectMap(), false)
        testcase1.run(myContext, false)
        sleep(5000) 
        log.info( "Finished running "+i+" cycle" )
     if(i==count){
        testRunner.cancel('Test Execution is completed')
        break;
        }
     }
 

然后就可以连接访问数据库了:

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()

请点击此链接了解更多信息:

https://elvand.com/python-and-ms-access/