首页 > 解决方案 > 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.'
}
...

与例如。整数,双精度等类型它的结果相同。

标签: c#sqlite

解决方案


这是因为您正在执行原始读取,因此DataTable将在底层 ORM 选择表示它们时键入返回值 - 在这种情况下可能是SQLiteDecimal结构或类似的。

我不明白您为什么还要使用 aDataTable虽然,因为您正在读取单个结果集的单行。直接消费SQLiteDataReader即可:

using (var cmd = new SQLiteCommand(query, con))
{
    using (var reader = cmd.ExecuteReader())
    {
        if (reader.Read())
        {
            sum = reader.GetDecimal(0);
        }
    }
}

推荐阅读