对于INT8列,SQLiteCommand.ExecuteScalar返回SByte而不是long

时间:2017-08-17 10:44:40

标签: c# sqlite system.data.sqlite

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

为什么?

1 个答案:

答案 0 :(得分:2)

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 for SQLite允许将INT64值存储到INT8字段中。 可以通过两种方式读取此值:

  1. SQLiteDataReader.GetInt64直接读取值而不会丢失数据。
  2. SQLiteCommand.ExecuteScalar intitialy获取字段类型,然后读取 指定强制转换的值。此操作可能会丢失数据。
  3. 在我的测试中,我存储了价值' 129'进入INT8领域。然后我试着读这个值。

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