SQLite ADO .NET和ExecuteScalar()

时间:2009-11-27 22:24:37

标签: sqlite

在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'?

2 个答案:

答案 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(...)