我正在编写一个简单的应用程序来纠正存储在数据库中的二进制blob中的某个字节。我使用OTL将我的C ++程序连接到数据库。 读取数据和操作工作正常,但是当我想将其写回数据库时,程序就会死掉。
代码:
try
{
std::string updateQuery = "UPDATE tbtptemplates "
" SET tptemplate=:tp<BLOB> "
"WHERE afisid=:aid<INT>";
otl_long_string blob(&stp(), theSizeOfBlob);
blob.set_len(theSizeOfBlob);
otl_stream str(1, updateQuery.c_str(), theDbConnection);
str.set_lob_stream_mode(true);
str.set_commit(0);
otl_lob_stream lob;
lob.set_len(theSizeOfBlob);
str << lob;
str << theCurrentAfisId;
lob << blob;
lob.close();
}
catch (const otl_exception &oe)
{
std::cerr << oe.msg;
throw std::runtime_error("could not write to database");
}
我在Sourceforge发现了一个例子。
我创建了一个获取数据的otl_long_string。 然后我创建一个otl_stream并将SQL语句和数据库连接结合在一起。 我使用otl_lob_stream将二进制数据提供给otl_stream。 将blob数据流式传输到otl_stream可以正常工作。但是当我将id移交给流时,进程就会死掉。
这是杀手指令:
str << theCurrentAfisId;
这是我交出的一个简单的int-variable。 效果非常有趣:过程不会完全死亡,只有当前方法下面的调用堆栈消失了。 这是之前的调用堆栈:
Thread #1 [fix_stp] 10307 [core: 7] (Suspended : Breakpoint)
Drm::TPFixer::DatabaseConnector::writeDB() at DatabaseConnector.cpp:224 0x40b565
Drm::TPFixer::DatabaseConnector::fixImpressiontype() at DatabaseConnector.cpp:139 0x40b516
Drm::TPFixer::SuperTemplateManager::fixImpressiontype() at SuperTemplateManager.cpp:67 0x4074e3
main() at main.cpp:51 0x40477b
这是指令后的完整堆栈:
Thread #1 [fix_stp] 10307 [core: 7] (Running : Step)
Drm::TPFixer::DatabaseConnector::writeDB() at DatabaseConnector.cpp:240 0x40b6b2
我试图调试otl。似乎otl发现它已获得所有必需参数并开始运行。在那一刻它崩溃了。
我使用的环境:
- OTL 4.0
- CentOS Linux,内核3.10.0-327.22.2.el7.x86_64
- gcc-Version 4.8.5
- Oracle 11g
有人有想法吗?