我有一个插入声明:
INSERT INTO billData (
tmStart, tsDuration, eCallDir, ...
) VALUES (
$1, -- tmStart
$2, -- tsDuration
$3, -- eCallDir
...
);
我使用SQLPrepare
编译它,按SQLBindParameter
绑定参数,然后按SQLExecute
执行它。
完成所有步骤后,返回错误代码42P02
(没有参数$ 1)。
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连接字符串后,它可以正常工作。
非常感谢: - )
答案 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
选项。