1

我有一个插入语句:

    INSERT INTO billData (
      tmStart, tsDuration, eCallDir, ...
    ) VALUES (
      $1,  -- tmStart
      $2,  -- tsDuration
      $3,  -- eCallDir
      ...
    );

SQLPrepare用来编译,绑定参数SQLBindParameter,执行SQLExecute

在所有这些步骤之后,返回错误代码42P02(没有参数 $1)。

顺便说一句:我也在为 MS SQL Server 和 MySQL 使用几乎相同的代码,这两个数据库运行良好,所以我相信我的代码是正确的。

PS:PostgreSQL是v9.1;psqlODBC 是 v9.01.0100-1。

==================================================== ==========
更新:

并且发生以下错误:(42601在“,”或附近出现语法错误)当我使用“?”时 作为参数占位符:

    INSERT INTO billData (
      tmStart, tsDuration, eCallDir, ...
    ) VALUES (
      ?,  -- tmStart
      ?,  -- tsDuration
      ?,  -- eCallDir
      ...
    );

==================================================== ==========
更新:

根据 jwr 的建议,它在向UseServerSidePrepare=1ODBC 连接字符串添加选项后起作用。

非常感谢 :-)

4

2 回答 2

0

虽然我确信准备好的语句适用于 PostgreSQL ODBC,但我认为该语句代码有问题。起初,我会删除注释以使此 INSERT 尽可能简单。我刚刚尝试了带有注释和冒号的多行插入,效果很好。我转换了一点我的测试 Python 代码:

import odbc

db = odbc.odbc('odbcalias/user/password')
c = db.cursor()
r = c.execute("""INSERT INTO billData (
        tmStart, tsDuration, eCallDir, ...
    ) VALUES (
        ?,  -- tmStart
        ?,  -- tsDuration
        ?,  -- eCallDir
        ...
    );""", (tmStart, tsDuration, eCallDir, ))
print('records inserted: %s' % (r))

你能用 ActivePython 2.7 试试吗(它已经有odbc模块)?

如果它可以工作,则启用 ODBC 跟踪并测试该程序。在 odbc sql 跟踪文件中应该有如下条目:

...
python.exe odbc 924-e8c ENTER SQLExecDirect 
        HSTMT               00A029A8
        UCHAR *             0x00B5A480 [      -3] "INSERT INTO test_table(txt) VALUES (?)\ 0"
        SDWORD                    -3

python.exe odbc 924-e8c EXIT  SQLExecDirect  with return code 0 (SQL_SUCCESS)
        HSTMT               00A029A8
        UCHAR *             0x00B5A480 [      -3] "INSERT INTO test_table(txt) VALUES (?)\ 0"
        SDWORD                    -3

python.exe odbc 924-e8c ENTER SQLNumResultCols 
        HSTMT               00A029A8
        SWORD *             0x0021FAA0

python.exe odbc 924-e8c EXIT  SQLNumResultCols  with return code 0 (SQL_SUCCESS)
        HSTMT               00A029A8
        SWORD *             0x0021FAA0 (0)

python.exe odbc 924-e8c ENTER SQLRowCount 
        HSTMT               00A029A8
        SQLLEN *            0x0021FBDC

python.exe odbc 924-e8c EXIT  SQLRowCount  with return code 0 (SQL_SUCCESS)
        HSTMT               00A029A8
        SQLLEN *            0x0021FBDC (1)

然后为您的应用程序进行类似的跟踪,并尝试找出不同之处。

于 2012-09-07T06:41:07.243 回答
0

==================================================== ========== 更新:

根据 jwr 的建议,它在向UseServerSidePrepare=1ODBC 连接字符串添加选项后起作用。

非常感谢 :-)

注意:ByteaAsLongVarBinary=1如果要使用 SQLBindParameter 参数化 bytea 字段,还应添加该选项。

于 2012-09-10T09:48:00.500 回答