gpt4 book ai didi

SQLite ADO .NET 和 ExecuteScalar()

转载 作者:行者123 更新时间:2023-12-03 15:58:02 25 4
gpt4 key购买 nike

在 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”实际上不是整数,而是长整数(64 位整数)。来自documentation :

Every row of every SQLite table has a 64-bit signed integer key that is unique within the same table. This integer is usually called the "rowid". The rowid is the actual key used in the B-Tree that implements an SQLite table. Rows are stored in rowid order. The rowid value can be accessed using one of the special names "ROWID", "OID", or "ROWID".

If a column is declared to be an INTEGER PRIMARY KEY, then that column is not a "real" database column but instead becomes an alias for the rowid. Unlike normal SQLite columns, the rowid must be a non-NULL integer value. The rowid is not able to hold floating point values, strings, BLOBs, or NULLs.

An INTEGER PRIMARY KEY column is an alias for the 64-bit signed integer rowid.

这是 SQLite 的 dynamic typing mechanism 的副作用.

实际上,要回答您的问题,您应该检索尽可能长的值并尽可能使用它,如果该值适合 32 位,则仅使用转换运算符或 Convert 类。因为它恰好是一个 ID,所以您不需要将其转换或强制转换为 32 位整数。

关于SQLite ADO .NET 和 ExecuteScalar(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810829/

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