gpt4 book ai didi

sqlite - soci 并不总是为 NUMERIC 列返回相同的类型

转载 作者:行者123 更新时间:2023-12-01 23:30:37 24 4
gpt4 key购买 nike

我使用 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。我做了一些调试,看起来行中的条目数及其值总是正确的。唯一的问题是这一行的值有时是一个字符串。

这可能是社会中的错误,也可能是我这边的错误假设。我的假设是列的返回数据类型始终相同。类型切换可能会在我的应用程序的一次运行中发生 - 一个查询结果中的值可能是一个 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 是具有以下映射的 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::Timeptime 转换为自 1970 年 1 月 1 日以来的秒数。我不明白如何使用此代码将字符串放入 REP_TIMESTAMP 列中。

最佳答案

SQLite 使用dynamic typing ;您为列声明的类型几乎没有影响。

您从数据库中获取了一个字符串值,因为您的程序将一个字符串值写入了数据库。如果要强制执行列类型,则必须添加单独的检查约束:

CREATE TABLE MyTable(
MyColumn INTEGER NOT NULL CHECK(typeof(MyColumn) = 'integer'),
...
)

关于sqlite - soci 并不总是为 NUMERIC 列返回相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17876028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com