考虑下面的代码并提出建议,为什么我不能处理当前会话中创建的临时表。
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)不在数据库中。状态:S 0002,本机:-206,原产地:InformixInformix
我试图将用户名指定为前缀(如user.ttt_1或"user".ttt_1);我试图在csStatement1中的相应语句中创建永久表,每次在point2失败时都会这样做。但是,当我试图在csStatement1中两次创建相同的临时表时,我得到的消息是临时表已经存在于会话中。
请告知:什么是错误的,我如何处理创建的临时表。
发布于 2013-02-21 19:03:46
这都与ODBC自动提交模式有关。默认情况下,ODBC使用在连接期间定义的选项,根据connectionstrings.com,Informix的默认设置是commitretain=false。
您有两个选项:要么通过连接字符串(commitretain=true)设置它,要么通过ODBC设置(更好的选项)。对于希望保留临时表的一组语句,通过SqlSetConnectAttr激活手动提交模式,然后执行几条语句,然后调用SqlEndTran。请注意,在手动模式下,您不需要调用BEGIN TRANSACTION,因为它将自动启动(行为类似于Oracle)。
请注意,ODBC应用程序不应该使用Transact-SQL事务语句,例如BEGIN、COMMIT TRANSACTION或ROLLBACK事务,而是使用ODBC命令。
https://stackoverflow.com/questions/15000350
复制相似问题