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.timestamp
a はどこにありますか: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::Time
ptime
aを 1.1.1970 以降の秒数に変換します。REP_TIMESTAMP
このコードを使用して列に文字列を取得する方法がわかりません。