在之前的文章:用 Python來開 Microsoft Access的.mdb資料檔曾經提到
"pyodbc 是个很不错的库,api 也很好用,不过对中文支持的并不好"我的經驗也是如此。原始資料庫的開發者沒事把欄位名稱用上中文,結果就是我花了好久時間,還是不能用sql語法的where來限制欄位的比對結果。
後來有熱心網友提供了他的心得:用微軟提供的元件 ADODB 來存取 Access。所以我也很快樂的在新版程式中 import這些功能。一個不錯的使用方法及副程式,可以在AlarmChang所維護的Python NoteBook中找到程式碼,基本上直接copy就很好用了。
但是,還是一樣,一但整份.py文件儲存時是使用utf-8,那就完了,一直出現error。
重點是,我突然發現,在
SQL = "Select * from TableABC" rs = Connect_To_Access(SQL)
這一段,其實是丟一個字串(SQL)給Microsoft ADODB COM去解譯,那我丟的字串符合它要的編碼規定(在我之前的文章有提,就是用ansi儲存的編碼),就可以了吧。
所以,只要把上面的SQL字串重新編/解碼過即可。
因此,程式碼變成:
### 我更改過的部份程式碼:
SQL = ("Select * from SOAP where 識別碼='12345'").decode('utf8')
### 因為全部文字都是用utf-8做編碼的,後面直接decode掉就好了。
### 下面再做呼叫即可
res = Connect_To_Access(SQL)整個實做就像這樣:(下以code是從文章:用 Python來開 Microsoft Access的.mdb資料檔稍做修改得到)
# -*- coding: utf-8 -*-
import os
import sys
import win32ui
import win32com.client
import win32com.client.dynamic
import string
import time
import datetime
def Connect_To_Access(SQL_Command):
#Input : SQL command 可以撈出指定部門的address 檔案裡面的咚咚
#Output : recordset
#將cnnection new 出來連接到資料庫(access)
cm = win32com.client.Dispatch(r"ADODB.Command")
Conn = win32com.client.Dispatch(r"ADODB.Connection")
strMDB = 'Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=.\\Your_Access_Database.mdb' #<----就是這一行和SQL server不一樣
Conn.Open(strMDB)
cm.ActiveConnection = Conn
cm.CommandType = 1
cm.CommandText = SQL_Command
cm.Parameters.Refresh()
cm.Prepared = True
(rs1, result) = cm.Execute()
return rs1
def main():
SQL = "Select * from TableABC where 中文欄位='123456'"
SQL = SQL.decode('utf8')#<----直接把要送出去的字串decode掉即可
rs = Connect_To_Access(SQL)
while not rs.eof:
print rs.Fields.Item(1).Value
rs.MoveNext()
這個方法應該也適用於pyodbc才是。
UPDATE
是適用沒錯,請看:
### pyodbc打開.mdb檔的方式
conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\\dir\\file.mdb')
cursor = conn.cursor()
cursor.execute('select * from ProgressNote;')
cursor.execute(('SELECT * FROM ProgressNote WHERE "病歷號"=?').decode('utf8'),'12345678')
###
沒有留言:
張貼留言