1

次のコードを検討して、現在のセッションで作成された一時テーブルに対処できない理由をアドバイスしてください。

CDatabase cdb;
CString csConnectionString = "Dsn=prm2;Driver={INFORMIX 3.34 32 BIT};Host=10.XXX.XXX.XXX;Server=SRVNAME;Service=turbo;Protocol=olsoctcp;Database=DBNAME;Uid=user;Pwd=password";
cdb.OpenEx(csConnectionString, CDatabase::noOdbcDialog);
cdb.ExecuteSQL(CString("Set Isolation to Dirty Read"));
...
CString csStatement1 = "SELECT serno FROM TABLE1 into temp ttt_1;"
CString csStatement2 = "DROP TABLE ttt_1";

cdb.ExecuteSQL(csStatement1); // point1
cdb.ExecuteSQL(csStatement2); // point2
...
cdb.Close();

ポイント1ではすべて問題ありません。ポイント2で私は持っています:

指定されたテーブル (ttt_1) はデータベースにありません。状態:S0002、ネイティブ:-206、元:[Informix][Informix ODBC ドライバー][Informix]

ユーザー名をプレフィックスとして指定しようとしました(user.ttt_1またはなど"user".ttt_1); csStatement1のそれぞれのステートメント内に永続テーブルを作成しようとしましたが、point2で失敗するたびに。しかし、csStatement1内で同じ一時テーブルを 2 回作成しようとすると、セッションに一時テーブルが既に存在するというメッセージが表示されました。

アドバイスしてください:何が問題なのか、作成された一時テーブルにどのように対処すればよいでしょうか。

4

1 に答える 1

2

それはすべて、ODBC 自動コミット モードに関係しています。デフォルトでは、ODBC は接続時に定義されたオプションを使用します。connectionstrings.com によると Informix のデフォルト設定は ですcommitretain=false

2 つのオプションがあります。接続文字列 ( commitretain=true) を介して設定するか、ODBC を介して (より適切なオプション) 設定します。一時テーブルを保持したい一連のステートメントについては、SqlSetConnectAttr を介して手動コミット モードをアクティブにし、いくつかのステートメントを実行してから SqlEndTran を呼び出します。BEGIN TRANSACTION手動モードでは、自動的に開始されるため、呼び出す必要がないことに注意してください(動作は Oracle と同様です)。

ODBC アプリケーションでは、BEGIN TRANSACTION、COMMIT TRANSACTION、ROLLBACK TRANSACTION などの Transact-SQL トランザクション ステートメントを使用するのではなく、ODBC コマンドを使用する必要があることに注意してください。

于 2013-02-21T19:03:46.853 に答える