繁体   English   中英

如何使用SOCI为SELECT *编码?

[英]How to code for SELECT * with SOCI?

在大多数关于SOCI的示例中,调用方必须知道查询中的字段和类型,并通过boost::tuple<>soci::rowset<> boost::tuple<>或通过其他某种方式来指定它们。

有没有一种方法可以像SELECT * FROM ...查询中那样事先知道列的类型和数量?

如果是这样,您可以举个简短的例子吗?

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()的Type T参数取决于从column_properties :: get_data_type()返回的SOCI数据类型。

我不相信有办法。 可能是因为“选择*”通常被认为是危险的。 可以添加列,重新排序等,现在查询已断开。 节省您将来的调试工作,并列出各列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM