在SQLite ADO .Net(sqlite.phxsoftware.com)中,ExecuteScalar()查询方法的文档读取:“执行命令并返回结果集第一行的第一列(如果存在),如果没有结果集,则返回null被送回了。“我创建了一个表:
create table users ( id integer primary key, name text )
使用ExecuteScalar()执行队列:
select ( id ) from users where name = @name
但是,非常奇怪 - 我不能将返回值转换为'int',只能'long'!为什么这样,'id'字段在数据库中定义为'integer',而不是'bigint'?
答案 0 :(得分:5)
这是因为SQLite“INTEGER PRIMARY KEYS”实际上不是整数,而是long(64位整数)。来自documentation:
每个SQLite表的每一行都有一个 64位有符号整数键 在同一张桌子里独一无二。这个 整数通常称为“rowid”。 rowid是用于的实际密钥 实现SQLite的B-Tree 表。行以rowid顺序存储。 可以使用访问rowid值 其中一个特殊名称“ROWID”, “OID”或“ ROWID ”。
如果声明一列是 INTEGER PRIMARY KEY,然后是那一列 不是“真正的”数据库列而是 而是成为。的别名 ROWID。与普通的SQLite列不同, rowid必须是非NULL整数 值。 rowid无法容纳 浮点值,字符串,BLOB, 或NULL。
INTEGER PRIMARY KEY列是 64位有符号整数的别名 ROWID。
这是SQLite dynamic typing mechanism的副作用。
在实践中,要回答您的问题,您应该检索该值,并尽可能使用它,如果可能的话,仅使用转换运算符或转换类(如果值适合32位)。因为它恰好是一个id,所以你不需要将它转换或转换为32位整数。
答案 1 :(得分:2)
我不熟悉SQLite,所以无法评论它的行为,但只要该值适合32位,这应该有效:
Convert.ToInt32(...)