我正在编写一个简单的应用程序来纠正存储在数据库中的二进制 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 变量。效果很搞笑:进程并没有完全死掉,只是当前方法下面的调用栈没了。这是语句之前的调用堆栈:
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
有人有想法吗?