Sqlite使用Dapper。解析列时出错。无法将System.Int64类型的对象强制转换为System.Double

时间:2016-10-11 15:21:40

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

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

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

想象一下下表:

Id | MinTemp | MaxTemp

1  | 10.5    | 18.2 

2  | 10.6    | 20 

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

适用于Id的

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

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

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

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

二手包: “ Microsoft.Data.Sqlite ”:“1.0.0”

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这似乎是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 ...

这似乎可以解决这个问题。