c# - C# SQLite vs DataTable:“指定的转换无效。”
问题描述
我从 DataTable 行获取值时遇到问题。
这是查询:
SELECT COALESCE((FE1), 0) + COALESCE((FE2), 0) + COALESCE((FEE), 0)
FROM DRC
WHERE DTS = '2021-04-21T09:57:47+02:00'
在 DB Browser 中,它返回以下值:(-5700
如预期的那样)
使用不同的时间戳,它也可能导致 2 个小数的值,因此我决定在从 DataTable 中检索它时将其转换为十进制。
但是下面的代码会抛出一个错误
指定的演员表无效。
...
string dts = "2021-04-21T09:57:47+02:00"
decimal sum = 0;
query=$"SELECT COALESCE((FE1),0)+ COALESCE((FE2),0) + COALESCE((FEE),0) FROM DRC WHERE DTS = '{dts}'";
DataTable dt = new DataTable();
SQLiteCommand cmd = new SQLiteCommand(query, con);
SQLiteDataReader reader = cmd.ExecuteReader();
dt.Load(reader);
foreach (DataRow row in dt.Rows)
{
sum = row.Field<decimal>(0); // Exception: System.InvalidCastException: 'Specified cast is not valid.'
}
...
与例如。整数,双精度等类型它的结果相同。
解决方案
这是因为您正在执行原始读取,因此DataTable
将在底层 ORM 选择表示它们时键入返回值 - 在这种情况下可能是SQLiteDecimal
结构或类似的。
我不明白您为什么还要使用 aDataTable
虽然,因为您正在读取单个结果集的单行。直接消费SQLiteDataReader
即可:
using (var cmd = new SQLiteCommand(query, con))
{
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
sum = reader.GetDecimal(0);
}
}
}
推荐阅读
- bash - 从包含子字符串的文件中删除行
- python - 如何从 (1000, 1) 创建 (1000, 500) 数组并通过 n 值索引?
- java - HttpURLConnection 在 getResponseCode 处抛出 NullPointerException
- laravel - Laravel 嵌套急切加载和选择
- python - 在 Python 中获取 eBay restful 的最终用户令牌
- regex - Angular5:Validator.pattern 不适用于输入
- python - 快速访问 DataFrame 中的行子集
- c++ - 一组类型的显式实例化
- haskell - 具有类型构造函数的类型类定义的 Haskell 实例
- c++ - 虚拟表和对象切片