首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对通过CDatabase::ExecuteSQL创建的临时表的寻址

对通过CDatabase::ExecuteSQL创建的临时表的寻址
EN

Stack Overflow用户
提问于 2013-02-21 10:51:33
回答 1查看 310关注 0票数 1

考虑下面的代码并提出建议,为什么我不能处理当前会话中创建的临时表。

代码语言:javascript
复制
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中两次创建相同的临时表时,我得到的消息是临时表已经存在于会话中。

请告知:什么是错误的,我如何处理创建的临时表。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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命令。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15000350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档