C ++ OTL没有看到外部数据库的变化

时间:2015-11-30 17:28:44

标签: c++ windows odbc otl

我有一个使用OTLv4连接到数据库的C ++程序。一切都很好。我既可以将数据插入数据库,也可以从数据库中读取数据。

但是,如果我从另一个程序更改数据库中的数据,那么这不会反映在我的C ++程序中。例如,如果我删除MySQL工作台的条目,C ++程序仍将看到该条目。我看到的数据是程序首次登录数据库时出现的数据。

如果我每次进行查询时都注销并登录,那么我将获得当前值,但这似乎不是很有效。类似地,如果我从C ++程序运行一个将修改数据库的查询,那么程序将开始查看当前值,直到那时为止。

对我而言,这感觉就像某种过度激进的缓存,但我不知道OTL是如何工作的,还没有看到任何提及除了可能的流池之外的缓存,我什么都不知道约。

我没有做任何花哨的事。 OTL使用以下参数进行编译:

#define OTL_ODBC // Compile OTL 4.0/ODBC
#define OTL_UNICODE // Compile OTL with Unicode 
#define OTL_UNICODE_EXCEPTION_AND_RLOGON
#define OTL_UNICODE_STRING_TYPE std::wstring
// The following #define is required with MyODBC 3.51.11 and higher
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE

代码看起来像这样:

otl_connect::otl_initialize(1); // Multithreading
otl_connect database;
database.rlogon(...);

// Make queries with otl_stream and direct_exec
otl_stream stream(50, "select * from ...", database);
database.direct_exec("insert ... into ...", otl_exception::disabled);

database.logoff();

我有什么遗漏,我需要做一些配置吗?关闭某种缓存?也许我真的需要每次登录和注销?

1 个答案:

答案 0 :(得分:1)

我发现了什么是错的:

  

Q值。 OTL:当我在MySQL中的一个表中插入一个新行时,我无法选择它,发生了什么?

     

如果您在otl_stream中使用准备好的SELECT语句,并继续执行/重用该语句以获取新行,则需要在每次提取序列耗尽后提交(调用otl_connect :: commit())。提交调用将让您的MySQL服务器知道您当前的只读事务已完成,并且服务器可以启动新事务,这将使新插入的行对SELECT语句可见。换句话说,您需要提交SELECT语句才能看到新行。

来自this post

所以问题是每当我发出一个SELECT语句时我都要调用otl_connect::commit();或者MySQL不会理解该语句已经完成。