Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > soci bad_cast


Автор: Sahab 13.6.2011, 19:32
Делаю по доке:

Код

struct test {
    unsigned long long _ull;
    long long _longlong;
    double _double;
};

namespace soci
{
template<>
struct type_conversion<test>
{
    typedef values base_type;
    static void from_base(values const & v, indicator /* ind */, test & p)
    {
        p._ull = v.get<unsigned long long>("_ull");
        p._longlong = v.get<long long>("_longlong");
        p._double = v.get<double>("_double");
    }
    static void to_base(const test & p, values & v, indicator & ind)
    {
        v.set("_ull", p._ull);
        v.set("_longlong", p._longlong);
        v.set("_double", p._double);
        ind = i_ok;
    }
};
}

int main(int , char **)
{
    soci::session sql(soci::sqlite3, "dbname=test.db");
    test _test = { 64ULL, 32LL, 2.0d };
    soci::row r;

        try {
        sql << "insert into test (_ull, _longlong, _double) values(:_ull, :_longlong, :_double)", soci::use(_test);
                sql << "select * from test", into(r);
        std::ostringstream doc;
        doc << "<row>" << std::endl;
        for(std::size_t i = 0; i != r.size(); ++i)
        {
            const soci::column_properties & props = r.get_properties(i);

            doc << '<' << props.get_name() << '>';

            switch(props.get_data_type())
            {
            case soci::dt_string:
                doc << "std::string=" <<  r.get<std::string>(i);
                break;
            case soci::dt_double:
                doc << "double=" << r.get<double>(i);
                break;
            case soci::dt_integer:
                doc << "int=" << r.get<int>(i);
                break;
            case soci::dt_unsigned_long:
                doc << "unsigned long=" << r.get<unsigned long>(i);
                break;
            case soci::dt_long_long:
                doc << "long long=" << r.get<long long>(i);
                break;
            case soci::dt_unsigned_long_long:
                doc << "unsigned long long=" << r.get<unsigned long long>(i);
                break;
            case soci::dt_date:
                std::tm when = r.get<std::tm>(i);
                doc << "std::tm=" << asctime(&when);
                break;
            }

            doc << "</" << props.get_name() << '>' << std::endl;
        }
        doc << "</row>";

        std::cout << doc.str() << std::endl;

        sql << "select * from test", soci::into(_test);
        std::cout << _test._ull << std::endl;

    } catch (const std::exception& e) {
        std::cout << "[exception] " << e.what() << std::endl;
    }
    return 0;
}


в базе - INTEGER, REAL
при Загрузке из базы unsigned long long _ull; long long _longlong; определяются как int и бросается std::bad_cast

в чем проблема?

Автор: Sahab 14.6.2011, 16:07
Решение найдено, другим умным челом.
Необходимо было юзать другие типы sqlite 
Код

_ull UNSIGNED BIG INT, _longlong BIGINT, _double REAL

я же ориентировался http://www.sqlite.org/datatype3.html хотя и были помысли попробовать другие типы... (жаль что только помыслы)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)