在不绑定参数的情况下使用 OTL 库 (c++) 插入

Posted

技术标签:

【中文标题】在不绑定参数的情况下使用 OTL 库 (c++) 插入【英文标题】:Using OTL library (c++) to INSERT without binding parameters 【发布时间】:2021-07-07 21:33:49 【问题描述】:

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

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;

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

编辑:

下面回答

【问题讨论】:

听起来你有一个事务直到应用程序关闭才提交。大概你的 db_ 对象有事务处理方法来支持事务的使用。也许它还有一种方法可以将implicit_transaction 设置为off,这可能是一种替代方法。 【参考方案1】:

来自 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();

【讨论】:

以上是关于在不绑定参数的情况下使用 OTL 库 (c++) 插入的主要内容,如果未能解决你的问题,请参考以下文章

otl库(以前不知道有这个库,并且还可以在Unix下使用)

我可以在不使用gradle的情况下使用Xamarin.Android中的Android数据绑定库吗?不是MVVM for dotnet

我已经安装了 OpenCV C++。我可以在不重新安装库的情况下在 Python 中使用它的功能吗?

使用 C++ 定义接口(在不丢失基类的所有重载运算符的情况下派生)

OTL翻译 -- 说明

OTL4.0 otl_stream 绑定问题