在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'?
这是因为SQLite"INTEGER PRIMARY KEYS"实际上不是整数,而是long(64位整数).从文档:
每个SQLite表的每一行都有一个64位有符号整数键,在同一个表中是唯一的.这个整数通常称为"rowid".rowid是实现SQLite表的B-Tree中使用的实际键.行以rowid顺序存储.可以使用特殊名称"ROWID","OID"或" ROWID " 之一来访问rowid值.
如果一个列被声明为INTEGER PRIMARY KEY,那么该列不是"真正的"数据库列,而是成为rowid的别名.与普通的SQLite列不同,rowid必须是非NULL整数值.rowid无法保存浮点值,字符串,BLOB或NULL.
INTEGER PRIMARY KEY列是64位有符号整数rowid的别名.
这是SQLite 动态类型机制的副作用.
在实践中,要回答你的问题,你应该检索值,只要和使用它作为这样如果可能的话,只用铸造运营商或转换类,如果该值在32位相符.因为它恰好是一个id,所以您不需要将其转换或转换为32位整数.