zoukankan      html  css  js  c++  java
  • Python访问Access数据库

    内容:利用win32com.client 模块的COM组件访问功能,通过ADODB访问Access的mdb文件

    #获取Connection对象
    conn = win32com.client.Dispatch('ADODB.Connection')
    #设置ConnectionString
    conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"%(mdb_file) #mdb_file为mdb文件的路径
    #打开连接
    conn.Open()#这里也可以conn.Open(DSN) DSN内容和ConnectionString一致

    此时数据库就连接上了。

    成功的平台:win2008 64位系统;office2010 32位;python 32位;ODBC 32位(位于C:/Windows/SysWOW64/odbcad32.exe)打开后有Microsoft Access Driver(*mdb,*accdb)等驱动程序

    失败的平台:win7 64位系统;office2013 64位;python 64,32都试了;试着安装了AccessDatabaseEngine2010的,都未成功,目前未找到原因。

    #打开已打开的数据库中的已有表或者视图表
    rs = win32com.client.Dispatch('ADODB.Recordset')
    rs.Open(tablename,conn,1,3)#Open(sql,conn,1,3) 
    #rs的Open(Source,ActiveConnection,CursorType,LockType,Options)
    #后面的参数3使得表可以被编辑更新。具体详细的参数和意义可以参照ADO程序员参考http://doc.51windows.net/ado/?url=/ado/dir.htm

    此时获得了一个可以表,其实只是一个游标,游标指向的是对应表中的一条记录,称为当前记录。我们可以通过一系列的操作读取、编辑当前记录,也可以移动游标来改变当前记录。

    #这里对几个重要的函数和属性记录一下
    rs.MoveFirst() rs.MoveLast() rs.MoveNext()  rs.MovePrevious()#跟打开表的游标类型有关系。
    #用来改变游标所指向的当前记录。
    rs.BOF  当前记录位于第一个记录的前面时为True
    rs.EOF  当前记录位于最后一个记录之后时为True 判断记录是否遍历完
    
    rs.BOF和rs.EOF同时为True时说明当前rs中没有记录。也就不能进行上面几个操作。
    #添加新记录着重记录:
    ###利用rs.AddNew()即依据rs新建了一条新纪录,rs会指向该记录。
    ###rs.Fields.Item(1)  rs.Fields.Item("fieldname") 得到当前记录的对应字段的项
    ###rs.Fields.Item(1).Value = data为对应项赋值
    ###rs.Fields.Item(0).AppendChunk(blob)  #对于二进制数据需要用此函数赋值
    
    ###设置好各项的值之后
    ###rs.Update()  保存新纪录,也可以保存对记录的修改。调用该方法,需要在打开rs的时候,设置锁定类型具体都可以在  ADO程序员参考http://doc.51windows.net/ado/?url=/ado/dir.htm找到介绍。

    至此对于Access 的mdb文件的简单访问就基本实现了。

    ADO作为访问数据的COM接口,支持多种数据源,多种语言,当然也就支持Python对于Access的访问。对于Python访问Access更深入的学习,应该是对于ADO相关接口类的深入了解。

    这里有个对于Python访问数据库的相对清楚的教程:http://www.mayukhbose.com/python/ado/ado-recordset.php

    最后记录编码问题,Python利用AddNew添加新纪录可以避免编码问题,对于文本可以直接将unicode对象赋值给文本字段。如果利用conn.Execute(insert_sql)或者 rs.Execute(insert_sql)对于insert_sql插入sql字符串,不能插入unicode对象,需要编码为gbk、gb2312、gb18030、utf8等一系列编码,在一些偏僻中文字符上会出现乱码等一系列不可控问题。

  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/z964166725/p/4807412.html
Copyright © 2011-2022 走看看