2013-02-21 17 views
1

請考慮以下代碼並提出建議,爲什麼我不能解決在當前會話中創建的臨時表。解決通過CDatabase :: ExecuteSQL創建的臨時表

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一切都很好。在point2我有:

指定的表(ttt_1)不在數據庫中。狀態:S0002,本機:-206,產地:Informix的] [Informix ODBC驅動程序] [Informix的]

我試圖指定用戶名作爲前綴(如user.ttt_1或);我試圖在csStatement1的相應聲明中創建永久性表格,並且每次都在point2失敗。但是當我試圖在csStatement1內兩次創建相同的臨時表時,我收到了臨時表已存在於會話中的消息。

請指教:什麼是錯的,我如何處理創建的臨時表。

回答

2

它全部與ODBC autocommit mode有關。默認情況下,ODBC使用連接期間定義的選項,根據connectionstrings.com,Informix的默認設置是commitretain=false

您有兩種選擇:通過連接字符串(commitretain=true)或(更好的選項)通過ODBC進行設置。對於想要保留臨時表的一組語句,通過SqlSetConnectAttr激活手動提交模式,然後執行幾條語句,然後調用SqlEndTran。請注意,在手動模式下,您無需調用BEGIN TRANSACTION,因爲它將自動啓動(類似於Oracle的行爲)

請注意,ODBC應用程序不應使用Transact-SQL事務語句,例如BEGIN TRANSACTION,COMMIT TRANSACTION或ROLLBACK TRANSACTION,但使用ODBC命令。