对SQLite的查询返回有符号的int16,但被定义为无符号
本文关键字:定义 无符号 符号 查询 SQLite 返回 int16 | 更新日期: 2023-09-27 18:26:08
我正在使用SQLite for ADO.NET,确切地说是.NET v4.0二进制文件。
我在尝试根据数据库中摘录的内容填充类的数据时遇到了一个问题。
反射码:
var type = this.GetType();
var properties = type.GetProperties();
foreach(var property in properties)
{
property.SetValue(this, row[property.Name]);
}
然而,这引发了异常:
"System.Int64"类型的对象无法转换为"System.UInt16"类型。
它试图填充的值是ushort
在最初生成表的sql中,该列被定义为"UNSIGNED SMALLINT",据我所知,这应该与C#ushort相同。
创建SQL-
CREATE TABLE [Monsters]
(
[MonsterID] UNSIGNED SMALLINT NOT NULL UNIQUE,
[MonsterName] VARCHAR(50) NOT NULL,
[ElementMask] UNSIGNED TINYINT NOT NULL,
[Str] UNSIGNED TINYINT NOT NULL,
[Dex] UNSIGNED TINYINT NOT NULL,
[Int] UNSIGNED TINYINT NOT NULL,
[Con] UNSIGNED TINYINT NOT NULL,
[Spd] UNSIGNED TINYINT NOT NULL,
[ImageSetID] UNSIGNED SMALLINT NULL
)
删除"UNSIGNED"会引发此异常:
"System.Int16"类型的对象无法转换为"System.UInt16"类型。
考虑到有符号/无符号不匹配,这是预期的。
在调试模式下检查该行将显示所需的数据。https://i.stack.imgur.com/7Ayts.png
不太清楚发生了什么,所以如果有任何帮助,我们将不胜感激。
谢谢。
SQLite使用动态类型;列类型被忽略,返回值的类型仅取决于值本身。
使用PropertyType
将值转换为正确的类型。