使用otl崩溃更新数据库blob

时间:2016-07-21 13:29:51

标签: c++ oracle otl

我正在编写一个简单的应用程序来纠正存储在数据库中的二进制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将二进制数据提供给o​​tl_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

有人有想法吗?

0 个答案:

没有答案