在不绑定参数的情况下使用 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++) 插入的主要内容,如果未能解决你的问题,请参考以下文章
我可以在不使用gradle的情况下使用Xamarin.Android中的Android数据绑定库吗?不是MVVM for dotnet
我已经安装了 OpenCV C++。我可以在不重新安装库的情况下在 Python 中使用它的功能吗?