Python: win32com を使ってDBにADO接続してみる。

Python and ActiveX Data Objects (ADO)を参考にMS AccessMDBにアクセスしてみました。
使用しているMDBは「Win32OLE 活用法 【第 3 回】 ADODB」のsample1.mdbです。

# -*- coding: cp932 -*-
import win32com.client
import sys
import codecs

# 参考
# http://www.ecp.cc/pyado.html#1

conn = win32com.client.Dispatch(r'ADODB.Connection')
DSN ='DRIVER={Microsoft Access Driver (*.mdb)};Dbq=C:\\Python27\\test\\COM\\sample1.mdb'

# MS SQL Server のとき
# DSN ='Provider=SQLOLEDB.1;Password=xxxxxxx;User ID=xxxx;Initial Catalog=DBname;Data Source=tcp:192.168.1.123,1433'

conn.Open(DSN)
        
rs = win32com.client.Dispatch(r'ADODB.Recordset')
rs_name = 'earthquake'
strsql = '"SELECT * FROM earthquake;'

rs.Open('[' + rs_name + ']', conn, 1, 3)
# rs.Open(strsql, conn, 1, 3)
        
print rs.RecordCount # => 4

flds_name  = {}
flds_Value = {}
fCount = rs.Fields.Count # フィールド数

for x in range(fCount):
    flds_name[x] = rs.Fields.Item(x).Name

# フィールド名
print flds_name # => {0: u'Name', 1: u'Day', 2: u'Magnitude', 3: u'NumOfDeaths', 4: u'DeadOrAlive'}

rs.MoveFirst()
print type(rs.Fields.Item(0).Value)                   #=> <type 'unicode'>
print type(rs.Fields.Item(0).Value.encode('cp932'))   #=> <type 'str'>
print rs.Fields.Item(0).Value.encode('cp932')         #=> 関東大震災
print rs.Fields.Item(0).Value                         #=> 関東大震災
print rs.Fields.Item(0).Type                          #=> 202
print rs.Fields.Item(0).DefinedSize                   #=> 50

# 全データをtable_Valueに取得する。
rs.MoveFirst()
count = 0
table_Value = {}
while 1:
    if rs.EOF:
        break
    else:
        flds_Value = {}
        for x in range(fCount):
            flds_Value[x] = rs.Fields.Item(x).Value
        table_Value[count] = flds_Value
        count = count + 1
        rs.MoveNext()

print table_Value

# {0: {0: u'\u95a2\u6771\u5927\u9707\u707d', 1: <PyTime:1923/09/01 0:00:00>, 2: 7.9, 3: 142807, 4: u'-1'}, 
#  1: {0: u'\u962a\u795e\u6de1\u8def\u5927\u9707\u707d', 1: <PyTime:1995/01/17 0:00:00>, 2: 7.2, 3: 6418, 4: u'-1'}, 
#  2: {0: u'\u65b0\u6f5f\u770c\u4e2d\u8d8a\u5730\u9707', 1: <PyTime:2004/10/23 0:00:00>, 2: 6.8, 3: 37, 4: u'-1'}, 
#  3: {0: u'\u5317\u6d77\u9053\u6771\u65b9\u6c96\u5730\u9707', 1: <PyTime:1994/10/04 0:00:00>, 2: 8.1, 3: 0, 4: u'0'}}

# フィールドの型を表示してみる。
for x in range(fCount):
    print type(table_Value[0][x])
#=>  <type 'unicode'>
#    <type 'time'>
#    <type 'float'>
#    <type 'int'>
#    <type 'unicode'>


# 全テーブル表示
oCat = win32com.client.Dispatch(r'ADOX.Catalog')
oCat.ActiveConnection = conn
oTab = oCat.Tables
for x in oTab:
     if x.Type == 'TABLE':
         print x.Name  #=> earthquake

rs.Close()
conn.Close()

ConEmuのutf-8環境で文字列出力がエラーになって苦労したのですが、Windows PowerSHell で実行すると問題が発生しませんでした。

$ python ecpcc2.py
4
{0: u'Name', 1: u'Day', 2: u'Magnitude', 3: u'NumOfDeaths', 4: u'DeadOrAlive'}
<type 'unicode'>
<type 'str'>
・ヨ東大震災Traceback (most recent call last):
  File "ecpcc2.py", line 35, in <module>
    print rs.Fields.Item(0).Value.encode('cp932')         #=> 関東大震災
IOError: [Errno 0] Error