在SOCI的大多数示例中,调用者必须知道查询中的字段和类型,并通过soci::rowset<>
boost::tuple<>
或其他方式指定它们。
有没有办法在没有预先知道列的类型和数量的情况下编码,就像在SELECT * FROM ...
查询中一样?
如果是这样,你能发一个简短的例子吗?
答案 0 :(得分:3)
soci::rowset<soci::row>
正是您所需要的 - soci::row
提供动态绑定。
来自文档:
对于某些应用,希望能够从任意结构化的表中选择数据(例如,通过“select * from ...”),并根据其类型格式化结果数据。 SOCI通过soci :: row和soci :: column_properties类支持这一点。
见:
http://soci.sourceforge.net/doc/3.2/exchange.html#dynamic
http://soci.sourceforge.net/doc/3.2/statements.html#rowset
了解详情。
摘自文档:
例如,下面的代码从任意表中的选定数据行创建XML文档:
row r;
sql << "select * from some_table", into(r);
std::ostringstream doc;
doc << "<row>" << std::endl;
for(std::size_t i = 0; i != r.size(); ++i)
{
const column_properties & props = r.get_properties(i);
doc << '<' << props.get_name() << '>';
switch(props.get_data_type())
{
case dt_string:
doc << r.get<std::string>(i);
break;
case dt_double:
doc << r.get<double>(i);
break;
case dt_integer:
doc << r.get<int>(i);
break;
case dt_long_long:
doc << r.get<long long>(i);
break;
case dt_unsigned_long_long:
doc << r.get<unsigned long long>(i);
break;
case dt_date:
std::tm when = r.get<std::tm>(i);
doc << asctime(&when);
break;
}
doc << "</" << props.get_name() << '>' << std::endl;
}
doc << "</row>";
应传递给row :: get()的类型T参数取决于从column_properties :: get_data_type()返回的SOCI数据类型。
答案 1 :(得分:0)
我不相信有办法。可能因为'select *'通常被认为是危险的。列可以添加,重新排序等,您的查询现在已被破坏。保存你未来的一些调试并列出列。