首页 > 解决方案 > 在不绑定参数的情况下使用 OTL 库 (c++) 插入

问题描述

我正在尝试使用 OTL 对 sql server db 进行基本插入。对于这个插入,我不需要绑定任何参数。

otl_stream o_stream;
std::string query = "INSERT INTO common VALUES (1,2,3);";
o_stream.open(1, query.c_str(), db_);
o_stream.flush();
o_stream.close();

但是,即使在刷新和关闭 otl_stream 之后,数据库仍被锁定在该表上(无法通过单独的应用程序读取)。我必须关闭我的 otl 应用程序才能解锁表。

如果我参数化插入语句,那么一切都会正常工作(插入成功,没有表锁定)。

otl_stream o_stream;
std::string query = "INSERT INTO common VALUES (1,2,a:<int>);";
o_stream.open(1, query.c_str(), db_);
o_stream << 3;

这并不理想,因为理想情况下,如果没有必要,我想避免参数化/绑定。有什么建议么?

编辑:

下面回答

标签: c++sql-serverodbcotl

解决方案


来自 OTL 库的作者:

otl_streams 旨在被重用,也就是说,一个 INSERT 语句流需要至少有一个绑定变量才能“刷新”。对于有 0 个绑定变量的情况,有: http: //otl.sourceforge.net/otl3_const_sql.htm

该链接缺少所需的 db.commit() 调用。如果没有提交调用,表将被锁定。

问题中给出的示例的解决方案:

std::string query = "INSERT INTO common VALUES (1,2,3);";
db_.direct_exec(query.c_str());
db_.commit();

推荐阅读