4

Oracle 10g で ODBC 3.0 を使用したテーブルへの挿入が失敗しましたが、その理由がわかりません。データベースは Windows Server 2003 上にあります。クライアントは Windows XP 上にあります。

テーブル:

CREATE TABLE test ( testcol NUMBER(20,0) NULL );

ODBC 呼び出し:

SQLAllocHandle(SQL_HANDLE_STMT) = SQL_SUCCESS
SQLPrepare(INSERT INTO test (testcol) VALUES (?);) = SQL_SUCCESS

SQLINTEGER nStrLen = 0;
__int64 nInt64 = 99;
SQLBindParameter(hStatement, 1, SQL_PARAM_INPUT, 
    SQL_C_SBIGINT, SQL_BIGINT, 20, 0, &nInt64, 0, &nStrLen) = SQL_SUCCESS

SQLExecute() = SQL_ERROR
SQLGetDiagRec(1) = SQL_NO_DATA

SQLBindParameter成功しますが、その後SQLExecute失敗します。診断メッセージはありません。

int64 を文字列に書き込み、それを文字列としてバインドする必要がありました。これは int64 をバインドする唯一の方法ですか?

4

1 に答える 1

5

付録 G.1の Oracle 10g 管理者ガイドでは、Oracle 10g ODBC ドライバーは も もサポートしていない述べています。SQL_C_SBIGINTSQL_C_UBIGINT

あなたと同じように、実行時にSQLExecute()が失敗することもわかります。への呼び出しSQLGetDiagRec()は、 のような単純なメッセージではなく、何も返しません"Oracle 10g does not support SQL_C_SBIGINT"。ぐぅ……

いずれにせよ、付録 G.1 には、データをバインドして、 のように定義された列を持つテーブルに送信する方法が記載されていませんNUMBER(20)。したがって、私たちは皆、推測して、(文書化されていない)テクニックが機能するものは何でも使用する必要があります。付録 G.1 が、「最善の」方法について何らかのヒントや提案を与えてくれるとうれしいです。

数値を文字列に変換してからバインディングが機能する場合は、そのままにしてください。

于 2009-04-14T23:16:15.390 に答える