SQLiteCommand.ExecuteScalar returns SByte 而不是 INT8 列的 long

SQLiteCommand.ExecuteScalar returns SByte instead of long for INT8 column

我创建了 table 列类型为 INT8。当我尝试使用 SQLiteCommand.ExecuteScalar(C#) 执行 select 查询时,它 returns SByte 而不是 long.

为什么?

System.Data.SQLite.dll 来源中的部分数据类型映射:

new SQLiteDbTypeMapping("INT8", DbType.SByte, false),
new SQLiteDbTypeMapping("INT16", DbType.Int16, false),
new SQLiteDbTypeMapping("INT32", DbType.Int32, false),
new SQLiteDbTypeMapping("INT64", DbType.Int64, false),
new SQLiteDbTypeMapping("INTEGER", DbType.Int64, true)

根据源代码 INT8 是 System.SByte。 事实上,SQLite 的 .Net API 允许将 INT64 值存储到 INT8 字段中。 这个值可以通过两种方式读取:

  1. SQLiteDataReader.GetInt64 直接读取值,不会丢失数据。
  2. SQLiteCommand.ExecuteScalar 初始获取字段类型,然后读取 具有指定转换的值。此操作可能会丢失数据。

在我的测试中,我将值“129”存储到 INT8 字段中。然后我尝试读取这个值。

  • SQLiteDataReader.GetInt64 返回 '129' (System.Int64)。
  • SQLiteCommand.ExecuteScalar 返回 '-127' (System.SByte).