首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >行的SOCI向量

行的SOCI向量
EN

Stack Overflow用户
提问于 2018-03-06 10:45:25
回答 1查看 699关注 0票数 0

我正试图从SOCI中得到一个行向量,但我似乎无法计算出来。

我需要一个函数从sql语句中返回行数据的向量。我认为正确的方法是:

代码语言:javascript
复制
vector<row> GetRows(string input)
{
    session sql(*soci::factory_odbc(), _connectionString);

    row r;
    statement st = (sql.prepare << input, into(r));
    st.execute();
    vector<row> rows;
    while (st.fetch())
    {
        rows.push_back(r);
    }
    return(rows);
}

这将不会编译。

我必须索引到行,我看不出如何工作。

更新:

我对C++没有那么多的时间,所以我最终使用了一个简单的解决方案:

代码语言:javascript
复制
typedef boost::variant<boost::blank, int, std::string, double, std::tm, long long, unsigned long long> tField;
typedef std::vector<tField> tRow;
typedef std::vector<tRow> tRows;

其中tField是boost::variant,行(tRow)是这些变量的向量。然后,数据集(tRows)是这些数据集的向量。

我最终得到的不是这么简单,而是工作上的孤独:

代码语言:javascript
复制
tRows DataAccess::spGetListenSample(const string input)
{
    session sql(*soci::factory_odbc(), _connectionString);

    rowset<row> rs = (sql.prepare << input);

    tRows rows;

    for (rowset<row>::const_iterator it = rs.begin(); it != rs.end(); ++it)
    {
        row const& r = *it;
        if (rows.size() == 0)
        {
            tRow record;
            for (std::size_t i = 0; i != r.size(); ++i)
            {
                const column_properties & props = r.get_properties(i);
                tField field = props.get_name();
                record.push_back(field);
            }
            rows.push_back(record);
        }
        tRow record;
        for (std::size_t i = 0; i != r.size(); ++i)
        {
            const column_properties & props = r.get_properties(i);
            tField field;
            if (r.get_indicator(i) != soci::i_null)
            {
                switch (props.get_data_type())
                {
                case dt_string:
                    field = r.get<std::string>(i);
                    break;
                case dt_double:
                    field = r.get<double>(i);
                    break;
                case dt_integer:
                    field = r.get<int>(i);
                    break;
                case dt_long_long:
                    field = r.get<long long>(i);
                    break;
                case dt_unsigned_long_long:
                    field = r.get<unsigned long long>(i);
                    break;
                case dt_date:
                    std::tm when = r.get<std::tm>(i);
                    field = asctime(&when);
                    break;
                }
            }
            record.push_back(field);
        }
        rows.push_back(record);
    }

    return(rows);
}
EN

回答 1

Stack Overflow用户

发布于 2018-03-06 12:07:07

您不能将push_back类型的soci::row值设置为std::vector,因为类soci::row被标记为SOCI_NOT_COPYABLE(row)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49128910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档