请考虑以下代码并提供建议,为什么我不能解决在当前会话中创建的临时表。
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();
在 point1 一切都很好。在 point2 我有:
指定的表(ttt_1)不在数据库中。状态:S0002,原生:-206,原产地:[Informix] [Informix ODBC驱动程序] [Informix]
我尝试将用户名指定为前缀(例如user.ttt_1
或"user".ttt_1
);我尝试在 csStatement1 中的相应语句中创建永久表,并且每次在 point2 时失败。但是当我尝试在 csStatement1 中两次创建相同的临时表时,我收到了临时表已存在于会话中的消息。
请告知:出了什么问题,如何处理创建的临时表。
答案 0 :(得分:2)
这与ODBC autocommit mode有关。默认情况下,ODBC使用连接期间定义的选项,根据connectionstrings.com,Informix的默认设置为commitretain=false
。
您有两种选择:通过ODBC通过连接字符串(commitretain=true
)或(更好的选项)设置它。对于要保留临时表的一组语句,通过SqlSetConnectAttr激活手动提交模式,然后执行一些语句,然后调用SqlEndTran。请注意,在手动模式下,您无需调用BEGIN TRANSACTION
,因为它将自动启动(与Oracle类似的行为)
请注意,ODBC应用程序不应使用Transact-SQL事务语句,例如BEGIN TRANSACTION,COMMIT TRANSACTION或ROLLBACK TRANSACTION,而是使用ODBC命令。