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) 不在数据库中。State:S0002,Native:-206,Origin:[Informix][Informix ODBC Driver][Informix]

我试图将用户名指定为前缀(如user.ttt_1"user".ttt_1);我试图在csStatement1的相应语句中创建永久表,并且每次它在point2失败。但是当我尝试在csStatement1中创建相同的临时表两次时,我收到了临时表已经存在于会话中的消息。

请告知:出了什么问题,我该如何处理创建的临时表。

4

1 回答 1

2

这与ODBC 自动提交模式有关。默认情况下,ODBC 使用连接期间定义的选项,并且根据connectionstrings.com,Informix 的默认设置是commitretain=false.

您有两个选择:通过连接字符串 ( commitretain=true) 或(更好的选择)通过 ODBC 设置它。对于要保留临时表的一组语句,通过 SqlSetConnectAttr 激活手动提交模式,然后执行一些语句,然后调用 SqlEndTran。请注意,在手动模式下您不需要调用BEGIN TRANSACTION,因为它会自动启动(行为类似于 Oracle)

请注意,ODBC 应用程序不应使用 Transact-SQL 事务语句,例如 BEGIN TRANSACTION、COMMIT TRANSACTION 或 ROLLBACK TRANSACTION,而应使用 ODBC 命令。

于 2013-02-21T19:03:46.853 回答