1

soci ライブラリを使用して sqlite3 データベースにアクセスします。

rowset<row> rs = (sql.prepare << "select * from my_table");
for (auto it = rs.begin(); it != rs.end(); ++it) {
    int some_value = it->get<int>(1);
    // ...
}

(これは私の実際のコードではありません。問題を説明するために非常に単純化されています。)

さて、ほとんどの場合、これでうまくいきます。ただし、行のインデックス 1 の値が int ではなく文字列である場合があります (std::bad_cast例外が発生します)。対応する列の SQL タイプは ですNUMERIC(8) NOT NULL。私はかなりのデバッグを行いましたが、行のエントリ数とその値は常に正しいようです。唯一の問題は、この 1 行の値が文字列である場合があることです。

これは、soci のバグであるか、私の側の誤った仮定である可能性があります。私の仮定は、列の返されるデータ型は常に同じであるということです。タイプの切り替えは、アプリケーションの 1 回の実行で発生する可能性があります。値は、1 つのクエリ結果では int であり、次のクエリ結果では文字列である可能性があります。

基になる sqlite3 API がわからないため、この問題が sqlite3 に起因するのか、soci に起因するのかさえわかりません。行の値の型を確認し、文字列の場合は int に変換します。しかし、これが予期された動作なのかバグなのかを知ることは重要です。誰かがこれについてコメントできますか?

編集:

新しい行は次のように挿入されます。

soci::session sql(Connetion::pool);
sql << "INSERT INTO " << NAME << " (REP_TIMESTAMP, REP_EVENT, REP_LTU_ID, REP_SEC_ID) VALUES (:timestamp, :event, :ltuId, :secId)",
        use (bo.timestamp),
        use (bo.event),
        use (bo.ltuId),
        use (bo.secId);

次のマッピングを持つbo.timestampa はどこにありますか:boost::posix_time::ptime

template<> struct type_conversion<boost::posix_time::ptime> {
    typedef long long base_type;
    static void from_base(const long long& t, indicator& i, boost::posix_time::ptime& target) {
        target = Helper::Time::timeFrom(t);
    }
    static void to_base(const boost::posix_time::ptime& d, long long& target, indicator& i) {
        target = Helper::Time::secondsSinceEpoch(d);
        i = i_ok;
    }
};

Helper::Timeptimeaを 1.1.1970 以降の秒数に変換します。REP_TIMESTAMPこのコードを使用して列に文字列を取得する方法がわかりません。

4

1 に答える 1