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.'
}
...

使用例如integer、double等类型,结果相同。

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

我不明白你为什么要使用DataTable,因为你要读取一个结果集的一行。直接消耗SQLiteDataReader即可:

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

最新更新