2010-04-08 69 views
2

我正在使用pyodbc與傳統Access 2000 .mdb文件進行通信。使用pyodbc將行插入到MS Access MDB中,如何轉義參數?

我有一個光標,我試圖執行此:

 
c.execute("INSERT INTO [Accounts] ([Name], [TypeID], [StatusID], [AccountCat], [id]) VALUES (?, ?, ?, ?, ?)", [u'test', 20, 10, 4, 2]) 

然而,這樣做的結果

 
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented (106) (SQLBindParameter)') 

我明白,我可以簡單地改變問號字面值,但根據我的經驗,在數據庫中正確地轉義字符串不是很好。

PHP和mysql合作讓mysql_real_escape_string和朋友們,但我似乎無法找到pyodbc的函數逃逸值。

如果你能讓我知道插入這些數據的推薦方式(來自python)是什麼,那會非常有幫助。另外,如果你有一個Python函數來轉義odbc字符串,那也會很棒。

回答

2

好吧,顯然這只是Access再次對我大喊大叫。

以前,我一直在插入python整數。現在,我試圖插入python longs。

當插入只要一個參數,我得到

 
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented (106) (SQLBindParameter)') 

只是調用執行修復之前,將此代碼添加到我的功能:

 
    for k, v in new.items(): 
     new[k] = int(v) if isinstance(v, long) else v 

督察,以整數取代多頭工作正常。 Go Access,這是一個描述性錯誤。

嚴格地說,我認爲這不是pyodbc中的一個bug,而是處理這個特定驅動時的一個問題。無論如何,感謝您的幫助。

+0

Python長數據類型的定義是什麼?如果它超過了Jet長整型的容量,那就是爲什麼你不能使用它。如果這是問題的原因,那麼對我而言,這看起來像是飛行員錯誤,即,您試圖在沒有完全理解目標數據庫的數據類型的情況下執行某些操作。 – 2010-04-27 00:42:38

+0

在Python中,多頭具有任意的容量。 Python會在必要時透明地將int提升爲long,但它不會自動降級(所以int(24)是一個整數,long(24)是一個整數,但int(2400000000)和long(2400000000)都是long)。因此,Python程序員不知道他們的程序是使用longs,ints還是兩者的混合,這是完全合理的。如果pyodbc在範圍內,接受它們並不是不合理的。 – 2010-05-24 21:02:06

相關問題