【问题标题】:Sqlite using Dapper. Error parsing column . Unable to cast object of type System.Int64 to type System.Double使用 Dapper 的 Sqlite。解析列时出错。无法将 System.Int64 类型的对象转换为 System.Double 类型
【发布时间】:2016-10-11 15:21:39
【问题描述】:

我正在使用 fastcrud 和 dapper 将我的查询结果映射到我的自定义类型。我调查了 dapper 库并得出结论,我认为这是 Microsoft.Data.Sqlite 包的问题。不确定它是否必须在那里修复,但这是问题所在。

在解析查询结果中的每一行之前,Dapper 使用 SqliteDataReader 类中的 GetFieldType 方法来获取正确的列类型。

想象一下下表:

Id | MinTemp | MaxTemp

1  | 10.5    | 18.2 

2  | 10.6    | 20 

sqlitedatareader.GetFieldType 方法将为您提供以下类型:

System.Int64 用于 Id,System.Double 用于 MinTemp 和 MaxTemp 这似乎是正确的,但是当它解析结果时,第 2 行会出现以下错误

解析第 10 列时出错 (MaxTemp=20 - Int64) 无法将“System.Int64”类型的对象转换为“System.Double”类型。

由于dynamic type system of SQLite,它将第 2 行的 MaxTemp 类型更改为 System.Int64。但是由于 dapper 将 MaxTemp 的类型定义为 double 会导致上面提到的错误。

如果我将 sqlite 数据库中的 MaxTemp 值更改为 20.00001,则问题已解决,但这是不正确的。

使用过的包: “Microsoft.Data.Sqlite”:“1.0.0”

有人知道如何解决这个问题吗?

【问题讨论】:

  • 我自己使用 Microsoft.Data.Sqlite 和 Dapper 遇到了类似的问题。我有一个定义为整数的 SQLite 列,但我的模型使用的是布尔值。现在,我重写了该特定查询以使用 SqliteConnection、SqliteCommand 和 SqliteDataReader。不是我最喜欢的,但比研究根本问题要快。
  • 看起来这是一个已知问题。 github.com/StackExchange/Dapper/issues/642
  • 刚刚在一个类似的例子中看到了同样的问题。第 2 行投掷。

标签: c# sqlite asp.net-core dapper


【解决方案1】:

这似乎是 Dapper 中的一个错误/缺陷:

https://github.com/StackExchange/Dapper/issues/642

由于 SQLite 使用值亲和性,因此示例第二行中的值 20 被视为 INT。 (即使它实际上插入为'20.0''20.00' 等)

显然 Dapper 无法单独处理每个字段返回的不同类型。

解决方法似乎是使用 SQL CAST()。示例:

SELECT CAST(field123 AS REAL) AS field123 FROM ...

这似乎绕过了这个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    相关资源
    最近更新 更多