【问题标题】:Using pyodbc to insert rows into a MS Access MDB, how do I escape the parameters?使用 pyodbc 将行插入 MS Access MDB,如何转义参数?
【发布时间】:2010-04-08 19:35:58
【问题描述】:

我正在使用 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]可选功能未实现 (106) (SQLBindParameter)')

我知道我可以简单地将问号更改为字面值,但根据我的经验,跨数据库正确转义字符串......并不漂亮。

php和mysql联手带来mysql_real_escape_string和朋友,但是我好像找不到pyodbc的转义值函数。

如果您能让我知道插入此数据(来自 python)的推荐方法是什么,那将非常有帮助。或者,如果你有一个 python 函数来转义 odbc 字符串,那也很好。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]可选功能未实现 (106) (SQLBindParameter)')

    在调用执行之前将此代码添加到我的函数中修复它:

    对于 new.items() 中的 k、v: new[k] = int(v) if isinstance(v, long) else v

    IOW,用整数替换 long 可以正常工作。 Go Access,描述性错误。

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

    【讨论】:

    • Python long 数据类型的定义是什么?如果它超过了 Jet 长整数的容量,那么这就是你不能使用它的原因。如果这就是问题的原因,那么在我看来,它就像是飞行员错误,也就是说,您在没有完全了解目标数据库的数据类型的情况下尝试做某事。
    • 在 Python 中,long 具有任意容量。 Python 会在必要时透明地将 int 提升为 long,但它不会自动降级(因此 int(24) 是整数,而 long(24) 是 long,但 int(2400000000) 和 long(2400000000) 都是 long)。因此,对于 Python 程序员来说,不知道他们的程序是在使用 long、int 还是两者的混合是完全合理的。如果它们都在范围内,期望 pyodbc 接受这两者并不是不合理的。
    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 2015-04-26
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多