【问题标题】:SQLiteCommand.ExecuteScalar returns SByte instead of long for INT8 columnSQLiteCommand.ExecuteScalar 为 INT8 列返回 SByte 而不是 long
【发布时间】:2018-01-25 17:53:30
【问题描述】:

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

为什么?

【问题讨论】:

  • 请重新阅读您输入的内容...实际上 int8 是一个字节,而 long 是 64 位...
  • 根据 sqlite docs INT8 很长。数字 8 表示字节,而不是位。也许答案在这里:link
  • 好吧,不。 C# 明智地检查INT8 这里也检查MSDN...
  • 你完全正确,在 C# 中它是 System.SByte 类型。但我想知道,如果我执行查询“ALTER TABLE a ADD COLUMN b INT8;”,将创建哪一列。 SQLiteApi 没有给出明确的答案,是 8 字节还是 8 位。我做了小实验。我插入了值“129”并尝试以不同的方式读取它。主要的魔力在于 SQLiteCommand.ExecuteScalar 将此值读取为 '-127'(System.SByte),而 SQLiteDataReader.GetLong 读取相同的字段为 '129'(System.Int64)。
  • 更新。 System.Data.SQLite.dll 来源的行:new SQLiteDbTypeMapping("INT8", DbType.SByte, false).

标签: c# sqlite system.data.sqlite


【解决方案1】:

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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多