我正在使用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 和适用于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”
任何人都知道如何解决这个问题?
答案 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 ...
这似乎可以解决这个问题。