对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的查询返回有符号的int16,但被定义为无符号

SQLite使用动态类型;列类型被忽略,返回值的类型仅取决于值本身。

使用PropertyType将值转换为正确的类型。