【问题标题】:Cannot use parameter with pyodbc when dealing with 4D ODBC Server处理 4D ODBC 服务器时无法使用参数与 pyodbc
【发布时间】:2014-10-17 13:48:37
【问题描述】:

我无法使用 pyodbc 和 4D 获得参数化查询。这是一个简单而基本的代码示例(在 mySQL 数据库上工作)。表 B 有两列,没有任何约束。

import pyodbc

con2 = pyodbc.connect('dsn=odbc_source');
cur2 = con2.cursor();

KeyMap = {
    1: ('Aaaahaa',datetime.date(1990,1,1)),
    2: ('Bcdefgh',datetime.date(1990,2,1)),
    3: ("Aaaah'aa",datetime.date(1990,3,1))
    };

for k in KeyMap:
    v = (k,KeyMap[k][0]);
    cur2.execute("INSERT INTO B(Num,Text) VALUES(?,?);",v);

我总是收到此错误消息:

Traceback (most recent call last):
File "D:\jlandercy\src\python\cripi\transfert\000_TestInsertParam.py", line 33, in <module>
cur2.execute("INSERT INTO B(Num,Text) VALUES(?,?);",v);
pyodbc.ProgrammingError: ('The SQL contains 1 parameter markers, but 2 parameters were supplied', 'HY000')

或者,连接失败,但如果我发出SELECT 它可以工作。我做错了什么。

【问题讨论】:

  • 您使用的是什么版本的 4d 服务器?什么版本的 odbc 驱动程序?
  • 你解决过这个问题吗?当我的代码清楚地包含 2 时,我也得到了令人惊讶的“包含 1 个参数标记”。这似乎是处理查询而不是绑定参数本身的问题。
  • @WAF,我不知道新的 ODBC 连接器是否也有这个问题(它也受到你的 4D 版本的限制)。无论如何,我们通过在将 SQL 语句提交给 ODBC 驱动程序之前对其进行格式化来解决它。这可行,但需要仔细转换并转换为字符串所有字段以提交,不是很灵活并且导致设计不佳(它可能容易注入)。您还需要照顾好在 SQL 标准和 4D 观点之间真正不同的 NULL 值。我没有在 ODBC 上使用 4D 进行测试,但它可能更简洁:stackoverflow.com/a/23744051/3067485

标签: python odbc pyodbc 4d-database


【解决方案1】:

您是否尝试过枚举映射而不是创建 () 对象?

for k in KeyMap:
    cur2.execute("INSERT INTO B(Num,Text) VALUES(?,?);",k,KeyMap[k][0]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多