我确实有一个代码结构,我从数据库中读取Oracle行,然后将其分配给代表其数据的公共模型(称为commonmodel::Model
)。 I'm使用Windows 7VS2012 Oracle unique_ptr崩溃的返回向量
我的问题是这段代码的下方,在那里我做执行一些语句像SELECT ...
I'm运行试验和表是空的,所以没有数据VS2012从SELECT...
.from数据库返回,因此while (resultSet->next())
中的代码片段未被调用。
我的程序编译,但它在运行时在returnin数据上崩溃(return retData
)。我不知道是什么导致了这种行为,我希望能够帮助解决这个问题。
顺便说一句:我选择为Oracle指针创建std::unique_ptr´s
,这样我就可以在编译器不需要任何模式时释放这些指针。在那个笏我不需要在操作结束时删除它们。
std::vector<std::unique_ptr<commonmodel::Model>> OracleDatabase::ExecuteStmtReturningData(std::string sql, int& totalRecords, commonmodel::Model &modelTemplate)
{
std::unique_ptr<oracle::occi::Statement> stmt(connection->createStatement());
stmt->setAutoCommit(TRUE);
std::unique_ptr<oracle::occi::ResultSet> res(stmt->executeQuery(sql));
std::vector<std::unique_ptr<commonmodel::Model>> ret = getModelsFromResultSet(res, modelTemplate);
return ret;
}
std::vector<std::unique_ptr<commonmodel::Model>> OracleDatabase::getModelsFromResultSet(std::unique_ptr<oracle::occi::ResultSet>& resultSet, commonmodel::Model &modelTemplate)
{
std::vector<std::unique_ptr<commonmodel::Model>> retData;
std::vector<oracle::occi::MetaData> resultMeta = resultSet->getColumnListMetaData();
while (resultSet->next())
{
std::unique_ptr<commonmodel::Model> model = modelTemplate.clone();
for (unsigned int i = 1; i <= resultMeta.size(); i++) // ResultSet starts with one, not zero
{
std::string label = resultMeta.at(i).getString(oracle::occi::MetaData::ATTR_NAME);
setPropertyFromResultSet(resultSet, label, i, *model);
}
retData.push_back(std::move(model)); // unique_ptr can only be copied or moved.
}
return retData; <<<==== CRASH ON RETURN....
}
是的。通过OCCI,您可以轻松地解决ABI稳定性问题。 Oracle不会重新编译它,只是因为它不再工作。对于纯OCI,使用任何开源包装更安全。 – ibre5041