使用pyodbc将行插入MS Access MDB,如何转义参数?

时间:2010-04-08 19:35:59

标签: sql ms-access sql-injection escaping pyodbc

我正在使用pyodbc与传统的Access 2000 .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字符串,那也很棒。

1 个答案:

答案 0 :(得分:1)

嗯,显然这只是Access再次对我大喊大叫。

以前,我一直在插入python整数。现在,我试图插入python longs。

当插入long作为参数时,我得到

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

IOW,用int替换longs工作正常。 Go Access,这是一个描述性的错误。

严格来说,我不认为这是pyodbc中的错误,而是处理这个特定驱动程序时的问题。无论如何,谢谢你的帮助。