使用ODBC的PostgreSQL:“没有参数$ 1”

时间:2012-09-07 00:09:53

标签: postgresql odbc parameterized

我有一个插入声明:

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

我使用SQLPrepare编译它,按SQLBindParameter绑定参数,然后按SQLExecute执行它。

完成所有步骤后,返回错误代码42P02(没有参数$ 1)。

BTW:我也使用几乎相同的MS SQL Server和MySQL代码,这两个DB工作得很好,所以我相信我的代码是正确的。

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

=============================================== =============
UPDATE:

当我使用'?'时出现以下错误:42601(语法错误在或附近“,”)作为参数placholder:

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

=============================================== =============
UPDATE:

根据j.w.r的建议,在将UseServerSidePrepare=1选项添加到ODBC连接字符串后,它可以正常工作。

非常感谢: - )

2 个答案:

答案 0 :(得分:0)

虽然我确信准备好的语句适用于PostgreSQL ODBC,但我觉得这个语句代码有问题。首先,我会删除注释,以使这个INSERT尽可能简单。我刚刚尝试了带注释的多行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)

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

答案 1 :(得分:0)

=============================================== ============= UPDATE:

根据j.w.r的建议,在将UseServerSidePrepare=1选项添加到ODBC连接字符串后,它可以正常工作。

非常感谢: - )

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