0

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

有没有办法在事先知道列的类型和数量的情况下进行编码,就像在SELECT * FROM ...查询中一样?

如果是这样,你能发布一个简短的例子吗?

4

2 回答 2

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 数据类型。

于 2012-10-31T09:14:35.000 回答
0

我不相信有办法。可能是因为“select *”通常被认为是危险的。可以添加、重新排序等列,您的查询现在已中断。为您未来的自己节省一些调试并列出列。

于 2012-10-31T01:30:48.443 回答