mke*_*len 5 c# sqlite dapper asp.net-core
我正在使用 fastcrud 和 dapper 将我的查询结果映射到我的自定义类型。我调查了 dapper 库,得出的结论是,我认为这是 Microsoft.Data.Sqlite 包的问题。不确定是否必须在那里修复,但这就是问题所在。
在解析查询结果中的每一行之前,Dapper 使用 SqliteDataReader 类中的 GetFieldType 方法来获取正确的列类型。
想象一下下表:
Id | MinTemp | MaxTemp
1 | 10.5 | 18.2
2 | 10.6 | 20
Run Code Online (Sandbox Code Playgroud)
该sqlitedatareader.GetFieldType方法将为您提供以下类型:
System.Int64 for Id 和 System.Double for MinTemp 和 MaxTemp 这似乎是正确的,但是当它解析结果时,第 2 行发生以下错误
解析第 10 列时出错(MaxTemp=20 - Int64)无法将“System.Int64”类型的对象转换为“System.Double”类型。
由于SQLite的动态类型系统,它将第 2 行的 MaxTemp 类型更改为 System.Int64。但是因为 dapper 将 MaxTemp 的类型定义为 double 它会导致上面提到的错误。
如果我将 sqlite 数据库中的 MaxTemp 值更改为 20.00001,则问题已解决,但这不正确。
使用的包:“ Microsoft.Data.Sqlite ”:“1.0.0”
有谁知道如何解决这个问题?
这似乎是 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 ...
这似乎绕过了这个错误。
| 归档时间: |
|
| 查看次数: |
7399 次 |
| 最近记录: |