內容:利用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等一系列編碼,在一些偏僻中文字符上會出現亂碼等一系列不可控問題。