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 字段中。
这个值可以通过两种方式读取:
- SQLiteDataReader.GetInt64 直接读取值,不会丢失数据。
- SQLiteCommand.ExecuteScalar 初始获取字段类型,然后读取
具有指定转换的值。此操作可能会丢失数据。
在我的测试中,我将值“129”存储到 INT8 字段中。然后我尝试读取这个值。
- SQLiteDataReader.GetInt64 返回 '129' (System.Int64)。
- SQLiteCommand.ExecuteScalar 返回 '-127' (System.SByte).
我创建了 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 字段中。 这个值可以通过两种方式读取:
- SQLiteDataReader.GetInt64 直接读取值,不会丢失数据。
- SQLiteCommand.ExecuteScalar 初始获取字段类型,然后读取 具有指定转换的值。此操作可能会丢失数据。
在我的测试中,我将值“129”存储到 INT8 字段中。然后我尝试读取这个值。
- SQLiteDataReader.GetInt64 返回 '129' (System.Int64)。
- SQLiteCommand.ExecuteScalar 返回 '-127' (System.SByte).