2010-04-08 81 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