1

私は挿入ステートメントを持っています:

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

私はSQLPrepareそれをコンパイルし、 でパラメータをバインドしSQLBindParameter、 で実行しSQLExecuteます。

すべての手順の後、エラー コード42P02(パラメータ $1 はありません) が返されました。

ところで: 私は MS SQL Server と MySQL にもほぼ同じコードを使用しており、これら 2 つの DB は非常にうまく機能しているため、私のコードは正しいと思います。

PS: PostgreSQL は v9.1 です。psqlODBC は v9.01.0100-1 です。

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

そして、次のエラーが発生しました: 42601(「,」またはその付近の構文エラー)「?」を使用している場合 パラメーターのプレースホルダーとして:

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

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

jwrからの提案によるとUseServerSidePrepare=1、ODBC接続文字列にオプションを追加すると機能します。

たくさんの感謝 :-)

4

2 に答える 2

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)

次に、アプリケーションに対して同様のトレースを作成し、何が違うのかを見つけようとします。

于 2012-09-07T06:41:07.243 に答える
0

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

jwrからの提案によるとUseServerSidePrepare=1、ODBC接続文字列にオプションを追加すると機能します。

たくさんの感謝 :-)

注: ByteaAsLongVarBinary=1SQLBindParameter を使用して bytea フィールドをパラメーター化する場合は、このオプションも追加する必要があります。

于 2012-09-10T09:48:00.500 に答える